2017-09-22 4 views
0

J'ouvre l'appareil photo pour capturer une image et j'ai suivi this tutorial. Erreur indiquée dans le titre vient quand j'ai essayé de créer différentes configurations de saveur construit pour mon application.java.lang.IllegalArgumentException: Impossible de trouver la racine configurée qui contient "insérer le chemin du répertoire de l'application ici"

Ceci est mon fichier meta ressource XML de données nommée file_paths pour la configuration du chemin du fournisseur de fichiers -

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

Je suis en train en manifeste comme suit: -

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

et je suis chaîne de l'instanciation ressource nommée "images_file_path" à partir du fichier de construction gradle en fonction de la configuration de la construction comme ceci -

productFlavors { 
    dev { 
     resValue "string", "images_file_path","\"Android/data/com.swinguff.android.dev/files/Pictures\"" 
    } 
    prod { 
     resValue "string", "images_file_path","\"Android/data/com.swinguff.android/files/Pictures\"" 
    } 

et je lance la caméra dans mon activité comme celui-ci -

File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
      if (photoFile != null) { 
      /*Following line is throwing the error */ 
      profilePicUri = 
      FileProvider.getUriForFile(ApplicationContext.getAppContext(), 
         BuildConfig.AUTHORITY, 
         photoFile); 
       launchcamera(); 
       //Log.d("Musik","camera bug take photo"+photoFile+" "+mPhotoPathForCamera+" "+profilePicUri); 
      } 
     } catch (Exception ex) { 
      // Error occurred while creating the File 
      Log.d("CAMERA_BUG","exception "+ex.getMessage()+"\n"+BuildConfig.APPLICATION_ID+"\n"+BuildConfig.AUTHORITY 
       +"\n"+getString(R.string.images_file_path)); 
      Util.showSnackbar(xRoot,getString(R.string.camera__open_error)); 

     } 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    npath = image.getAbsolutePath(); 
    return image; 
} 

Même code ne provoque aucune exception quand je mets la valeur de chemin propriété dans les métadonnées ci-dessus ressource XML en tant que chaîne littérale et non par une valeur de chaîne de ressource.

Je ne comprends pas pourquoi cela se produit.

S'il vous plaît laissez-moi savoir si je peux expliquer mieux.S'il vous plaît aider et merci à l'avance.

+0

Vous pouvez simplement mettre fichier file_paths.xml dans les chemins de vos saveurs. Comme dev/main/src/res/xml/file_paths.xml et prod/main/src/res/xml/file_paths.xml. Et écrivez simplement le chemin complet sans utiliser la ressource de chaîne et la config resValue. –

+0

@Miller Merci beaucoup, votre solution fonctionne ..... mais je ne comprends toujours pas pourquoi elle n'est pas définie correctement par chaîne de ressources –

+0

En utilisant la ressource de chaîne, vous pouvez simplement remplacer cette ressource de chaîne dans votre chaîne.xml pour différentes saveurs. Pas besoin de section productFlavors dans la configuration de gradle. Je suppose que c'est une racine du problème, le compilateur ne peut pas utiliser gradle config pour décoder la valeur de la chaîne. –

Répondre

0

comme Miller a souligné dans les commentaires de la solution est de mettre le fichier de ressources XML de données méta file_paths.xml séparément pour chaque construction dans leur dossier correspondant (dev/res/xml ou prod/res/xml) et ensemble correspondant valeur de chemin directement dans le fichier xml et non par ressource de chaîne images_file_path

1
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<external-path name="external_files" path="."/> 
</paths> 

voir cette modifier vos chemins comme ce votre problème résoudront