Android: нужно скачать папку Uri вместо пути - PullRequest
0 голосов
/ 05 марта 2020

Мое первое Android приложение и я, кажется, полностью потерялись в лабиринте структуры Uri, path и Android. : -

Мое приложение позволяет пользователям экспортировать данные в файл. Я создал средство выбора каталогов, которое позволяет пользователю выбирать папку и сохраняет преобразованную строку URI в настройках, например так:

        case R.id.action_directoryPicker: {
            Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
            i.addCategory(Intent.CATEGORY_DEFAULT);
            startActivityForResult(Intent.createChooser(i, "Choose directory"), 9999);
            return true;
        }

    ....

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 9999) {
        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

        Uri treeUri = data.getData();
        if (treeUri == null) {
            return;
        }
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(SettingsActivity.KEY_PREF_IMPORT_EXPORT_LOCATION, treeUri.toString());
        editor.apply();
    }
}

Это прекрасно работает! Теперь я бы хотел установить папку по умолчанию для папки загрузок при первом запуске приложения, когда go что-то не так. У меня есть следующий код в mainActivity.onCreate ()

        # Now some conversion madness: 
        # Convert environment string into a file
        # Convert file into a uri 
        # Convert uri into a string again so I can store it in preferences
        File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
        Uri u = Uri.fromFile(f);  
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(SettingsActivity.KEY_PREF_IMPORT_EXPORT_LOCATION, u.toString());
        editor.apply();
    }

Несмотря на то, что это некрасиво, он работает в принципе. Тем не менее, строка / uri, которую я получаю из среды. DIRECTORY_DOWNLOADS отличается от того, что я получаю, когда вручную выбираю папку «Загрузка» через мою подпрограмму filePicker.

То, что она должна прочитать для работы: content://com.android.providers.downloads.documents/tree/downloads

Что я получаю от Environment.DIRECTORY_DOWNLOADS и не получается: file:///storage/emulated/0/Download

Итак, после всего этого контекста, мой вопрос, каков наилучший способ получить правильный Uri, отражающий папку загрузки устройства?

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Не возможно.

Вы должны позволить пользователю выбрать папку с вашим сборщиком.

Вы действительно могли бы создать URI для папки Download самостоятельно, но даже если бы вы это сделали, это не имело бы смысла, поскольку у вас не было бы прав на ее использование.

0 голосов
/ 05 марта 2020

Вы можете получить URI, как это

File newFile = new File(filePath);
Uri contentUri = getUriForFile(context, "com.packagename.www", newFile);
...