Android Q — Как получить путь к общедоступному каталогу загрузки внешней SD-карты

#android #android-10.0

#Android #android-10.0

Вопрос:

Если я правильно понимаю, в Android Q ваше приложение может читать / записывать в каталог загрузок как на несъемном хранилище, так и с помощью api:

 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) 
  

что переводится как

  /storage/emulated/0/Downloads
  

Или каталог общедоступных загрузок на съемном носителе (новый в Android Q), т. е.

 /storage/08E7-324HI/Downloads
  

Как мне получить этот второй каталог с помощью API?

Комментарии:

1. действительно? я могу читать / записывать в каталог загрузок в эмуляторе.

Ответ №1:

На самом деле Environment.getExternalStorageDirectory() и Environment. Методы getExternalStoragePublicDirectory (строковый тип) устарели, и их вызов на устройстве Android Q (или более поздней версии) вернет нулевой файловый объект.

Как вы можете видеть в таблице ниже (взято из документации разработчиков Android здесь), лучший способ получить доступ к каталогу «Загрузки» — это использовать платформу доступа к хранилищу:

Краткое описание того, как ограниченное хранилище влияет на доступ к файлам

Открытие файла с помощью платформы доступа к хранилищу — это двухэтапный процесс.

Во-первых, запустите намерение запустить средство выбора файлов системы следующим образом:

 val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "*/*"
startActivityForResult(intent, OPEN_DOCUMENT_REQUEST_CODE)
  

Во-вторых, прислушайтесь к результату в onActivityResult вашей активности (requestCode: Int, resultCode: Int, data: Intent?)метод следующим образом:

 if (requestCode == OPEN_DOCUMENT_REQUEST_CODE) {
    if (resultCode == Activity.RESULT_OK) {
        val uri = data?.data

        if (uri == null) {
            showAlertDialog("Error", "Got back a null URI")
            return
        }

        val inputStream = contentResolver.openInputStream(uri)

        if (inputStream == null) {
            showAlertDialog("Error", "Failed reading the contents of the selected file")
            return
        }

        // TODO: read the input stream as makes sense in your application
    } else {
        showToast("No file selected")
    }
}
  

Вы можете обратиться к руководству разработчика Storage Access Framework, чтобы аналогичным образом узнать, как создать, отредактировать или удалить файл.