web-dev-qa-db-ja.com

Android:content:// URIを介してサードパーティアプリ(WhatsAppなど)から画像ビットマップを取得する

サードパーティのアプリ(WhatsAppなど)から私のアプリ(Marshmallowでテスト中)に画像を取得しようとしています。 WhatsAppから「画像を共有」してアプリと共有すると、次のようなURIが表示されます。

_content://com.whatsapp.provider.media/item/61025
_

しかし、私のアプリでは、上記のURIを使用してgetContentResolver().openInputStream(uri)またはgetContentResolver().openFileDescriptor(uri, "r")を呼び出すと、例外が発生してクラッシュします。

Java.lang.SecurityException:パーミッション拒否:uid 10083からエクスポートされていない、ProcessRecord {a4b804a 30321:com.myapp/u0a145}(pid = 30321、uid = 10145)からプロバイダーcom.whatsapp.MediaProviderを開く

これまでに試したこと

私はSOでこの例外を探しました 同様の質問 が見つかりましたが、Googleフォトから画像をインポートして、次のような権限を追加する必要があります:

_<uses-permission Android:name="com.google.Android.apps.photos.permission.GOOGLE_PHOTOS"/>_

しかし、多くのアプリがあり、それらのそれぞれまたは何のために許可を追加する必要があるかもしれないので、これには慣れていません。

他のいくつかの answers では、コンテンツプロバイダーからデータをすぐに読み取り/コピーすることが提案されています。しかし、その方法はわかりません。 openInputStream自体で例外が発生するためです。

WhatsAppイメージは他のアプリ(Googleドライブなど)と正常に共有できるため、これを行うにはいくつかの方法が必要であることについても言及する必要があります。

誰かがこれに関する共有のヒントや実用的な解決策を与えることができますか?

5
Atul

OK。問題のある場所を見つけました。私のアプリの最初のアクティビティでは、コンテンツURI(WhatsAppまたはChromeなどのサードパーティアプリから取得したもの)を保存していました。例:content://com.whatsapp.provider.media/item/61025 )配列で、他のアクティビティからアクセスしていた。

それは正しくなかった正しくなかった。 this の回答からヒントを得て、共有コンテンツを取得した直後に、アプリのランチャーアクティビティからgetContentResolver().openInputStream(uri)を直接呼び出しました。そして、それは機能し、例外をスローしませんでした。

3
Atul