J'essaie de prendre une photo avec l'appareil photo, mais j'obtiens l'erreur suivante:
FATAL EXCEPTION: main
Process: com.example.marek.myapplication, PID: 6747
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.marek.myapplication/files/Pictures/JPEG_20170228_175633_470124220.jpg
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
at com.example.marek.myapplication.MainActivity.dispatchTakePictureIntent(MainActivity.java:56)
at com.example.marek.myapplication.MainActivity.access$100(MainActivity.java:22)
at com.example.marek.myapplication.MainActivity$1.onClick(MainActivity.java:35)
AndroidManifest.xml:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.marek.myapplication.fileprovider"
android:enabled="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
Java:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Toast.makeText(getApplicationContext(), "Error while saving picture.", Toast.LENGTH_LONG).show();
}
// Continue only if the File was successfully created
if (photoFile != null) {
Uri photoURI = FileProvider.getUriForFile(this,
"com.example.marek.myapplication.fileprovider",
photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="my_images" path="images/"/>
</paths>
Je cherchais toute la journée sur cette erreur et essayais de comprendre FileProvider
, mais je n'ai aucune idée de ce que ce message d'erreur essaie de me dire. Si vous voulez plus d'informations / code, écrivez-moi dans le commentaire.
android
android-fileprovider
Pivoman
la source
la source
Réponses:
Votre fichier est stocké sous
getExternalFilesDir()
. Cela correspond à<external-files-path>
, non<files-path>
. De plus, votre chemin de fichier ne contient pasimages/
dedans, donc l'path
attribut dans votre XML n'est pas valide.Remplacez
res/xml/file_paths.xml
par:MISE À JOUR 2020 13 MARS
Chemin du fournisseur pour un chemin spécifique comme suit:
<files-path/>
->Context.getFilesDir()
<cache-path/>
->Context.getCacheDir()
<external-path/>
->Environment.getExternalStorageDirectory()
<external-files-path/>
->Context.getExternalFilesDir(String)
<external-cache-path/>
->Context.getExternalCacheDir()
<external-media-path/>
->Context.getExternalMediaDirs()
Réf: https://developer.android.com/reference/androidx/core/content/FileProvider
la source
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>
C'estpath="."
ce que j'ai trouvé dans mes propres recherches pour rester au plus haut niveau. Si vous parcourez FileProvider de plus près, vous verrez que le chemin lu à partir de XML est canonisé. Ma meilleure supposition est queContextCompat#getExternalFilesDirs
retourné null @line 616 (v26.0.1), donc un PathStrategy n'a pas été enregistré. Cela s'est produit sur l'appareil Huawei.Cela peut résoudre le problème de tout le monde: toutes les balises sont ajoutées afin que vous n'ayez pas à vous soucier du chemin des dossiers. Remplacez res / xml / file_paths.xml par:
la source
Vous avez un problème similaire après avoir activé les saveurs (dev, stage).
Avant les saveurs, ma ressource de chemin ressemblait à ceci:
Après avoir ajouté android: autorités = "$ {applicationId} .fileprovider" dans Manifest appId était pl.myapp.dev ou pl.myapp.stage dépend de la saveur et l'application a commencé à planter. J'ai supprimé le chemin complet et l'ai remplacé par un point et tout a commencé à fonctionner.
la source
Si vous utilisez le cache interne, utilisez.
la source
J'ai perdu 2 semaines en essayant de trouver une solution ... Si vous arrivez ici après avoir essayé tout ce qui précède:
1 - Vérifiez si votre fournisseur de tag est dans l'application de tag
2 - Si vous essayez beaucoup de chemins sans succès, testez avec ceci:
Testez cela, si la caméra fonctionne, commencez à éliminer certaines lignes et continuez à tester ...
3 - N'oubliez pas de vérifier si la caméra est activée dans votre émulateur.
la source
Je suis sûr que je suis en retard à la fête, mais ci-dessous a fonctionné pour moi.
la source
Cela me déroute un peu aussi.
Le problème est sur l'attribut "path" dans votre fichier xml.
À partir de ce document FileProvider 'chemin' est un sous-répertoire, mais dans un autre document (appareil photo / photobasique) montré 'chemin' est chemin complet.
Je change simplement ce «chemin» en chemin complet et ça marche.
la source
Je serais en retard, mais j'ai trouvé une solution.Fonctionnant bien pour moi, je viens de changer le fichier XML des chemins en:
la source
provider_paths.xml
donne un avertissement d'inspection "L'élément root-path n'est pas autorisé ici".Sachez que external-path ne pointe pas vers votre stockage secondaire, alias "stockage amovible" (malgré le nom "externe"). Si vous obtenez "Impossible de trouver la racine configurée", vous pouvez ajouter cette ligne à votre fichier XML.
Voir plus de détails ici FileProvider et stockage externe secondaire
la source
Vérifiez le nombre de stockages offerts par votre appareil - le partage de fichiers à partir du stockage secondaire n'est pas pris en charge. Regardez la
FileProvider.java
source (de support-core-utils 25.3.1 ):Ainsi, ils ne prennent que le premier stockage.
En outre, vous pouvez voir qu'il
getExternalCacheDirs()
est utilisé pour obtenir la liste des stockages via l'ContextCompat
interface. Voir la documentation pour ses limites (on lui dit de ne pas reconnaître les flashs USB par exemple). Le mieux est de faire vous-même une sortie de débogage de la liste des stockages de cette API, afin que vous puissiez vérifier que le chemin d'accès au stockage correspond au chemin passégetUriForFile()
.Il y a déjà un ticket attribué (comme pour 06-2017) dans l'outil de suivi des problèmes de Google, demandant de prendre en charge plus d'un stockage. Finalement, j'ai aussi trouvé SO question à ce sujet .
la source
J'ai passé 5 heures pour ça ..
J'ai essayé toutes les méthodes ci-dessus, mais cela dépend du stockage que votre application utilise actuellement.
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri
Vérifiez la documentation avant d'essayer les codes.
Dans mon cas, puisque le
files-path
sous-répertoire seraContext.getFilesDir()
. Ce qui est génial, c'est qu'il seContext.getFilesDir()
note un sous-répertoire.ce que je cherche c'est
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
Retour
/data/user/0/com.psh.mTest/files
donc la balise doit être
....
files-path name="app_imageDir" path="../app_imageDir/" ......
Alors ça marche !!
la source
getExternalStorageDirectory()
et j'étais censé fournir le chemin avec une<external-path>
balise au lieu de<files-path>
Rien de tout cela n'a fonctionné pour moi. La seule approche qui fonctionne est de ne pas déclarer un chemin explicite en xml. Alors faites ceci et soyez heureux:
Ici aussi, un excellent tutoriel sur cette question: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s
la source
Mon problème était que j'avais des noms qui se chevauchaient dans les chemins de fichiers pour différents types, comme ceci:
Après avoir changé les noms ("cached_files") pour qu'ils soient uniques, je me suis débarrassé de l'erreur. Je suppose que ces chemins sont stockés dans un HashMap ou quelque chose qui n'autorise pas les doublons.
la source
Cela a également fonctionné pour moi.Au lieu de donner le chemin complet, j'ai donné path = "Pictures" et cela a bien fonctionné.
la source
Ce que j'ai fait pour résoudre ce problème -
AndroidManifest.xml
filepaths.xml (Autoriser FileProvider à partager tous les fichiers qui se trouvent dans le répertoire de fichiers externes de l'application)
et en classe java -
la source
Cela dépend du type de stockage que vous souhaitez faire, INTERNE ou EXTERNE
pour le STOCKAGE EXTERNE
mais pour le STOCKAGE INTERNE, soyez prudent avec le chemin, car il utilise la méthode getFilesDir () qui signifie que votre fichier sera situé dans le répertoire racine de l'application ("/")
Votre fichier fournisseur doit donc être comme ceci:
la source
rien de ce qui précède n'a fonctionné pour moi, après quelques heures de débogage, j'ai découvert que le problème était dans
createImageFile()
, spécifiquementabsolute path
vsrelative path
Je suppose que vous utilisez le guide Android officiel pour prendre des photos. https://developer.android.com/training/camera/photobasics
Prenez note de
storageDir
, c'est l'emplacement où le fichier sera créé. Donc, pour obtenir le chemin absolu de ce fichier, j'utilise simplementimage.getAbsolutePath()
, ce chemin sera utiliséonActivityResult
si vous avez besoin de l'image Bitmap après avoir pris une photoci-dessous est le
file_path.xml
, utilisez simplement.
pour qu'il utilise le chemin absoluet si vous avez besoin du bitmap après avoir pris une photo
la source
Je recevais cette erreur
Failed to find configured root that contains...
Le travail suivant résout mon problème
res / xml / file_paths.xml
AndroidManifest.xml
ActivityClass.java
la source
Le document officiel d'Android indique que file_paths.xml devrait avoir:
la source
Le changement suivant dans le fichier xml file_paths a fonctionné pour moi.
la source
1.Créez un fichier Xml: provider_paths
2. Fichier Mainfest
3.Dans votre fichier Java.
la source
Si rien ne vous aide et que vous obtenez l'erreur
puis essayez de changer une ligne comme:
à:
et dans le fichier xml:
ce qui est bizarre, car le dossier auquel j'accède est
/images
.la source
Mon problème était incorrect Nom du fichier : je
file_paths.xml
crée sous res / xml alors que la ressource était définieprovider_paths.xml
dans Manifest:J'ai changé
provider_paths
pourfile_paths
et le problème a été résolu.la source
Si votre chemin de fichier est comme / stockage / émulé / 0 / "votrefichier"
il vous suffit de modifier votre fichier XML FileProvider
puis appelez cette fonction lorsque vous avez besoin de partager un fichier
cela fonctionne sur android M ~ Pie
la source
Je vois qu'au moins vous ne fournissez pas le même chemin que les autres dans file_paths.xml. Veuillez donc vous assurer de fournir exactement le même nom de package ou le même chemin d'accès à 3 endroits, notamment:
android:authorities
attribut dans le manifestepath
attribut dans file_paths.xmlauthority
lors de l'appel de FileProvider.getUriForFile ().la source
Cela peut également être le résultat de la non-mise à jour de vos packages de support lors du ciblage d'Android 7.1, 8.0+. Mettez-les à jour vers v25.4.0.2 + et cette erreur particulière pourrait disparaître (en vous donnant configuré correctement votre fichier file_path comme d'autres l'ont indiqué).
la source
J'ai remarqué que la politique ou le comportement concernant le
path.xml
fichier a changé entre la bibliothèque de support 26 et 27. Pour capturer une image de l'appareil photo, j'ai vu les changements suivants:Avec 26, je devais utiliser
<external-path>
et le chemin complet donné dans l'path
argument.Avec 27, je devais utiliser
<external-files-path>
et seulement le sous-dossier dans l'path
argument.Donc, ce qui a fonctionné spécifiquement pour moi avec la bibliothèque de support 27 car le
path.xml
fichier étaitla source
Bonjour les amis Essayez ceci
1) Comment déclarer 2 fournisseur de fichiers dans le manifeste.
2) Premier fournisseur de téléchargement de fichiers
3) deuxième fournisseur utilisé pour la caméra et le gallary
ÉTAPE 1
Provider_paths.xml
Deuxième fournisseur
file_path.xml
.Utils.MyFileProvider
Create Class MyFileProvider (uniquement Create class no any method declare)
Lorsque vous avez utilisé File Provider, vous avez utilisé (.fileprovider) ce nom et vous avez utilisé pour l'image (.provider), vous l'avez utilisé.
SI n'importe quel problème pour comprendre ce code, vous pouvez contacter sur [email protected] je vais vous aider.
la source
Le problème n'est peut-être pas uniquement le chemin xml.
Voici ma solution:
Regarder le cours racine dans
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()
:Cela signifie que
mRoots
doit contenir la balise de l'uri demandé. J'écris donc du code pour imprimermRoots
et étiqueter uri, puis je trouve facilement que les étiquettes ne correspondent pas .Il s'avère que définir l'autorité du fournisseur
${applicationID}.provider
est une idée stupide ! Cette autorité est si courante qu'elle pourrait être utilisée par d'autres fournisseurs, ce qui gâcherait la configuration du chemin!la source
Vous devez changer le fichier xml file_paths.xml de
à
la source