ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: android.apps.bnb.company.myphotos, PID: 22482 Исключение android.os.FileUriExposedException: файл: ///хранилище / эмулировано / 0 / Изображения / MyPhotos, выставленные за пределы приложения через Intent.getData()
Есть ли другой способ открыть папку во внутреннем хранилище? Спасибо!
В любом случае я должен выбрать always app, чтобы открыть эту папку.
Возможно ли использовать приложение "Мои файлы" по умолчанию для открытия определенной папки?
Переведено автоматически
Ответ 1
Возможно ли использовать приложение "Мои файлы" по умолчанию для открытия определенной папки?
Да и нет. Не гарантируется на 100%, что это будет работать на всех устройствах.
Правка 1:
Ниже приведен один из способов, с помощью которого это можно сделать. Я тестировал на нескольких эмуляторах (под управлением Android N и Android O) и загружает проводник файлов по умолчанию.:
MainActivity.java
@Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intentintent=newIntent(Intent.ACTION_VIEW); UridirUri= FileProvider.getUriForFile(this,getApplicationContext().getPackageName() + ".com.example.myapplication",Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //intent.setDataAndtType(); I will change this value in the alternatives below }
if (intent.resolveActivity(packageManager) != null) { startActivity(intent); } else { // either display error or take necessary action }
3. Использование типа */*
intent.setDataAndType(dirUri,"*/*");
Этот подход работает, если пользователь выбирает приложение файлового менеджера из средства выбора намерений и помечает его как приложение по умолчанию для обработки */*. Однако у него есть некоторые недостатки (спасибо @CommonsWare за то, что он раскрыл некоторые из них):
Этот тип загрузит все приложения на устройстве и позволит пользователю выбрать одно из них для завершения действия.
Если нет проводника файлов и пользователь выбирает другие приложения для загрузки вашего намерения, то другое приложение выйдет из строя или просто покажет черный экран. Например. Вы используете Gallery или какое-либо другое приложение для его запуска, а не file explorer, тогда приложение Gallery либо выйдет из строя, либо покажет черный экран.
Даже если есть проводник, но пользователь решает использовать другие приложения, другие приложения могут выйти из строя
4. Использование типа text/csv
intent.setDataAndType(uri, "text/csv")
Это ограничит количество приложений, которые будут отображаться пользователю, но при */* использовании будут применены те же ограничения. Будут отображаться приложения, которые могут обрабатывать csv, и если пользователь выберет это, приложения завершат работу.
Здесь доступны некоторые реализации для конкретного устройства, как упомянуто @ Academy of Programmer, для которых требуется определить назначение файлового менеджера по умолчанию и необходимость дополнительных функций.
Заключение:
Для его достижения не доступен стандартный тип, поскольку на данный момент нет стандарта, которому следуют файловые менеджеры для поддержки определенного типа. Возможно, в будущем Google предложит какой-нибудь подход. Лучшей альтернативой было бы реализовать свой собственный файловый менеджер, как это делают Dropbox или Google Drive. Доступно несколько библиотек, которые предоставляют эту функцию.
Ответ 2
Приведенный ниже код используется мной для открытия изображения из хранилища :
Этот код идеально работает в моем Samsung J7, чтобы открыть папку Pictures (и другие) из внутренней памяти с помощью приложения Samsung по умолчанию "Мои файлы".
Похоже, нам нужно декомпилировать файловый менеджер каждого производителя, чтобы узнать, как его правильно вызывать. :( И это слишком много работы. Хорошо... Я предположил, что есть какое-то общее решение для этого.