2017-05-19 4 views
0

Caméra et galerie Recadrage n'est pas pris en charge dans Android nougat 7 lors de l'ouverture de la caméra dans Android nougat 7 Je reçois ce message d'erreur.Recadrage de l'appareil photo Android ne prenant pas en charge dans Nougat 7

android.os.FileUriExposedException:

fichier: ///storage/emulated/0/file1495176310055.jpg exposé au-delà de l'application par ClipData.Item.getUri()

+1

ce n'est pas un problème de récolte. Il y avait des changements dans le système d'accès aux fichiers dans Android 7. Vous devez implémenter votre fournisseur de contenu à partir de maintenant pour permettre à d'autres applications d'utiliser votre Uris fourni –

+0

'à travers app via ClipData.Item.getUri() 'Je me demande comment cela serait possible. – greenapps

+1

https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed – CommonsWare

Répondre

2

Pour les applications ciblant Android 7.0, le cadre Android applique la politique API StrictMode qui interdit d'exposer file:// URI en dehors de votre application. Si une intention contenant un fichier URI quitte votre application, l'application échoue avec une exception FileUriExposedException.

Pour partager des fichiers entre applications, vous devez envoyer un contenu: // URI et accorder une autorisation d'accès temporaire sur l'URI. Le moyen le plus simple d'accorder cette autorisation est d'utiliser la classe FileProvider.

Vous pouvez essayer ma solution ..

1.Add res/xml/provider_paths.xml

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

2.Ajoutez dans Manifest étiquette à l'intérieur

 <provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="android3.maxtingapp.provider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/provider_paths"/> 
    </provider> 

3.in votre activité ajouter funtion pour Crop Image comme ci-dessous mon échantillon

private void cropImage(File file) { 
     final int width = 400; 
     final int height = 200; 

    try { 
    Intent cropIntent = new Intent("com.android.camera.action.CROP"); 

    Uri contentUri; 

     if(Build.VERSION.SDK_INT > M){ 

      contentUri = FileProvider.getUriForFile(AddPlace.this, 
            "android3.maxtingapp.provider", 
            file);//package.provider 

      //TODO: Permission.. 

      getApplicationContext().grantUriPermission("com.android.camera", 
                 contentUri, 
      Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      cropIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      cropIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

     }else{ 

      contentUri = Uri.fromFile(file); 

     } 

     cropIntent.setDataAndType(contentUri, "image/*"); 
     cropIntent.putExtra("crop", "true"); 
     cropIntent.putExtra("aspectX", 2); 
     cropIntent.putExtra("aspectY", 1); 
     cropIntent.putExtra("outputX", width); 
     cropIntent.putExtra("outputY", height); 

     cropIntent.putExtra("return-data", true); 
     startActivityForResult(cropIntent, REQUEST_CROP_ICON); 

    }catch (ActivityNotFoundException a) { 
     Log.e("Activity Not Found",""+a.toString()); 
    } 
} 

J'espère que ce serait utile pour certainsOne ..