2

J'essaie d'obtenir l'image de l'application tierce (par exemple WhatsApp) à mon application (en cours de test sur Marshmallow). Quand je fais « image part » de WhatsApp et le partager avec mon application, je reçois URI quelque chose comme ceci:Android: Obtention d'image bitmap à partir d'une application tierce (par exemple WhatsApp) via le contenu: // URI

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

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

java.lang.SecurityException: Permission refusée: ouverture fournisseur com.whatsapp.MediaProvider de ProcessRecord {a4b804a 30321: com.myapp/u0a145} (pid = 30321, uid = 10145) qui ne sont pas exportés de uid 10083

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

Je regardai cette exception sur le SO et trouvé similar question posées, mais d'importer des images de Google Photos et nous avons obtenu ce besoin d'ajouter la permission comme:

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

Mais pas convié avec cela, car il pourrait y avoir beaucoup d'applications et besoin d'ajouter des autorisations pour chacun d'eux ou quoi.

Dans d'autres answers 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 aussi mentionner que l'image WhatsApp peut être partagée avec d'autres applications (par exemple Google Drive), donc il doit y avoir un moyen de le faire.

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

+0

Avez-vous la permission de lire à partir du stockage externe et vérifié pendant l'exécution? –

+0

ce fournisseur n'est pas exporté, seul un sous-ensemble limité de paquets peut y accéder (comme google drive) mais votre application n'est pas autorisée à le faire – pskink

+0

@Nabin oui j'ai la permission – Atul

Répondre

1

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

C'était pas correct. J'ai reçu un indice de this réponse et j'ai appelé getContentResolver().openInputStream(uri) directement à partir de l'activité lanceur de l'application immédiatement après avoir obtenu des contenus partagés. Et cela a fonctionné, n'a jeté aucune exception.

+0

pouvez-vous fournir un exemple de code pour obtenir le chemin fromcontent: //com.whatsapp.provider.media/item/45856 –

+0

n'essayez pas d'obtenir le chemin de l'URI Sa façon incorrecte de gérer les URI. Au lieu de cela, utilisez 'getContentResolver(). OpenInputStream (uri)' – Atul

+0

getContentResolver(). OpenInputStream (uri) ce que ça retourne ?? Je suis complètement confus –