2009-10-09 6 views
5

의 I는 사진 읽기위한 적절한의 InputStream을 얻기 위해, 이런 식으로 뭔가를 할 수있는 콘텐츠 공급자 소비자의 클라이언트 측 :콘텐츠 공급자로부터 메모리 매핑 된 InputStream을 반환 하시겠습니까?

InputStream is = getContentResolver().openInputStream(pictureUri); 

그것은 좋은 API, 그리고 것이다 서버 측에서 실제를 A와 전화 콘텐츠 제공자 결과 :

public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
    // Open a proper ParcelFileDescriptor, most likely using openFileHelper(uri, mode) 
} 

그러나 URI에 매핑 된 사진이 아닌 경우는 파일 시스템에서 발견되었지만 메모리 자원으로, 또는 즉석에서 생성합니다.

매핑 된 메모리를 File 또는 InputStream 또는 다른 것으로 만들면 콘텐츠 공급자에게 반환하기 위해 임시 파일을 디스크에 저장할 필요가 없습니다.

답변

1

이것은 어렵습니다. 은 Socket 인터페이스를 사용할 수있는 모든 것을 사용할 수 있습니다. 나는 그것을하지 않은, 그러나 이것은 나를 그렇게 생각 만드는 것입니다 : 당신이 기꺼이 있다면 ...

http://developer.android.com/reference/android/os/ParcelFileDescriptor.html#fromSocket(java.net.Socket)

그리고 소켓은, 이론적으로, 인터넷 자원 또는 대부분의 무엇이든 될 수있다 소켓 레벨에서 일하십시오. 아마도 임시 파일을 포기하고 만들 것입니다. 아마도 그것이 나를 겁쟁이로 만듭니다.

+0

합니다. 모든 종류의 원격 데이터를 읽기 위해'ContentResolver # openInputStream()'메소드를 일관되게 사용할 수 있기를 정말로 원합니다. 서버가 데이터를 생성/가져 오는 방법에 관계없이 서버 구현을 클라이언트에 노출시키지 않는 문제입니다. – PeyloW

+0

@PeyloW이 해결책을 찾았습니까? 나는 해결책을 찾고있다. – Sunny

+0

@Sunny 아무 것도 해킹되지 않습니다. 그래서 임시 파일을 저장하고 파일 설명자를 보냈습니다. – PeyloW

1

android-9부터는 ParcelFileDescriptor를 사용하여 파이프를 만들 수 있습니다. 당신은 최대 64k를 처리 할 수 ​​있습니다. 또는 읽은 후에 채우기 위해 다른 스레드를 설정할 수 있습니다. 자세한 내용 여기 답변을 참조하십시오 :하지만 내가하고 싶은대로 작동 할 수있는 솔루션이다

Custom ContentProvider - openInputStream(), openOutputStream()

관련 문제