web-dev-qa-db-fra.com

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

J'essaie de résoudre un problème après la nouvelle fonctionnalité ajoutée au 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;
}
69
JonathanNet

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 lien de parrainage mode strict et son expliqué tous les détails d'utilisation et techniques.

117
eranda.del

Pour sdk 24 et supérieur, si vous avez besoin d'obtenir l'URI d'un fichier en dehors de votre stockage d'application, vous avez cette erreur.
Les solutions @ eranda.del vous permettent de modifier la stratégie afin de permettre cela et que cela fonctionne correctement.

Toutefois, si vous souhaitez suivre les directives de Google sans avoir à modifier la stratégie de l’API de votre application, vous devez utiliser un FileProvider.

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

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", utilisez la même valeur que le second argument de la méthode getUriForFile () (app signature + ".provider"))

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

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