«Отказано в доступе» для доступа к файлу в каталоге загрузок AVD - PullRequest
0 голосов
/ 12 ноября 2018

Я тщетно пытался использовать файл, который я положил в папку загрузок по умолчанию на моем устройстве Android Studio AVD.

Моему приложению необходимо использовать установочный файл в папке «Загрузки» при первом запуске и правильно настроить инструмент.

Я знаю, что должен добавить разрешения в Манифест, и я сделал.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

И я проверил все файлы src & des или dir с помощью File.exists() и все там.Но я просто не могу скопировать файл в разделе «Загрузки» в хранилище моего приложения (getFilesDir()) или распаковать в него ..

Я получаю путь к загрузке с помощью

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

Но, похоже,путь по-прежнему на внутреннем NVM.В AVD есть эмулированная внешняя SDCARD, но папок там еще нет.Я начинаю задумываться, а не считается ли папка «Загрузки» AVD внутренней, так что разрешение <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> для «внешнего хранилища» на это не влияет ??

Если это так ... что я могу сделать, чтобы это исправить?Или это ошибка AVD?

PS Путь к каталогу загрузок показывает:

/storage/emulated/0/Download/

Некоторые обновления с момента публикации в прошлом месяце:

Вот что я знаю до сих пор.

Версия API, кажется, имеет значение.Выше проблема была запущена Oreo (API 26)Я только что попробовал это на KitKat (API 19), и файл был найден в

/storage/sdcard/Download/ 

Oreo просматривал

/storage/emulated/0/Download/ 

, и он продолжал возвращать «Отказано в доступе».Но у KitKat, похоже, нет проблем с открытием файла в каталоге Downloads.

Но я все еще очень озадачен этим.У кого-нибудь есть больше понимания?

1 Ответ

0 голосов
/ 17 марта 2019

Новый Android теперь необходимо получить разрешение пользователя во время выполнения.

Следующие коды должны отдать должное Константину Х., который щедро делился своими знаниями.

// Credit: Konstantin H.
    if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
         if (shouldShowRequestPermissionRationale(
                        Manifest.permission.READ_EXTERNAL_STORAGE)) {
    // Explain to the user why we need to read the contacts
        }
          requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
    // app-defined int constant that should be quite unique

        return;
   } // Konstantin H.

и, конечно, для разрешения на запись:

if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {

    if (shouldShowRequestPermissionRationale(
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    // Explain to the user why we need to read the contacts
    }
    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);

    return;
}
...