Estou tentando corrigir um problema após o novo recurso adicionado ao sistema de arquivos Android, mas recebo este erro:
android.os.FileUriExposedException: file:///storage/emulated/0/MyApp/Camera_20180105_172234.jpg exposed beyond app through ClipData.Item.getUri()
Espero que alguém possa me ajudar a consertar isso :)
obrigado
private Uri getTempUri() {
// Create an image file name
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String dt = sdf.format(new Date());
imageFile = null;
imageFile = new File(Environment.getExternalStorageDirectory()
+ "/MyApp/", "Camera_" + dt + ".jpg");
AppLog.Log(
TAG,
"New Camera Image Path:- "
+ Environment.getExternalStorageDirectory()
+ "/MyApp/" + "Camera_" + dt + ".jpg");
File file = new File(Environment.getExternalStorageDirectory() + "/MyApp");
if (!file.exists()) {
file.mkdir();
}
imagePath = Environment.getExternalStorageDirectory() + "/MyApp/"
+ "Camera_" + dt + ".jpg";
imageUri = Uri.fromFile(imageFile);
return imageUri;
}
Respostas:
Para sdk 24 e superior, se você precisar obter o Uri de um arquivo fora do armazenamento do aplicativo, você terá este erro.
As soluções @eranda.del permitem que você altere a política para permitir isso e funciona bem.
No entanto, se você deseja seguir as diretrizes do Google sem ter que alterar a política de API do seu aplicativo, você deve usar um FileProvider.
A princípio, para obter o URI de um arquivo, você precisa usar o método FileProvider.getUriForFile ():
Em seguida, você precisa configurar seu provedor no manifesto do Android:
(Em "autoridades", use o mesmo valor que o segundo argumento do método getUriForFile () (assinatura do aplicativo + ".provider"))
E finalmente você precisa criar o arquivo de recursos: "file_paths". Este arquivo precisa ser criado no diretório res / xml (você provavelmente também precisará criar este diretório):
fonte
<external-path ...
é usado quando você deseja Environment.getExternalStorageDirectory (). e use<files-path ...
se precisar de Context.getFilesDir (). É melhor você verificar os documentos oficiais primeiro: developer.android.com/reference/android/support/v4/content/…androidx
nele está:android:name="androidx.core.content.FileProvider"
Adicione o seguinte bloco de código antes de iniciar a navegação por câmera ou arquivo
Consulte o modo restrito do link de referência e é explicado todos os detalhes técnicos e de uso.
fonte
Nenhuma configuração de provedor necessária no AndroidManifest, apenas permissão de câmera e armazenamento deve ser permitida. Use o seguinte código para iniciar a câmera:
Depois de capturar a imagem, você pode encontrar sua imagem capturada em:
fonte