FileUriExposedException с использованием Android 7

Когда я пытаюсь сделать снимок, я получаю эту ошибку:

Раньше он работал, но, похоже, проблема в том, что я использую Android 7 (API 24).

Это мой код:

Если ваша targetSdkVersion 24 или выше, мы должны использовать класс FileProvider, чтобы предоставить доступ к конкретному файлу или папке, чтобы сделать их доступными для других приложений. Мы создаем наш собственный класс, наследующий FileProvider, чтобы убедиться, что наш FileProvider не конфликтует с FileProviders, объявленными в импортированных зависимостях, как описано здесь.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "fname_" +
                        String.valueOf(System.currentTimeMillis()) + ".jpg"));
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

person Jéwôm'    schedule 29.06.2017    source источник
comment
Используйте File Provider из уровня API 24 в Android.   -  person Rahul Raveendran    schedule 30.06.2017
comment
оно работает. Я добавил это в свою деятельность, где я открываю локальный HTML-документ.   -  person Rahul Kushwaha    schedule 26.12.2020


Ответы (2)


Найдите соответствующее обсуждение здесь

Начиная с Android 7 мы не используем схему file: в качестве uri для намерения, вы должны использовать FileProvider.

Что ж, правильный способ сделать это — использовать _1_(, как указано в разработчике ). Но я нашел непослушный способ сделать это без добавления _2_. Это, очевидно, обходной путь, но он работает.

person Juvi    schedule 29.06.2017

В свою активность добавьте следующие строки:

Это просто проигнорирует раскрытие URI, и вы получите доступ.

 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
 StrictMode.setVmPolicy(builder.build());

Да, я знаю, что это не лучшая практика. Но я просто хотел предоставить ему альтернативу.

Тем не менее, рекомендуется использовать FileProvider.

Теперь у нас есть это в официальной документации по обучению. Проверьте этот ответ.

person Tushar Gogna    schedule 24.05.2018
comment
Отлично, братан.. так много - person Rohan; 10.09.2018
comment
Это не должно использоваться в рабочем приложении. - person Pandiri Deepak; 24.09.2018
comment
@Jorgesys спасибо за информацию. Могу ли я узнать, какие риски возникают, если мы используем это на производстве? Я считаю, что третья сторона может получить доступ к контенту напрямую, поскольку это позволяет обойти ограничения. - person Jorgesys; 19.11.2019
comment
НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной android.os.FileUriExposedException: файл:///storage/emulated/0/fname_1498727381241.jpg выставлен за пределы приложения через ClipData.Item.getUri() в android.os.StrictMode.onFileUriExposed(StrictMode.java:1799) в android.net.Uri.checkFileUriExposed(Uri.java:2346) в android.content.ClipData.prepareToLeaveProcess(ClipData.java:835) в android.content.Intent.prepareToLeaveProcess(Intent.java:9514) в android.content. Intent.prepareToLeaveProcess(Intent.java:9499) на android d.app.Instrumentation.execStartActivity(Instrumentation.java:1525) в android.app.Activity.startActivityForResult(Activity.java:4403) в android.app.Activity.startActivityForResult(Activity.java:4362) в opteamit.com.belami .CommuniquerPartagerPhotosActivity$1.onClick(CommuniquerPartagerPhotosActivity.java:46) в android.view.View.performClick(View.java:6261) в android.view.View$PerformClick.run(View.java:23752) в android.os.Handler .handleCallback(Handler.java:751) на android.os.Ha ndler.dispatchMessage(Handler.java:95) в android.os.Looper.loop(Looper.java:154) в android.app.ActivityThread.main(ActivityThread.java:6776) в java.lang.reflect.Method.invoke (Собственный метод) на com.android.internal.os. ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) - person Tushar Gogna; 17.12.2019