Estoy tratando de tomar una foto con la cámara, pero recibo el siguiente error:
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>
Estuve buscando todo el día sobre este error e intenté entenderlo FileProvider
, pero no tengo idea de lo que este mensaje de error intenta decirme. Si quieres más información / código, escríbeme en el comentario.
android
android-fileprovider
Pivoman
fuente
fuente
Respuestas:
Su archivo está almacenado en
getExternalFilesDir()
. Eso se asigna a<external-files-path>
, no<files-path>
. Además, su ruta de archivo no contieneimages/
, por lo que elpath
atributo en su XML no es válido.Reemplazar
res/xml/file_paths.xml
con:ACTUALIZACIÓN 2020 MAR 13
Ruta del proveedor para una ruta específica de la siguiente manera:
<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
fuente
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>
Estopath="."
es lo que encontré en mi propia investigación para permanecer en el nivel superior. Si revisa FileProvider más de cerca, verá que la ruta leída desde XML se canoniza. Mi mejor conjetura es queContextCompat#getExternalFilesDirs
devolvió nulo @line 616 (v26.0.1), por lo que PathStrategy no estaba registrado. Esto ocurrió en el dispositivo Huawei.Esto puede resolver el problema de todos: se agregan todas las etiquetas para que no tenga que preocuparse por la ruta de las carpetas. Reemplace res / xml / file_paths.xml con:
fuente
Tengo un problema similar después de los sabores habilitados (dev, stage).
Antes de los sabores, mi recurso de ruta se veía así:
Después de agregar android: autoridades = "$ {applicationId} .fileprovider" en el Manifiesto appId fue pl.myapp.dev o pl.myapp.stage depende del sabor y la aplicación comenzó a fallar. Eliminé la ruta completa y la reemplacé con punto y todo comenzó a funcionar.
fuente
Si está utilizando caché interna, use.
fuente
Perdí 2 semanas tratando de encontrar alguna solución ... Si llegas aquí después de intentar todo lo anterior:
1 - Verifique si su proveedor de etiquetas está dentro de la aplicación de etiquetas
2 - Si intentas muchos caminos sin éxito, prueba con esto:
Pruebe esto, si la cámara funciona, luego comience a eliminar algunas líneas y continúe probando ...
3 - No olvide verificar si la cámara está activada en su emulador.
fuente
Estoy seguro de que llego tarde a la fiesta, pero a continuación funcionó para mí.
fuente
Esto me confunde un poco también.
El problema está en el atributo "ruta" en su archivo xml.
De este documento FileProvider 'ruta' es un subdirectorio, pero en otro documento (cámara / fotobásico) que se muestra 'ruta' es ruta completa.
Simplemente cambio esta 'ruta' a ruta completa y simplemente funciona.
fuente
Llegaría tarde, pero encontré una solución para eso. Trabajé bien para mí, solo cambié el archivo XML de rutas a:
fuente
provider_paths.xml
da una advertencia de inspección "La ruta raíz del elemento no está permitida aquí".Tenga en cuenta que la ruta externa no apunta a su almacenamiento secundario, también conocido como "almacenamiento extraíble" (a pesar del nombre "externo"). Si obtiene "Error al encontrar la raíz configurada", puede agregar esta línea a su archivo XML.
Ver más detalles aquí FileProvider y almacenamiento externo secundario
fuente
Compruebe cuántos almacenamientos ofrece su dispositivo: no se admite compartir archivos del almacenamiento secundario. Mire la
FileProvider.java
fuente (de support-core-utils 25.3.1 ):Entonces, toman solo el primer almacenamiento.
Además, puede ver que
getExternalCacheDirs()
se utiliza para obtener una lista de almacenamientos a través de laContextCompat
interfaz. Consulte la documentación para conocer sus límites (se le dice que no reconozca los flashes USB, por ejemplo). Lo mejor es hacer una salida de depuración de la lista de almacenamientos de esta API por su cuenta, para que pueda verificar que la ruta de almacenamiento coincida con la ruta pasadagetUriForFile()
.Ya hay un ticket asignado (para el período 06-2017) en el rastreador de problemas de Google, que solicita admitir más de un almacenamiento. Finalmente, encontré SO pregunta sobre esto también.
fuente
He pasado 5 horas para esto ...
He probado todos los métodos anteriores, pero depende de qué almacenamiento esté usando su aplicación actualmente.
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri
Consulte la documentación antes de probar los códigos.
En mi caso, ya que el
files-path
subdirectorio seráContext.getFilesDir()
. Lo funky es que seContext.getFilesDir()
nota uno al otro subdirectorio.lo que estoy buscando es
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
devoluciones
/data/user/0/com.psh.mTest/files
entonces la etiqueta debería ser
....
files-path name="app_imageDir" path="../app_imageDir/" ......
¡Entonces funciona!
fuente
getExternalStorageDirectory()
y se suponía que debía proporcionar la ruta con la<external-path>
etiqueta en lugar de<files-path>
Nada de esto funcionó para mí. El único enfoque que funciona es no declarar una ruta explícita en xml. Haz esto y sé feliz:
Aquí también tiene un excelente tutorial sobre esta pregunta: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s
fuente
Mi problema fue que tenía nombres superpuestos en las rutas de archivo para diferentes tipos, como este:
Después de cambiar los nombres ("cached_files") para que sean únicos, me deshice del error. Supongo que esas rutas se almacenan en algún HashMap o algo que no permite duplicados.
fuente
Lo que hice para resolver esto:
AndroidManifest.xml
filepaths.xml (Permitir que FileProvider comparta todos los archivos que están dentro del directorio de archivos externos de la aplicación)
y en clase java
fuente
Esto funcionó para mí también. En lugar de dar la ruta completa, di path = "Pictures" y funcionó bien.
fuente
Depende del tipo de almacenamiento que desee hacer, INTERNO o EXTERNO
para ALMACENAMIENTO EXTERNO
pero para ALMACENAMIENTO INTERNO, tenga cuidado con la ruta, ya que utiliza el método getFilesDir (), lo que significa que su archivo se ubicará en el directorio raíz de la aplicación ("/")
Entonces su archivo de proveedor debe ser así:
fuente
ninguna de las anteriores trabajado para mí, después de unas horas de depuración descubrí que el problema está en
createImageFile()
, específicamenteabsolute path
vsrelative path
Supongo que ustedes están usando la guía oficial de Android para tomar fotos. https://developer.android.com/training/camera/photobasics
Tome nota de que
storageDir
esta es la ubicación donde se creará el archivo. Entonces, para obtener la ruta absoluta de este archivo, simplemente usoimage.getAbsolutePath()
, esta ruta se usaráonActivityResult
si necesita la imagen de mapa de bits después de tomar la fotoa continuación está el
file_path.xml
, simplemente use.
para que use la ruta absolutay si necesitas el mapa de bits después de tomar una foto
fuente
Estaba recibiendo este error
Failed to find configured root that contains...
El siguiente trabajo soluciona mi problema
res / xml / file_paths.xml
AndroidManifest.xml
ActivityClass.java
fuente
El documento oficial de Android dice que file_paths.xml debería tener:
fuente
El siguiente cambio en el archivo xml file_paths funcionó para mí.
fuente
1.Cree Xmlfile: proveedor_rutas
2. archivo Mainfest
3.En su archivo Java.
fuente
Si nada ayuda y obtienes el error
luego intente cambiar alguna línea como:
a:
y en el archivo xml:
lo cual es extraño, ya que la carpeta a la que accedo es
/images
.fuente
Mi problema era un nombre de archivo incorrecto : creo
file_paths.xml
bajo res / xml mientras el recurso estaba configuradoprovider_paths.xml
en Manifiesto:He cambiado
provider_paths
afile_paths
y problema resuelto.fuente
Si su ruta de archivo es como / storage / emulated / 0 / "yourfile"
solo necesitas modificar tu FileProvider xml
luego llame a esta función cuando necesite compartir archivos
funciona en android M ~ Pie
fuente
Veo que al menos no está proporcionando la misma ruta que otros en file_paths.xml. Por lo tanto, asegúrese de proporcionar exactamente el mismo nombre de paquete o ruta en 3 lugares, incluidos:
android:authorities
atributo en manifiestopath
atributo en file_paths.xmlauthority
argumento al llamar a FileProvider.getUriForFile ().fuente
Esto también podría ser el resultado de no actualizar sus paquetes de soporte cuando apunta a Android 7.1, 8.0+. Actualícelos a v25.4.0.2 + y este error en particular podría desaparecer (si configuró su archivo file_path correctamente como lo indicaron otros).
fuente
Noté que la política o el comportamiento con respecto al
path.xml
archivo cambió entre Support Library 26 y 27. Para capturar una imagen de la cámara, vi los siguientes cambios:Con 26, tuve que usar
<external-path>
y la ruta completa dada en elpath
argumento.Con 27, tuve que usar
<external-files-path>
y solo la subcarpeta en elpath
argumento.Entonces, ¿qué funcionó específicamente para mí con Support Library 27 ya que el
path.xml
archivo erafuente
Hola amigos, intenta esto
1) Cómo declarar el proveedor de 2 archivos en manifiesto.
2) Primer proveedor de descarga de archivos
3) segundo proveedor utilizado para cámara y gallary
PASO 1
Provider_paths.xml
Segundo proveedor
file_path.xml
.Utils.MyFileProvider
Crear clase MyFileProvider (solo Crear clase sin ningún método declarar)
Cuando usó File Provider usó (.fileprovider) este nombre y usó para la imagen (.provider) usó esto.
Si hay algún problema para entender este código, puede contactar en [email protected], lo ayudaré.
fuente
El problema podría no ser solo la ruta xml.
Lo siguiente es mi solución:
Mirando el curso raíz en
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()
:Esto significa que
mRoots
debe contener la etiqueta de uri solicitada. Entonces escribo un código para imprimirmRoots
y una etiqueta de uri, y luego encuentro fácilmente que las etiquetas no coinciden .¡Resulta que establecer la autoridad del proveedor como
${applicationID}.provider
una idea estúpida ! Esta autoridad es tan común que podría ser utilizada por otros proveedores, lo que arruinará la configuración de la ruta.fuente
Debe cambiar el archivo xml file_paths.xml de
a
fuente