Выставляется вне приложения через ClipData.Item.getUri
Я пытаюсь исправить проблему после добавления новой функции в файловую систему Android, но получаю эту ошибку:
android.os.FileUriExposedException: file:///storage/emulated/0/MyApp/Camera_20180105_172234.jpg exposed beyond app through ClipData.Item.getUri()
Я надеюсь, что кто-нибудь поможет мне это исправить :)
Спасибо
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;
}
Ответы
Ответ 1
Добавьте следующий блок кода перед запуском камеры или просмотром файла
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
Пожалуйста, ознакомьтесь со строгим режимом реферальной ссылки и объясните все его использование и технические детали.
Ответ 2
Для SDK 24 и выше, если вам нужно получить Uri файла за пределами хранилища вашего приложения, у вас есть эта ошибка.
Решения @eranda.del позволяют изменить политику, чтобы это разрешалось, и она работает нормально.
Однако, если вы хотите следовать правилам Google, не изменяя политику API своего приложения, вы должны использовать FileProvider.
Сначала, чтобы получить URI файла, вам нужно использовать метод FileProvider.getUriForFile():
Uri imageUri = FileProvider.getUriForFile(
MainActivity.this,
"com.example.homefolder.example.provider", //(use your app signature + ".provider" )
imageFile);
Затем вам нужно настроить провайдера в вашем манифесте Android:
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.homefolder.example.provider"
android:exported="false"
android:grantUriPermissions="true">
<!-- ressource file to create -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
</application>
(В "полномочиях" использовать то же значение, что и второй аргумент метода getUriForFile() (подпись приложения + ".provider"))
И, наконец, вам нужно создать файл ресурсов: "file_paths". Этот файл необходимо создать в каталоге res/xml (вам, вероятно, нужно создать и этот каталог):
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>