Android> = 11 перемещаться между папками, чтобы найти файл без разрешения manage_external_storage

У меня есть приложение, которое должно обновить прошивку некоторых машин. До таргетинга на API 29 проблем не было, теперь Google Play Store нужно настроить таргетинг как минимум на API30... и началась борьба.

Средство выбора файлового менеджера, которое я использовал, больше не совместимо (не поддерживается с февраля 2020 года), я нашел новый (средство выбора файлов программных материалов), которое работает хорошо, но требует разрешения MANAGE_EXTERNAL_STORAGE (если только он не перемещается между папками, но видит их все пустой). Google не разрешает выпуск приложения в магазине Play, поскольку управление файлами не является основной задачей приложения.

Мне нужно, чтобы пользователь мог просматривать папки для поиска zip-файла с обновлением прошивки, выбирать его и позволять приложению открывать его и выполнять обновление. Этот файл может находиться где угодно на устройстве, решать пользователю, где его разместить. Решение должно быть совместимо с Android 8+ (начиная с версии 12).

Как я могу решить эту проблему? Заранее спасибо!

Намерение ACTION_OPEN_DOCUMENT — это все, что вам нужно. Ни одно разрешение не нуждалось во мне

blackapps 06.05.2022 12:24

@blackapps вы использовали библиотеку для выбора файлов (в данном случае какую библиотеку?) или вы сами разработали сборщик файлов?

Fenopiù 06.05.2022 12:37

Хорошо, спасибо, я попробую это решение прямо сейчас. :-)

Fenopiù 06.05.2022 12:55
0
3
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как предложил мне @blackapps, удаление разрешения MANAGE_EXTERNAL_STORAGE и переключение на средство выбора системных файлов решило проблему.

На главной активности

private void fileIntent() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("application/pdf");
}

При выборе файла

fun pickFirmwareFromStorage(context: Activity) {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "application/zip"

        // Optionally, specify a URI for the file that should appear in the
        // system file picker when it loads.
        val pickerInitialUri = "Download"
        putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
    }

    startActivityForResult(context, intent, PICK_FIRMWARE_REQUEST_CODE, null)
}

Другие вопросы по теме