web-dev-qa-db-fra.com

FileUriExposedException utilisant Android 7

Lorsque j'essaie de capturer une image, j'ai cette erreur:

EXCEPTION FATALE: principale Android.os.FileUriExposedException: fichier: ///storage/emulated/0/fname_1498727381241.jpg exposé au-delà de l'application via ClipData.Item.getUri () sur Android.os.StrictMode.onFileUriExposed (StrictMode.Java:1799) sur Android.net.Uri.checkFileUriExposed (Uri.Java:2346) sur Android.content.ClipData.prepareToLeaveProcess (ClipData.Java:835) sur Android.content.Intent.prepareToLeaveProcess (Intent.Java:9514) sur Android.content. Intent.prepareToLeaveProcess (Intent.Java:9499) sur Android.app.Instrumentation.execStartActivity (Instrumentation.Java:1525) sur Android.app.Activity.startActivityForResult (Activity.Java:4403) sur Android.app.Activity.startActivityForResult .Java: 4362) sur opteamit.com.belami.CommuniquerPartagerPhotosActivity $ 1.onClick (CommuniquerPartagerPhotosActivity.Java:46) sur Android.view.View.performClick (View.Java:6261) sur Android.view.View $ PerformClick.run (Afficher .Java: 23752) sur Android.os.Handler.handleCallback (Handler.Java:751) sur Android.os.Handler.dispatchMessage (Hand ler.Java:95) sur Android.os.Looper.loop (Looper.Java:154) sur Android.app.ActivityThread.main (ActivityThread.Java:6776) sur Java.lang.reflect.Method.invoke (Native Method) sur com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.Java:1496) sur com.Android.internal.os.ZygoteInit.main (ZygoteInit.Java:1386)

Cela fonctionnait auparavant, mais il semble que le problème soit que j'utilise Android 7 (API 24).

Voici mon code:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "fname_" +
                        String.valueOf(System.currentTimeMillis()) + ".jpg"));
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
9
Jéwôm'

Si votre targetSdkVersion est de 24 ou plus, nous devons utiliser la classe FileProvider pour donner accès au fichier ou dossier particulier pour le rendre accessible à d'autres applications. Nous créons notre propre classe héritant de FileProvider afin de nous assurer que notre FileProvider n'entre pas en conflit avec les FileProviders déclarés dans les dépendances importées comme décrit ici.

Trouvez une discussion pertinente ici

Depuis Android 7, nous n'utilisons pas file: scheme comme uri à dessein, vous devez utiliser FileProvider.

6
Juvi

Eh bien, la bonne façon de le faire est d'utiliser FileProvider ( comme mentionné dans le développeur ). Mais j'ai trouvé une manière coquine de le faire sans ajouter FileProvider. C'est évidemment une solution de contournement mais cela fonctionne.

Dans votre activité, ajoutez les lignes suivantes:

 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
 StrictMode.setVmPolicy(builder.build());

Cela ignorera simplement l'exposition URI et vous obtiendrez l'accès.

Oui, je sais que ce n'est pas la meilleure pratique. Mais je voulais juste lui proposer une alternative.

Néanmoins, la méthode recommandée consiste à utiliser FileProvider.

20
Tushar Gogna