2009-10-09 7 views
5

私は絵を読み取るための適切なInputStreamを取得するには、このような何かを行うことができ、コンテンツプロバイダ、消費者のクライアント側:メモリにマップされたInputStreamをコンテンツプロバイダから返すか?

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

はそれは素敵なAPIである、とするサーバー側では、実際の呼び出しで、コンテンツプロバイダの結果:

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()

関連する問題