web-dev-qa-db-fra.com

Android: Obtenir l'image bitmap d'une application tierce (par exemple WhatsApp) via le contenu: // URI

J'essaie d'obtenir l'image d'une application tierce (par exemple WhatsApp) dans mon application (en cours de test sur Marshmallow). Lorsque je "partage l'image" de WhatsApp et la partage avec mon application, j'obtiens un URI comme ceci:

content://com.whatsapp.provider.media/item/61025

Mais dans mon application lorsque j'appelle getContentResolver().openInputStream(uri) ou getContentResolver().openFileDescriptor(uri, "r") avec l'URI ci-dessus, il se bloque à l'exception:

Java.lang.SecurityException: refus d'autorisation: ouverture du fournisseur com.whatsapp.MediaProvider à partir de ProcessRecord {a4b804a 30321: com.myapp/u0a145} (pid = 30321, uid = 10145) qui n'est pas exporté à partir de l'uid 10083

Ce que j'ai essayé jusqu'à présent

J'ai cherché cette exception sur SO et j'ai trouvé question similaire posé mais pour importer des images de Google Photos et j'ai eu besoin d'ajouter une autorisation comme:

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

Mais pas convaincu, car il pourrait y avoir de nombreuses applications et doit ajouter une autorisation pour chacune d'entre elles ou quoi.

Dans certains autres réponses il a été suggéré de lire/copier les données du fournisseur de contenu immédiatement. Mais je ne sais pas comment. Parce que je reçois une exception dans openInputStream lui-même.

Je dois également mentionner que l'image WhatsApp peut être partagée avec succès avec d'autres applications (par exemple, Google Drive), il doit donc y avoir un moyen de le faire.

S'il vous plaît quelqu'un peut-il donner des conseils de partage ou une solution de travail à ce sujet?

5
Atul

D'accord. J'ai trouvé où était le problème. Dans l'activité initiale de mon application, je stockais l'URI de contenu (que j'ai obtenu d'une application tierce comme WhatsApp ou Chrome etc. pour, par exemple, le contenu: //com.whatsapp.provider.media/item/61025 ) dans un tableau et y accédait depuis une autre activité.

Ce n'était pas correct. J'ai obtenu un indice de this answer et j'ai appelé getContentResolver().openInputStream(uri) directement à partir de l'activité de lancement de l'application immédiatement après avoir obtenu le contenu partagé. Et cela a fonctionné, n'a pas levé d'exception.

3
Atul