Android открыть InputStream от относительного URI до ACTION_OPEN_DOCUMENT? - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь открыть несколько файлов относительно файла конфигурации 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 "/>

Я бы предпочел, чтобы файлы были разделены, а не в виде BLOB-файла или zip-файла

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Если вам нужно разрешить пользователю выбирать несколько файлов из средства выбора файлов, вы можете сделать следующее:

Это часть моего приложения, вы можете настроить его под свои нужды. Это работает, начиная с 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);
}

Тогда вот как вы получаете выбранный Uris:

@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();
            }
        } 
}
0 голосов
/ 11 ноября 2018

ACTION_OPEN_DOCUMENT дает вам доступ только к тому файлу (или файлам, если вы используете EXTRA_ALLOW_MULTIPLE), который выбирает пользователь.

Вы можете использовать ACTION_OPEN_DOCUMENT_TREE , чтобы позволить пользователю выбрать папку - тогда вы получите доступ ко всем файлам в этой папке (и их подпапкам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...