J'essaie de résoudre un problème après l'ajout de la nouvelle fonctionnalité dans le système de fichiers Android, mais j'obtiens cette erreur:
android.os.FileUriExposedException: file:///storage/emulated/0/MyApp/Camera_20180105_172234.jpg exposed beyond app through ClipData.Item.getUri()
J'espère donc que quelqu'un pourra m'aider à résoudre ce problème :)
Merci
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;
}
Réponses:
Pour SDK 24 et plus, si vous devez obtenir l'URI d'un fichier en dehors du stockage de votre application, vous rencontrez cette erreur.
Les solutions @ eranda.del vous permettent de modifier la politique pour permettre cela et cela fonctionne très bien.
Cependant, si vous souhaitez suivre les directives de Google sans avoir à modifier la politique d'API de votre application, vous devez utiliser un FileProvider.
Au début, pour obtenir l'URI d'un fichier, vous devez utiliser la méthode FileProvider.getUriForFile ():
Ensuite, vous devez configurer votre fournisseur dans votre manifeste Android:
(Dans les "autorités", utilisez la même valeur que le deuxième argument de la méthode getUriForFile () (signature d'application + ".provider"))
Et enfin, vous devez créer le fichier de ressources: "file_paths". Ce fichier doit être créé dans le répertoire res / xml (vous devrez probablement créer ce répertoire également):
la source
<external-path ...
est utilisé lorsque vous voulez Environment.getExternalStorageDirectory (). et utilisez<files-path ...
si vous avez besoin de Context.getFilesDir (). Vous feriez mieux de vérifier d'abord les documents officiels: developer.android.com/reference/android/support/v4/content/…androidx
android:name="androidx.core.content.FileProvider"
Ajouter le bloc de code suivant avant de démarrer la navigation de la caméra ou des fichiers
Veuillez vous référer au mode strict du lien de parrainage et expliquer tous les détails techniques et d'utilisation.
la source
Aucune configuration de fournisseur requise dans AndroidManifest, seule l'autorisation de caméra et de stockage doit être autorisée. Utilisez le code suivant pour démarrer la caméra:
Après avoir capturé l'image, vous pouvez trouver votre image capturée dans:
la source