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

|-Андроид
|-Документы
|-Музыка
|-Загрузки
|-Мое приложение
|- и т.д.

С новой системой хранения для SDK 30 я больше не могу получить доступ к этой папке. Итак, я застрял в SDK 29 с флагом "requestLegacyExternalStorage".

Можно ли создать ярлык папки Android/data/com.mypackage для этой папки на корневом уровне?

Есть ли пакет для решения этой проблемы? Два года безуспешно ищу решение этой проблемы. Я хотел бы сохранить эту папку в корне, потому что к ней легко получить доступ, особенно во время передачи USB.

Я знаю Политику конфиденциальности, но это для профессионального приложения, они об этом не говорят.

1
lupaulus 26 Янв 2022 в 11:57
"Я хотел бы сохранить эту папку в корневом каталоге" -- используйте ACTION_OPEN_DOCUMENT_TREE и позвольте пользователю решить, где на устройстве пользователя (или в папке облачное хранилище пользователя), что вы должны хранить содержимое пользователя.
 – 
CommonsWare
26 Янв 2022 в 15:02

1 ответ

Лучший ответ

Вы можете выбрать SDK 30 и добавить разрешение MANAGE_EXTERNAL_STORAGE в манифест:

 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />

Обратите внимание, что это опасное разрешение, поэтому вам нужно будет запросить его по-другому, например:

if (!Environment.isExternalStorageManager()) {
        requestManageAllPermission();
        return;
    }
private void requestManageAllPermission() {
    try {
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
        startActivityForResult(intent, REQ_MANAGE_EXTERNAL);
    } catch (Exception e) {
       
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
        startActivityForResult(intent, REQ_MANAGE_EXTERNAL);
    }
}

И вам нужно обрабатывать результаты в:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQ_MANAGE_EXTERNAL) {
        if (!Environment.isExternalStorageManager())
            finish();
    }
}

REQ_MANAGE_EXTERNAL — это константа int, может быть любым числом, которое вы хотите, в моем случае это 2296.

1
Dan Baruch 26 Янв 2022 в 14:29
Эй, спасибо за ответ, но REQ_MANAGE_EXTERNAL как значение или я должен что-то импортировать, потому что метод кажется устаревшим с кодом возврата?
 – 
lupaulus
26 Янв 2022 в 13:47
Нет, это просто целочисленная константа, это может быть любое число, которое вы хотите
 – 
Dan Baruch
26 Янв 2022 в 14:27
1
Я отредактировал ответ, чтобы включить дополнительную информацию
 – 
Dan Baruch
26 Янв 2022 в 14:29