Я пытаюсь открыть несколько файлов относительно файла конфигурации json в Android 4.4 (уровень API 19), я использовал
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType({mime});
this.startActivityForResult(intent, {code});
чтобы пользователь мог найти файл конфигурации и оттуда открыть несколько файлов, путь к которым я знаю из файла конфигурации.
Но я получаю
Caused by: java.lang.SecurityException:
Permission Denial: reading com.android.providers.downloads.DownloadStorageProvider
uri content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/{relative file}
requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
Я не хочу использовать пользовательские интерфейсы для открытия других файлов, поэтому я попытался добавить следующие разрешения, но не получил никаких результатов.
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.MANAGE_DOCUMENTS "/>
Я бы предпочел, чтобы файлы были разделены, а не в виде капли или zip-файла.
Я просто попробовал это, я могу получить READ_EXTERNAL_STORAGE, но не MANAGE_DOCUMENTS, и все равно получить отказ в разрешении. Я использую minSdkVersion 19, поэтому попробовал с ActivityCompat.requestPermissions
«Я пытаюсь открыть несколько файлов» - ваш код не имеет отношения к открытию файлов. Если вам нужно ограничить пользователя файлами в файловой системе, к которой ваше приложение может обращаться напрямую, используйте библиотека выбора файлов, а не системный Intent, такой как ACTION_OPEN_DOCUMENT.
ACTION_OPEN_DOCUMENT дает вам доступ только к тому файлу (или файлам, если вы используете EXTRA_ALLOW_MULTIPLE), который выбирает пользователь.
Вы можете использовать ACTION_OPEN_DOCUMENT_TREE, чтобы позволить пользователю выбрать папку - тогда вы получите доступ ко всем файлам в этой папке (и их подпапкам).
ACTION_OPEN_DOCUMENT_TREE был добавлен на уровне API 21, забыл указать, но я использую minSdkVersion 19, поэтому я не могу его использовать, думаю, я просто буду использовать zip-файлы: '(
Правильно, эквивалентного до API 21 не существует.
Если вам нужно позволить пользователю выбирать несколько файлов из средства выбора файлов, вы можете сделать следующее:
Это часть моего приложения, вы можете настроить его под свои нужды. Работает начиная с API 18
private void openFileChooser() {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.setType("*/*");
i.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
i.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(i, REQUEST_CODE_DOC_ALL_FILES);
}
Тогда вот как вы получите выбранный Урис:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_DOC_ALL_FILES && resultCode == Activity.RESULT_OK) {
if (data == null || (data.getData() == null && data.getClipData() == null)) {
Toast.makeText(getContext(), R.string.invalid_source, Toast.LENGTH_SHORT).show();
return;
}
//get result after user action (selecting files) and transform it into array of Uris
Uri[] uriPaths;
if (data.getData() != null) { // only one uri was selected by user
uriPaths = new Uri[1];
uriPaths[0] = data.getData();
} else if (data.getClipData() != null) {
int selectedCount = data.getClipData().getItemCount();
uriPaths = new Uri[selectedCount];
for (int i = 0; i < selectedCount; i++) {
uriPaths[i] = data.getClipData().getItemAt(i).getUri();
}
}
}
вы установили разрешение времени выполнения для READ_EXTERNAL_STORAGE и MANAGE_DOCUMENTS?