web-dev-qa-db-fra.com

FileUriExposedException sous Android

Je dois ouvrir un dossier dans la mémoire interne contenant des images.

J'utilise le code suivant.

Java

 File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),  "MyPhotos");
Intent intent = new Intent(Intent.ACTION_VIEW);
String path =folder.getPath();
Uri myImagesdir = Uri.parse("file://" + path );
intent.setDataAndType(myImagesdir,"*/*");   
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);

CHEMINS

 <paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
     <external-path name="images" path="Pictures" />
     <external-path name="external_files" path="."/>
     <external-path name="files_root" path="Android/data/${applicationId}"/> </paths>

Manifeste

  <provider
            Android:name="Android.support.v4.content.FileProvider"
            Android:authorities="com.example.Android.fileprovider"
            Android:exported="false"
            Android:grantUriPermissions="true">
            <meta-data
                Android:name="Android.support.FILE_PROVIDER_PATHS"
                Android:resource="@xml/file_paths" />
        </provider>

xml/chemin_fichier

<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <external-path name="images" path="Pictures" />
    <external-path name="external_files" path="."/>
    <external-path name="files_root" path="Android/data/${applicationId}"/>
</paths>

ERREUR

EXCEPTION FATALE: Processus principal: Android.apps.bnb.company.myphotos, PID: 22482 Android.os.FileUriExposedException: fichier: /// stockage/émulé/0/Images/MyPhotos exposés au-delà de l'application via Intent.getData ()

Existe-t-il un autre moyen d'ouvrir un dossier dans la mémoire interne? Merci!

MISE À JOUR # 1

Utilisation de cet article https://inthecheesefactory.com/blog/how-to-share-access-tofile-with-fileprovider-on-Android-nougat/fr j'ai remplacé 

Uri myImagesdir = Uri.parse("file://" + path );

avec 

 Uri myImagesdir = Uri.parse("content://" + path );

Et l'erreur disparue.

Quoi qu'il en soit, je dois toujours choisir l'application pour ouvrir ce dossier.

Est-il possible d'utiliser l'application My Files par défaut pour ouvrir certains dossiers?

7

J'ai trouvé la solution ici pouvons-nous ouvrir le dossier de téléchargement via. intention?

Ce code fonctionne parfaitement dans mon Samsung J7 pour ouvrir le dossier Images (et autres) à partir de la mémoire interne à l'aide de l'application par défaut Samsung Mes fichiers.

File path = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES);
Uri uri = Uri.fromFile(path);
Intent intent = getPackageManager().getLaunchIntentForPackage("com.sec.Android.app.myfiles");
intent.setAction("samsung.myfiles.intent.action.LAUNCH_MY_FILES");
                    intent.putExtra("samsung.myfiles.intent.extra.START_PATH", path.getAbsolutePath());
startActivity(intent);

Il semble que nous devons décompiler Gestionnaire de fichiers de chaque fabricant pour voir comment l'appeler correctement. :( Et c'est trop de travail. Eh bien ... j'ai supposé qu'il existe une solution générique pour le faire.

Le code ci-dessous est utilisé par moi pour ouvrir une image de Storage: 

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

File path = new File(Environment.getExternalStorageDirectory() + "/" + "ParentDirectory" + "/" + "ChildDirectory");

File filepath = new File(path + "/" + yourImageName.png);

Uri uri = Uri.fromFile(filepath);

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "image/jpeg");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Réponse modifiée: 

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

File path = new File(Environment.getExternalStorageDirectory() + "/" + "ParentDirectory" + "/" + "ChildDirectory");

Uri uri = Uri.fromFile(path);

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "image/jpeg");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
2
Shiva Snape