Ich versuche, ein Bild mit der Kamera aufzunehmen, erhalte jedoch die folgende Fehlermeldung:
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>
Ich habe den ganzen Tag nach diesem Fehler gesucht und versucht zu verstehen FileProvider
, aber ich habe keine Ahnung, was diese Fehlermeldung mir zu sagen versucht. Wenn Sie weitere Informationen / Code wünschen, schreiben Sie mir in den Kommentar.
android
android-fileprovider
Pivoman
quelle
quelle
Antworten:
Ihre Datei wird unter gespeichert
getExternalFilesDir()
. Das passt<external-files-path>
nicht dazu<files-path>
. Außerdem enthält Ihr Dateipfad keinen Inhaltimages/
, sodass daspath
Attribut in Ihrem XML ungültig ist.Ersetzen
res/xml/file_paths.xml
durch:UPDATE 2020 13. März
Anbieterpfad für einen bestimmten Pfad wie folgt:
<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()
Ref: https://developer.android.com/reference/androidx/core/content/FileProvider
quelle
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>
Das habepath="."
ich in meiner eigenen Forschung gefunden, um auf der obersten Ebene zu bleiben. Wenn Sie FileProvider genauer durchgehen, werden Sie feststellen, dass der aus XML gelesene Pfad kanonisiert wird. IchContextCompat#getExternalFilesDirs
gehe davon aus, dass null @line 616 (v26.0.1) zurückgegeben wurde, sodass keine PathStrategy registriert wurde. Dies trat auf dem Huawei-Gerät auf.Dies kann das Problem aller lösen: Alle Tags werden hinzugefügt, sodass Sie sich nicht um den Ordnerpfad kümmern müssen. Ersetzen Sie res / xml / file_paths.xml durch:
quelle
Habe ein ähnliches Problem nach aktivierten Aromen (dev, stage).
Vor Aromen sah meine Pfadressource folgendermaßen aus:
Nach dem Hinzufügen von android: behörden = "$ {applicationId} .fileprovider" in Manifest appId war pl.myapp.dev oder pl.myapp.stage abhängig vom Geschmack und App stürzte ab. Ich entfernte den vollständigen Pfad und ersetzte ihn durch einen Punkt, und alles begann zu funktionieren.
quelle
Wenn Sie den internen Cache verwenden, verwenden Sie.
quelle
2 Wochen verloren, um eine Lösung zu finden ... Wenn Sie hier ankommen, nachdem Sie alles oben versucht haben:
1 - Überprüfen Sie, ob sich Ihr Tag-Anbieter in der Tag-Anwendung befindet
2 - Wenn Sie viele Pfade ohne Erfolg ausprobieren, testen Sie Folgendes:
Testen Sie dies, wenn die Kamera funktioniert, entfernen Sie einige Linien und fahren Sie mit dem Testen fort ...
3 - Vergessen Sie nicht zu überprüfen, ob die Kamera in Ihrem Emulator aktiviert ist.
quelle
Ich bin mir sicher, dass ich zu spät zur Party komme, aber unten hat es für mich funktioniert.
quelle
Das verwirrt mich auch ein bisschen.
Das Problem liegt im Attribut "Pfad" in Ihrer XML-Datei.
In diesem Dokument ist FileProvider 'Pfad' ein Unterverzeichnis, aber in einem anderen Dokument (Kamera / Fotobasik) wird 'Pfad' als vollständiger Pfad angezeigt.
Ich ändere einfach diesen 'Pfad' in den vollständigen Pfad und es funktioniert einfach.
quelle
Ich würde zu spät kommen, aber ich habe eine Lösung dafür gefunden. Ich habe gut funktioniert und nur die XML-Pfaddatei geändert in:
quelle
provider_paths.xml
gibt dies eine Inspektionswarnung "Element root-path ist hier nicht erlaubt".Beachten Sie, dass der externe Pfad nicht auf Ihren sekundären Speicher verweist, auch bekannt als "Wechselspeicher" (trotz des Namens "extern"). Wenn "Konfiguriertes Stammverzeichnis konnte nicht gefunden werden" angezeigt wird, können Sie diese Zeile zu Ihrer XML-Datei hinzufügen.
Weitere Details finden Sie hier FileProvider und sekundärer externer Speicher
quelle
Überprüfen Sie, wie viele Speicher Ihr Gerät anbietet. Die Freigabe von Dateien aus dem Sekundärspeicher wird nicht unterstützt. Schauen Sie sich die
FileProvider.java
Quelle an (von support-core-utils 25.3.1 ):Sie nehmen also nur den ersten Speicherplatz ein.
Sie können auch sehen, dass dies
getExternalCacheDirs()
verwendet wird, um eine Liste der Speicher über dieContextCompat
Schnittstelle abzurufen . Informationen zu den Grenzwerten finden Sie in der Dokumentation (z. B. werden USB-Flashes nicht erkannt). Am besten erstellen Sie selbst eine Debug-Ausgabe der Liste der Speicher dieser API, damit Sie überprüfen können, ob der Pfad zum Speicher mit dem übergebenen Pfad übereinstimmtgetUriForFile()
.Im Issue-Tracker von Google ist bereits ein Ticket zugewiesen (Stand 06-2017), mit dem Sie aufgefordert werden, mehr als einen Speicher zu unterstützen. Irgendwann fand ich auch SO eine Frage dazu.
quelle
Ich habe 5 Stunden dafür verbracht ..
Ich habe alle oben genannten Methoden ausprobiert, aber es hängt davon ab, welchen Speicher Ihre App derzeit verwendet.
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri
Überprüfen Sie die Dokumentation, bevor Sie die Codes ausprobieren.
In meinem Fall wird da
files-path
Unterverzeichnis seinContext.getFilesDir()
. Das Funky ist, dass es sichContext.getFilesDir()
gegenseitig ein Unterverzeichnis notiert.was ich suche ist
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
kehrt zurück
/data/user/0/com.psh.mTest/files
so sollte das tag sein
....
files-path name="app_imageDir" path="../app_imageDir/" ......
Dann funktioniert es !!
quelle
getExternalStorageDirectory()
und ich sollte den Pfad mit<external-path>
Tag anstelle von<files-path>
Nichts davon hat bei mir funktioniert. Der einzige Ansatz, der funktioniert, besteht darin, keinen expliziten Pfad in XML zu deklarieren. Also mach das und sei glücklich:
Auch hier finden Sie ein hervorragendes Tutorial zu dieser Frage: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s
quelle
Mein Problem war, dass ich überlappende Namen in den Dateipfaden für verschiedene Typen hatte, wie folgt:
Nachdem ich die Namen ("cached_files") so geändert hatte, dass sie eindeutig waren, wurde der Fehler behoben. Ich vermute, dass diese Pfade in einer HashMap gespeichert sind oder etwas, das keine Duplikate zulässt.
quelle
Was ich getan habe, um das zu lösen -
AndroidManifest.xml
filepaths.xml (Ermöglicht dem FileProvider, alle Dateien freizugeben, die sich im externen Dateiverzeichnis der App befinden.)
und in der Java-Klasse -
quelle
Dies funktionierte auch für mich. Anstatt den vollständigen Pfad anzugeben, gab ich path = "Pictures" und es funktionierte gut.
quelle
Es hängt davon ab, welche Art von Speicher Sie möchten, INTERN oder EXTERN
für EXTERNE LAGERUNG
Gehen Sie bei INTERNAL STORAGE jedoch vorsichtig mit dem Pfad um, da er die Methode getFilesDir () verwendet. Dies bedeutet, dass sich Ihre Datei im Stammverzeichnis der App befindet ("/").
Ihre Provider-Datei muss also folgendermaßen aussehen:
quelle
Keines der oben genannten Verfahren hat bei mir funktioniert. Nach ein paar Stunden Debugging stellte ich fest, dass das Problem vorliegt
createImageFile()
, insbesondereabsolute path
vs.relative path
Ich gehe davon aus, dass ihr den offiziellen Android-Leitfaden zum Fotografieren verwendet. https://developer.android.com/training/camera/photobasics
Beachten Sie
storageDir
, dass dies der Speicherort ist, an dem die Datei erstellt wird. Um den absoluten Pfad dieser Datei zu erhalten, verwende ich einfachimage.getAbsolutePath()
diesen Pfad,onActivityResult
wenn Sie das Bitmap-Bild nach dem Aufnehmen des Fotos benötigenunten ist das
file_path.xml
, einfach verwenden,.
damit es den absoluten Pfad verwendetund wenn Sie die Bitmap nach dem Fotografieren benötigen
quelle
Ich habe diesen Fehler erhalten
Failed to find configured root that contains...
Die folgende Problemumgehung behebt mein Problem
res / xml / file_paths.xml
AndroidManifest.xml
ActivityClass.java
quelle
Das offizielle Android-Dokument besagt, dass file_paths.xml Folgendes haben sollte:
quelle
Die folgende Änderung in der XML-Datei file_paths hat bei mir funktioniert.
quelle
1.Erstellen Sie eine XML-Datei: provider_paths
2. Mainfest-Datei
3.In Ihrer Java-Datei.
quelle
Wenn nichts hilft und Sie den Fehler erhalten
Versuchen Sie dann, eine Zeile wie folgt zu ändern:
zu:
und in der XML-Datei:
Das ist komisch, da der Ordner, auf den ich zugreife, ist
/images
.quelle
Mein Problem war der falsche Dateiname : Ich erstelle
file_paths.xml
unter res / xml, während die Ressourceprovider_paths.xml
in Manifest auf gesetzt wurde:Ich wechselte
provider_paths
zufile_paths
und Problem gelöst.quelle
Wenn Ihr Dateipfad / storage / emulated / 0 / "yourfile" lautet
Sie müssen nur Ihre FileProvider-XML ändern
Rufen Sie diese Funktion dann auf, wenn Sie eine Freigabedatei benötigen
es funktioniert auf Android M ~ Pie
quelle
Ich sehe, dass Sie zumindest nicht den gleichen Pfad wie andere in file_paths.xml angeben. Stellen Sie daher sicher, dass Sie an drei Stellen genau den gleichen Paketnamen oder Pfad angeben, einschließlich:
android:authorities
Attribut im Manifestpath
Attribut in file_paths.xmlauthority
Argument beim Aufruf von FileProvider.getUriForFile ().quelle
Dies kann auch darauf zurückzuführen sein, dass Ihre Support-Pakete bei der Ausrichtung auf Android 7.1, 8.0+ nicht aktualisiert wurden. Aktualisieren Sie sie auf v25.4.0.2 + und dieser spezielle Fehler kann verschwinden (vorausgesetzt, Sie haben Ihre file_path-Datei korrekt konfiguriert, wie andere angegeben haben).
quelle
Ich habe festgestellt, dass sich die Richtlinie oder das Verhalten in Bezug auf die
path.xml
Datei zwischen der Support-Bibliothek 26 und 27 geändert hat. Beim Aufnehmen eines Bildes von der Kamera wurden die folgenden Änderungen festgestellt :Mit 26 musste ich
<external-path>
den im Pfad angegebenen vollständigen Pfad verwendenpath
.Mit 27 musste ich
<external-files-path>
nur den Unterordner impath
Argument verwenden.Also, was speziell für mich mit Support Library 27 als
path.xml
Datei funktioniert hatquelle
Hallo Freunde, versuche das
1) Deklarieren von 2 Dateianbietern im Manifest.
2) Erster Anbieter für den Dateidownload
3) zweiter Anbieter für Kamera und Galerie
SCHRITT 1
Provider_paths.xml
Zweiter Anbieter
file_path.xml
.Utils.MyFileProvider
Klasse erstellen MyFileProvider (nur Klasse erstellen, keine Methode deklarieren)
Wenn Sie den Dateianbieter verwendet haben (.fileprovider), haben Sie diesen Namen verwendet und Sie haben ihn für das Bild (.provider) verwendet.
WENN jemand ein Problem hat, diesen Code zu verstehen Sie können sich unter [email protected] an mich wenden. Ich werde Ihnen helfen.
quelle
Das Problem ist möglicherweise nicht nur der Pfad xml.
Folgendes ist mein Fix:
Ein Blick in den Wurzelkurs in
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()
:Dies bedeutet,
mRoots
dass das Tag der angeforderten URL enthalten sein sollte. Also schreibe ich einen Code zum DruckenmRoots
und Markieren von Uri und finde dann leicht heraus, dass die Tags nicht übereinstimmen .Es stellt sich heraus, dass
${applicationID}.provider
es eine blöde Idee ist , die Autorität des Anbieters festzulegen ! Diese Berechtigung ist so häufig, dass sie möglicherweise von anderen Anbietern verwendet wird, wodurch die Pfadkonfiguration durcheinander gebracht wird!quelle
Sie müssen die XML-Datei file_paths.xml von ändern
zu
quelle