Мое первое 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, отражающий папку загрузки устройства?