Estou tentando tirar uma foto com a câmera, mas estou recebendo o seguinte erro:
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>
Eu estava pesquisando o dia inteiro sobre esse erro e tentando entender FileProvider
, mas não tenho idéia do que essa mensagem de erro tenta me dizer. Se você quiser mais informações / código, escreva-me no comentário.
android
android-fileprovider
Pivoman
fonte
fonte
Respostas:
Seu arquivo é armazenado em
getExternalFilesDir()
. Isso mapeia para<external-files-path>
, não<files-path>
. Além disso, o caminho do arquivo não contémimages/
, portanto opath
atributo no seu XML é inválido.Substitua
res/xml/file_paths.xml
por:ATUALIZAÇÃO 2020 13 DE MAR
Caminho do provedor para um caminho específico, como segue:
<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
fonte
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>
Foipath="."
o que descobri em minha própria pesquisa para permanecer no nível superior. Se você examinar o FileProvider mais de perto, verá que o caminho lido no XML é canônico. Meu melhor palpite é queContextCompat#getExternalFilesDirs
retornou null @line 616 (v26.0.1), portanto, um PathStrategy não foi registrado. Isso ocorreu no dispositivo Huawei.Isso pode resolver o problema de todos: todas as tags são adicionadas para que você não precise se preocupar com o caminho das pastas. Substitua res / xml / file_paths.xml por:
fonte
Problema semelhante após sabores ativados (dev, estágio).
Antes dos sabores, meu recurso de caminho era assim:
Depois de adicionado android: autoridades = "$ {applicationId} .fileprovider" no manifesto, o appId era pl.myapp.dev ou pl.myapp.stage depende do sabor e o aplicativo começou a falhar. Eu removi o caminho completo e o substituí por ponto e tudo começou a funcionar.
fonte
Se você estiver usando cache interno, use.
fonte
Perdeu 2 semanas tentando encontrar alguma solução ... Se você chegar aqui depois de tentar tudo acima:
1 - Verifique se o seu provedor de tags está dentro do aplicativo de tags
2 - Se você tentar muitos caminhos sem sucesso, teste com o seguinte:
Teste isso, se a câmera funcionar, comece a eliminar algumas linhas e continue testando ...
3 - Não esqueça de verificar se a câmera está ativada no seu emulador.
fonte
Tenho certeza de que estou atrasado para a festa, mas abaixo funcionou para mim.
fonte
Isso também me confunde um pouco.
O problema está no atributo "caminho" no seu arquivo xml.
A partir deste documento, o FileProvider 'path' é um subdiretório, mas em outro documento (câmera / photobasics) mostrado 'path' é o caminho completo.
Eu apenas mudei esse 'caminho' para o caminho completo e funcionou.
fonte
Estou atrasado, mas encontrei uma solução para ele. Funcionando bem para mim, acabei de alterar o arquivo XML de caminhos para:
fonte
provider_paths.xml
fornece um aviso de inspeção "O caminho raiz do elemento não é permitido aqui".Esteja ciente de que o caminho externo não está apontando para seu armazenamento secundário, também conhecido como "armazenamento removível" (apesar do nome "externo"). Se você está recebendo "Falha ao encontrar a raiz configurada", pode adicionar esta linha ao seu arquivo XML.
Veja mais detalhes aqui FileProvider e armazenamento externo secundário
fonte
Verifique quantos armazenamentos o seu dispositivo oferece - o compartilhamento de arquivos do armazenamento secundário não é suportado. Veja a
FileProvider.java
fonte (de support-core-utils 25.3.1 ):Portanto, eles levam apenas o primeiro armazenamento.
Além disso, você pode ver que
getExternalCacheDirs()
é usado para obter uma lista de armazenamentos por meio daContextCompat
interface. Consulte a documentação para seus limites (é dito para não reconhecer USB Flashes, por exemplo). O melhor é fazer alguma saída de depuração da lista de armazenamentos dessa API por conta própria, para que você possa verificar se o caminho para o armazenamento corresponde ao caminho passado para elegetUriForFile()
.Já existe um ticket atribuído (como em 06-2017) no rastreador de problemas do Google, solicitando suporte a mais de um armazenamento. Eventualmente, eu achei SO questão sobre isso também.
fonte
Passei 5 horas para isso ..
Eu tentei todos os métodos acima, mas isso depende do armazenamento do seu aplicativo atualmente em uso.
https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri
Verifique a documentação antes de tentar os códigos.
No meu caso, uma vez que o
files-path
subdiretório seráContext.getFilesDir()
. O interessante é queContext.getFilesDir()
observa um outro subdiretório.o que eu estou procurando é
data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png
retorna
/data/user/0/com.psh.mTest/files
então a tag deve ser
....
files-path name="app_imageDir" path="../app_imageDir/" ......
Então funciona !!
fonte
getExternalStorageDirectory()
e eu era suposto fornecer o caminho com<external-path>
tag em vez de<files-path>
Nada disso funcionou para mim. A única abordagem que funciona é não declarar um caminho explícito no xml. Então faça isso e seja feliz:
Aqui também há um excelente tutorial sobre esta questão: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s
fonte
Meu problema foi que eu tinha nomes sobrepostos nos caminhos dos arquivos para diferentes tipos, como este:
Depois de alterar os nomes ("cached_files") para serem exclusivos, me livrei do erro. Meu palpite é que esses caminhos são armazenados em algum HashMap ou em algo que não permita duplicatas.
fonte
O que eu fiz para resolver isso -
AndroidManifest.xml
filepaths.xml (permitindo que o FileProvider compartilhe todos os arquivos que estão dentro do diretório de arquivos externos do aplicativo)
e na classe java -
fonte
Isso funcionou para mim também. Em vez de dar o caminho completo, dei path = "Pictures" e funcionou bem.
fonte
Depende do tipo de armazenamento que você deseja fazer, INTERNO ou EXTERNO
para ARMAZENAMENTO EXTERNO
mas para ARMAZENAMENTO INTERNO, tenha cuidado com o caminho, porque ele usa o método getFilesDir (), o que significa que seu arquivo estará localizado no diretório raiz do aplicativo ("/")
Portanto, seu arquivo de provedor deve ser assim:
fonte
nenhuma das opções acima funcionou para mim, depois de algumas horas de depuração, descobri que o problema está
createImageFile()
, especificamenteabsolute path
vsrelative path
Suponho que vocês estejam usando o guia oficial do Android para tirar uma foto. https://developer.android.com/training/camera/photobasics
Tome nota do
storageDir
, este é o local onde o arquivo será criado. Portanto, para obter o caminho absoluto desse arquivo, eu simplesmente o usoimage.getAbsolutePath()
, se esseonActivityResult
for o caso da imagem Bitmap depois de tirar uma fotoabaixo é o
file_path.xml
, basta usar.
para que ele use o caminho absolutoe se você precisar do bitmap depois de tirar uma foto
fonte
Eu estava recebendo esse erro
Failed to find configured root that contains...
A solução alternativa a seguir resolve meu problema
res / xml / file_paths.xml
AndroidManifest.xml
ActivityClass.java
fonte
O documento oficial do Android diz que file_paths.xml deve ter:
fonte
A seguinte alteração no arquivo xml file_paths funcionou para mim.
fonte
1.Crie Xmlfile: provider_paths
2. Arquivo Mainfest
3. No seu arquivo Java.
fonte
Se nada ajudar e você está recebendo o erro
então tente mudar alguma linha como:
para:
e no arquivo xml:
o que é estranho, já que a pasta que eu acesso é
/images
.fonte
Meu problema estava errado Nome do arquivo : Eu crio
file_paths.xml
em res / xml enquanto o recurso foi definido comoprovider_paths.xml
Manifest:Mudei
provider_paths
parafile_paths
e problema resolvido.fonte
Se o caminho do seu arquivo for como / storage / emulated / 0 / "yourfile"
você só precisa modificar o XML do FileProvider
chame essa função quando precisar compartilhar arquivos
funciona no android M ~ Pie
fonte
Vejo que pelo menos você não está fornecendo o mesmo caminho que os outros em file_paths.xml. Portanto, forneça exatamente o mesmo nome ou caminho do pacote em 3 locais, incluindo:
android:authorities
atributo no manifestopath
atributo em file_paths.xmlauthority
argumento ao chamar FileProvider.getUriForFile ().fonte
Isso também pode resultar da não atualização dos pacotes de suporte ao segmentar o Android 7.1, 8.0+. Atualize-os para a v25.4.0.2 + e esse erro específico pode desaparecer (fornecendo o arquivo file_path configurado corretamente, conforme indicado por outros).
fonte
Percebi que a política ou o comportamento referente ao
path.xml
arquivo mudou entre a Biblioteca de suporte 26 e 27. Para capturar uma foto da câmera, vi as seguintes alterações:Com 26, eu tive que usar
<external-path>
e o caminho completo fornecido nopath
argumento.Com 27, tive que usar
<external-files-path>
e apenas a subpasta nopath
argumento.Então, o que funcionou especificamente para mim com a Biblioteca de suporte 27, como o
path.xml
arquivo erafonte
Olá amigos, tente isso
1) Como declarar 2 arquivos em manifesto.
2) Primeiro provedor para o download do arquivo
3) segundo provedor usado para câmera e galerias
PASSO 1
Provider_paths.xml
Segundo Fornecedor
file_path.xml
.Utils.MyFileProvider
Criar classe MyFileProvider (apenas a classe Criar, nenhum método declara)
Quando você utilizou o File Provider (.fileprovider), esse nome e a imagem (.provider), esse nome.
Se houver algum problema para entender esse código, entre em contato com [email protected].
fonte
O problema pode não ser apenas o caminho xml.
A seguir, minha correção:
Examinando o curso raiz em
android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile()
:Isso significa que
mRoots
deve conter a tag da uri solicitada. Então, escrevo um código para imprimirmRoots
e marcar uri e, em seguida, encontro facilmente as tags que não correspondem .Acontece que definir a autoridade do provedor como
${applicationID}.provider
uma ideia estúpida ! Essa autoridade é tão comum que pode ser usada por outros provedores, o que atrapalha a configuração do caminho!fonte
Você precisa alterar o arquivo xml file_paths.xml de
para
fonte