Próbuję zrobić zdjęcie aparatem, ale pojawia się następujący błąd:
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>
Jawa:
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);
}
}
ścieżka_pliku.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="my_images" path="images/"/>
</paths>
Cały dzień szukałem informacji o tym błędzie i próbowałem zrozumieć FileProvider
, ale nie mam pojęcia, co ten komunikat o błędzie próbuje mi powiedzieć. Jeśli chcesz uzyskać więcej informacji / kodu, napisz do mnie w komentarzu.
android
android-fileprovider
Pivoman
źródło
źródło
Odpowiedzi:
Twój plik jest przechowywany pod
getExternalFilesDir()
. To odwzorowuje<external-files-path>
, nie<files-path>
. Ponadto ścieżka do plikuimages/
w nim nie zawiera , więcpath
atrybut w pliku XML jest nieprawidłowy.Zamień na
res/xml/file_paths.xml
:AKTUALIZACJA 2020 MAR 13
Ścieżka dostawcy dla określonej ścieżki w następujący sposób:
<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
źródło
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>
To,path="."
co znalazłem w moich własnych badaniach, by pozostać na najwyższym poziomie. Jeśli przejdziesz bliżej przez FileProvider, zobaczysz, że ścieżka odczytywana z XML zostaje sprowadzona do kanonu. Domyślam się, żeContextCompat#getExternalFilesDirs
zwróciło wartość null @ line 616 (v26.0.1), więc PathStrategy nie zostało zarejestrowane. Stało się to na urządzeniu Huawei.To może rozwiązać problem każdego: wszystkie tagi są dodawane, więc nie musisz się martwić o ścieżkę folderów. Zamień res / xml / file_paths.xml na:
źródło
Podobny problem występuje po włączeniu smaków (program, scena).
Przed smakami mój zasób ścieżki wyglądał tak:
Po dodaniu Androida: władze = "$ {applicationId} .fileprovider" w Manifeście appId to pl.myapp.dev lub pl.myapp.stage zależy od smaku i aplikacja zaczęła się zawieszać. Usunąłem pełną ścieżkę i zastąpiłem ją kropką i wszystko zaczęło działać.
źródło
Jeśli używasz wewnętrznej pamięci podręcznej, użyj.
źródło
Straciłem 2 tygodnie, próbując znaleźć rozwiązanie ... Jeśli przyjedziesz tutaj po wypróbowaniu czegoś powyżej:
1 - Sprawdź, czy Twój dostawca tagów znajduje się w aplikacji tagów
2 - Jeśli wypróbujesz wiele ścieżek bez powodzenia, przetestuj za pomocą:
Przetestuj to, jeśli kamera działa, a następnie zacznij eliminować niektóre linie i kontynuuj testowanie ...
3 - Nie zapomnij sprawdzić, czy kamera jest aktywowana w emulatorze.
źródło
Jestem pewien, że spóźniłem się na przyjęcie, ale poniżej działało dla mnie.
źródło
To też trochę mnie dezorientuje.
Problem dotyczy atrybutu „path” w pliku xml.
Z tego dokumentu FileProvider „ścieżka” jest podkatalogiem, ale w innym dokumencie (kamera / fotobazika) pokazana „ścieżka” jest pełną ścieżką.
Po prostu zmieniam tę „ścieżkę” na pełną i to po prostu działa.
źródło
Spóźnię się, ale znalazłem rozwiązanie tego problemu. Po prostu zmieniłem plik XML ścieżek na:
źródło
provider_paths.xml
daje ostrzeżenie z inspekcji „Ścieżka do elementu nie jest tutaj dozwolona”.Należy pamiętać, że ścieżka zewnętrzna nie wskazuje na pamięć dodatkową, czyli „pamięć wymienną” (pomimo nazwy „zewnętrzna”). Jeśli otrzymujesz komunikat „Nie można znaleźć skonfigurowanego katalogu głównego”, możesz dodać ten wiersz do pliku XML.
Zobacz więcej szczegółów tutaj FileProvider i dodatkowa pamięć zewnętrzna
źródło
Sprawdź, ile pamięci oferuje urządzenie - udostępnianie plików z pamięci dodatkowej nie jest obsługiwane. Spójrz na
FileProvider.java
źródło (z support-core-utils 25.3.1 ):Biorą więc tylko pierwsze miejsce do przechowywania.
Można również zobaczyć, że
getExternalCacheDirs()
służy do uzyskania listy magazynów za pośrednictwemContextCompat
interfejsu. Zobacz dokumentację jego limitów (na przykład nie rozpoznaje Flash USB). Najlepszym rozwiązaniem jest samodzielne wykonanie niektórych wyników debugowania listy magazynów z tego interfejsu API, aby można było sprawdzić, czy ścieżka do magazynu jest zgodna z przekazaną ścieżkągetUriForFile()
.W narzędziu do śledzenia problemów Google jest już przypisany bilet (jak na 06-2017) z prośbą o obsługę więcej niż jednego miejsca. W końcu znalazłem również SO pytanie w tej sprawie .
źródło
Spędziłem na to 5 godzin ..
Wypróbowałem wszystkie powyższe metody, ale zależy to od tego, jakiego magazynu używa Twoja aplikacja.
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri
Sprawdź dokumentację przed wypróbowaniem kodów.
W moim przypadku
files-path
będzie to podkatalogContext.getFilesDir()
. To jest funkyContext.getFilesDir()
, zauważa inny podkatalog.to czego szukam
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
zwroty
/data/user/0/com.psh.mTest/files
więc tag powinien być
…
files-path name="app_imageDir" path="../app_imageDir/" ......
To działa !!
źródło
getExternalStorageDirectory()
i powinienem podać ścieżkę ze<external-path>
znacznikiem zamiast<files-path>
Nic z tego nie działało dla mnie. Jedyne podejście, które działa, to nie deklarować wyraźnej ścieżki w xml. Zrób to i bądź szczęśliwy:
Tutaj również znajduje się doskonały samouczek na temat tego pytania: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s
źródło
Mój problem polegał na tym, że w ścieżkach plików zachodziły na siebie nazwy różnych typów, na przykład:
Po zmianie nazw („cached_files”) na unikalne, pozbyłem się błędu. Domyślam się, że te ścieżki są przechowywane w HashMap lub czymś, co nie pozwala na duplikaty.
źródło
Co zrobiłem, aby to rozwiązać -
AndroidManifest.xml
filepaths.xml (Zezwolenie FileProvider na udostępnianie wszystkich plików znajdujących się w katalogu plików zewnętrznych aplikacji)
oraz w klasie java -
źródło
Działa to również dla mnie. Zamiast podania pełnej ścieżki podałem path = "Pictures" i działało dobrze.
źródło
Zależy, jaki rodzaj pamięci chcesz zrobić, WEWNĘTRZNY lub ZEWNĘTRZNY
do PRZECHOWYWANIA ZEWNĘTRZNEGO
ale w przypadku PRZECHOWYWANIA WEWNĘTRZNEGO należy uważać na ścieżkę, ponieważ używa ona metody getFilesDir (), co oznacza, że plik będzie znajdować się w katalogu głównym aplikacji („/”)
Twój plik dostawcy musi być taki:
źródło
żadne z powyższych nie działało dla mnie, po kilku godzinach debugowania dowiedziałem się, że problem jest w
createImageFile()
szczególnościabsolute path
vsrelative path
Zakładam, że korzystacie z oficjalnego przewodnika na Androida do robienia zdjęć. https://developer.android.com/training/camera/photobasics
Zwróć uwagę na to
storageDir
, gdzie zostanie utworzony plik. Aby uzyskać bezwzględną ścieżkę do tego pliku, po prostu używamimage.getAbsolutePath()
tej ścieżkionActivityResult
jeśli potrzebujesz obrazu bitmapowego po zrobieniu zdjęciaponiżej jest
file_path.xml
, po prostu użyj,.
aby używał ścieżki bezwzględneja jeśli potrzebujesz mapy bitowej po zrobieniu zdjęcia
źródło
Otrzymałem ten błąd
Failed to find configured root that contains...
Poniższe obejście rozwiązuje mój problem
res / xml / ścieżka_pliku.xml
AndroidManifest.xml
ActivityClass.java
źródło
Oficjalny dokument Androida mówi, że file_paths.xml powinien mieć:
źródło
Dla mnie zadziałała następująca zmiana w pliku xml file_paths.
źródło
1. Utwórz plik Xml: ścieżka_ dostawcy
2. Plik Mainfest
3. W pliku Java.
źródło
Jeśli nic nie pomaga i pojawia się błąd
następnie spróbuj zmienić jakąś linię, np .:
do:
oraz w pliku xml:
co jest dziwne, ponieważ folder, do którego mam dostęp, to
/images
.źródło
Mój problem był nieprawidłowy Nazwa pliku : tworzę
file_paths.xml
w res / xml, gdy zasób był ustawiony naprovider_paths.xml
Manifest:Zmieniłem
provider_paths
sięfile_paths
i problem rozwiązany.źródło
Jeśli twoja ścieżka do pliku jest podobna do / storage / emulated / 0 / "yourfile"
wystarczy zmodyfikować plik XML FileProvider
następnie wywołaj tę funkcję, gdy potrzebujesz udostępnić plik
działa na Androidzie M ~ Pie
źródło
Widzę, że przynajmniej nie podajesz tej samej ścieżki, co inni w file_paths.xml. Upewnij się, że podałeś dokładnie taką samą nazwę paczki lub ścieżkę w 3 miejscach, w tym:
android:authorities
atrybut w manifeściepath
atrybut w pliku ścieżka_pliku.xmlauthority
argument podczas wywoływania funkcji FileProvider.getUriForFile ().źródło
Może to również wynikać z nieaktualizowania pakietów pomocy technicznej w przypadku systemu Android 7.1, 8.0+. Zaktualizuj je do wersji 25.4.0.2 +, a ten konkretny błąd może zniknąć (co oznacza, że poprawnie skonfigurowałeś plik file_path, jak twierdzą inni).
źródło
Zauważyłem, że zasady lub zachowanie dotyczące
path.xml
pliku zmieniły się między biblioteką pomocy 26 i 27. W przypadku przechwytywania obrazu z kamery widziałem następujące zmiany:Z 26 musiałem użyć
<external-path>
i pełną ścieżkę podaną wpath
argumencie.Mając 27, musiałem użyć
<external-files-path>
i tylko podfolder wpath
argumencie.Co konkretnie zadziałało dla mnie z biblioteką pomocy technicznej 27 w postaci
path.xml
plikuźródło
Cześć przyjaciele, spróbuj tego
1) Jak zadeklarować 2 dostawców plików w Manifeście.
2) Pierwszy dostawca pobierania plików
3) drugi dostawca używany do kamery i galerii
KROK 1
Provider_paths.xml
Drugi dostawca
ścieżka_pliku.xml
.Utils.MyFileProvider
Utwórz klasę MyFileProvider (tylko Utwórz klasę, żadna metoda nie deklaruje)
Kiedy używałeś dostawcy plików (.fileprovider), używałeś tej nazwy i używałeś obrazu (.provider).
JEŚLI ktokolwiek Problem ze zrozumieniem tego kodu Możesz skontaktować się z [email protected]. Pomogę ci.
źródło
Problemem może być nie tylko ścieżka xml.
Oto moja poprawka:
Patrząc na kurs root w
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()
:Oznacza to, że
mRoots
powinien zawierać znacznik żądanego URI. Piszę więc kod do wydrukowaniamRoots
i oznaczenia URI, a następnie łatwo znajduję, że znaczniki się nie zgadzają .Okazuje się, że ustawienie autorytetu dostawcy jako
${applicationID}.provider
głupi pomysł ! Ten autorytet jest tak powszechny, że może być używany przez innych dostawców, co zepsuje konfigurację ścieżki!źródło
Musisz zmienić plik xml ścieżka_pliku.xml z
do
źródło