7

暗黙の意図ACTION_SENDを使用して、他のアプリケーションから自分のアプリケーションに画像を共有しようとしています。

Chrome ブラウザーから検索画像を共有している間、アプリは次のようなコンテンツ URI でインテントを受け取ります。 content://com.android.chrome.FileProvider/images/screenshot/1457448067808912906311.jpg

このタイプのコンテンツ URI からファイル パスを取得するにはどうすればよいですか? Facebook、Google+ などの他のすべてのアプリがそれを行っています。他のタイプのコンテンツ URI のファイル パスを取得するためにFileChooserを使用しています (例: ギャラリーから)。

多くの助けを借りずに、どこでも探してみました。誰かがこれらのコンテンツ URI を扱う方法を提案できますか?

4

2 に答える 2

5

ファイルのローカル コピーが絶対に必要な場合はInputStream、パスがわかっているローカル ファイルへのコンテンツのコピーを開いて、そこから移動する必要があります。補足: グアバByteStreams#copyはこれを実現する簡単な方法です。

もちろん、このファイルは元の Uri ソースによってサポートされていないため、これはあなたが望むものではないと思います。代わりに、Uri の意図した API を使用する必要があります。ストレージ アクセス フレームワークを見てみましょう

編集

を取得する方法は次のとおりですInputStreamUri

InputStream inputStream = getContentResolver().openInputStream(uri);
于 2016-03-08T15:23:46.380 に答える
4

このタイプのコンテンツ URI からファイル パスを取得するにはどうすればよいですか?

の背後にファイルが存在する必要はまったくないため、アクセスできるファイルは言うまでもなく、そうする必要はありませんUri。それUriは次のことを示している可能性があります。

  • 外部ストレージ上のローカル ファイル
  • 他のアプリ用の内部ストレージ上のローカル ファイル
  • リムーバブル ストレージ上のローカル ファイル
  • 暗号化され、その場で復号化する必要があるローカル ファイル
  • BLOBデータベースの列に保持されるバイトのストリーム
  • A piece of content that needs to be downloaded by the other app first
  • ...and so on

All other apps like Facebook, Google+ are doing it

No, they are not. They are using ContentResolver and:

  • openInputStream() to read in the bytes associated with the content
  • getType() to get the MIME type associated with the content
  • query() and the OpenableColumns to get the size and display name associated with the content
于 2016-03-08T15:08:23.517 に答える