146 votes

exposé au-delà de l'application via ClipData.Item.getUri

J'essaie de résoudre un problème après l'ajout de la nouvelle fonctionnalité dans le système de fichiers Android, mais le message d'erreur suivant s'affiche:

 android.os.FileUriExposedException: file:///storage/emulated/0/MyApp/Camera_20180105_172234.jpg exposed beyond app through ClipData.Item.getUri()
 

J'espère donc que quelqu'un pourra m'aider à résoudre ce problème :)

Merci

 private Uri getTempUri() {
    // Create an image file name
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
    String dt = sdf.format(new Date());
    imageFile = null;
    imageFile = new File(Environment.getExternalStorageDirectory()
            + "/MyApp/", "Camera_" + dt + ".jpg");
    AppLog.Log(
            TAG,
            "New Camera Image Path:- "
                    + Environment.getExternalStorageDirectory()
                    + "/MyApp/" + "Camera_" + dt + ".jpg");
    File file = new File(Environment.getExternalStorageDirectory() + "/MyApp");
    if (!file.exists()) {
        file.mkdir();
    }
    imagePath = Environment.getExternalStorageDirectory() + "/MyApp/"
            + "Camera_" + dt + ".jpg";
    imageUri = Uri.fromFile(imageFile);
    return imageUri;
}
 

265voto

Brendon Points 1165

Pour sdk 24 et, si vous avez besoin pour obtenir l'Uri d'un fichier en dehors de votre application de stockage que vous avez cette erreur.
@eranda.del solutions vous permettent de changer la politique pour permettre cela, et il fonctionne très bien.

Toutefois, si vous voulez suivre le google ligne directrice, sans avoir à changer l'API de la politique de votre application, vous devez utiliser un FileProvider.

Au premier abord pour obtenir l'URI d'un fichier, vous devez utiliser FileProvider.getUriForFile() la méthode:

Uri imageUri = FileProvider.getUriForFile(
            MainActivity.this,
            "com.example.homefolder.example.provider", //(use your app signature + ".provider" )
            imageFile);

Ensuite, vous devez configurer votre fournisseur dans votre manifeste android :

<application>
  ...
     <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.homefolder.example.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <!-- ressource file to create -->
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths">  
        </meta-data>
    </provider>
</application>

(Dans "autorités" utiliser la même valeur que le deuxième argument de la getUriForFile (), méthode (app signature + ".le fournisseur"))

Et enfin, vous devez créer le fichier de ressources: "file_paths". Ce fichier doit être créé dans le cadre du res/xml répertoire (vous avez probablement besoin de créer ce répertoire trop) :

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>

175voto

user1823043 Points 1

Ajoutez le bloc de code suivant avant de commencer la navigation dans l'appareil photo ou dans les fichiers

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

S'il vous plaît se référer au mode strict de lien de référence et son expliqué tous les détails d'utilisation et techniques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X