web-dev-qa-db-fra.com

Vous utilisez des données de fournisseurs de contexte ou vous demandez l'autorisation de lecture de Google Photos?

Mon application permet aux utilisateurs d'importer leurs photos et vidéos à partir d'autres applications. Maintenant que Google a remplacé Google+ Photos par Google Photos, deux choses ont éclaté pour moi. L'une de ces choses consiste à réutiliser les fichiers importés après le redémarrage de l'application. J'ai le sentiment qu'ils ont resserré les autorisations accordées lorsque Google Photos renvoie l'intention avec l'URI de l'image, donc après que mon application a été tuée, elle n'a plus la permission d'accéder au fichier téléchargé. Je reçois l'attente de sécurité:

Java.lang.SecurityException: Permission Denial: opening provider com.google.Android.apps.photos.contentprovider.MediaContentProvider from ProcessRecord{2c17ab9e 2124:com.myapp.myapp/u0a436} (pid=2124, uid=10436) that is not exported from uid 10427

ÉDITER:

Je reçois également le même problème avec la réutilisation des fichiers fournis par com.google.Android.apps.docs.sync.filemanager.FileProvider

Des suggestions/solution? Je sais que je peux lire le fichier avant de perdre l'autorisation, donc en théorie je pourrais le copier mais je ne peux pas dire que j'aime beaucoup ça ..

22
vkislicins

Oui, c'est par conception, comme décrit sur site des développeurs Android .

Pour des raisons de sécurité, les autorisations sont temporaires. Par conséquent, une fois la pile de tâches de l'application cliente terminée, le fichier n'est plus accessible. Vous devez obtenir les données du fichier lorsque vous recevez la réponse d'intention, dans la méthode onActivityResult. Stockez une copie des données du fichier, car le fichier ne sera plus disponible lorsque onActivityResult reviendra.

21
Dazzibao
  1. Vous pouvez reproduire ce journal SecurityException lorsque vous utilisez l'application "Google Photo".

  2. La principale cause de ce problème est "Google Photo" partage ContentUri avec une chaîne fixe comme "content: //com.google.Android.apps.photos.contentprovider/1/1" et le connecte avec des valeurs temporaires statiques. "Google Photo" ne fournit pas le chemin du fichier lorsque l'activité ou le contexte réel qui reçoit Intent.ACTION_SEND. Peut-être, c'est la politique de "Google Photo", de ne pas exposer le fichier d'image privé à une autre application.

  3. Par exemple, vous définissez 2 Activity dans le fichier manifeste, Actvity A et Activity B. L'activité A pour reçoit Intent.ACTION_SEND. Activité B pour le traitement du fichier image. L'activité A transmet l'intention à l'activité B. Ensuite, l'activité B n'est pas l'activité correcte à "Google Photo", vous rencontrez la SecurityException.

Donc, je vous recommande de sauvegarder le fichier temporairement sur l'activité A et d'utiliser le chemin du fichier temporaire sur l'activité B

9
BlueMist

vous pouvez peut-être essayer d'ajouter cette autorisation utilisateur dans votre fichier manifeste.

<uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES" />
3
Zephyr

Vous devez définir explicitement les autorisations pour que tous les packages correspondent à votre intention. Cela se produit généralement dans Android 4.4.

vous pouvez utiliser cet utilitaire pour le faire:

List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            getContext().grantUriPermission(packageName, imageFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
1
Maher Abuthraa

On dirait que this la question est simulaire

Je pense que lorsque l'activité (pas un fragment) meurt - tout l'URI récupéré devient invalidé

J'ai également le même problème - essayer de télécharger une image en arrière-plan. Mais l'utilisateur dans le thread d'interface utilisateur peut changer d'activité et l'URI devient invalide

1
Art
0
jtxyz0804