Почему получить java.lang.IllegalStateException: невозможно создать ошибку каталога?

Я использую класс DownloadManager, чтобы загрузить файл в Android

и это мой код для скачивания:

Uri downloadUri = Uri.parse(urlString);
DownloadManager.Request request = new
DownloadManager.Request(downloadUri);
            request.setDescription(des).setTitle(titleAudio).setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED).
                        setDestinationInExternalPublicDir(
                                "/my file name/" , titleAudio + String.valueOf(colForUrl) + pasvand);

                long id = downloadManager.enqueue(request);

                SharedPreferences.Editor prefEdit = preferenceManager.edit();
                prefEdit.putLong(strPref_Download_ID, id);
                prefEdit.commit();

но когда я запускаю приложение на каком-то устройстве (Samsung Galaxy S5), я получаю эту ошибку:

java.lang.IllegalStateException: Unable to create directory: /storage/emulated/0/my file name

и это вызвано в setDestinationInExternalPublicDir(..)

но в Nexus 7 все правильно, у меня нет проблем!!
Так где же я не прав?!

2 ответа

Согласно документам:

setDestinationInExternalPublicDir(String dirType, String subPath)

  • dirType - тип каталога для передачи в getExternalStoragePublicDirectory (String)
  • subPath - путь во внешнем каталоге, включая имя файла назначения

dirType должен быть одним из DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS или DIRECT. Может не быть нулевым

Так, например, попробуйте:

setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, titleAudio + String.valueOf(colForUrl) + pasvand);

И перейдите оттуда, если это не та папка, которая вам нужна.

Android API уровня 23 имеет новую концепцию модели разрешений. Концепция предлагает проверять и запрашивать у пользователей разрешение во время выполнения.

Системные разрешения делятся на две категории, обычные и опасные:

1- Нормальные разрешения напрямую не влияют на конфиденциальность пользователя. Если ваше приложение перечисляет нормальное разрешение в своем манифесте, система предоставляет разрешение автоматически.

2- Опасные разрешения могут дать приложению доступ к конфиденциальным данным пользователя. Если ваше приложение перечисляет нормальное разрешение в своем манифесте, система предоставляет разрешение автоматически. Если вы указываете опасное разрешение, пользователь должен явно дать согласие на ваше приложение.

WRITE_EXTERNAL_STORAGE попадает под опасное разрешение, поэтому вы должны проверить во время выполнения, чтобы иметь разрешение на создание каталога.

Первый шаг - добавить запрос permissin в Manifest.xml, добавив следующее:

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

Приведенное выше разрешение не позволит приложению записывать данные во внешнее хранилище с Android 6.0, поэтому необходимо запросить разрешение у пользователя во время выполнения.

Проверьте разрешение:

if (ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Способ запроса разрешения:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Посетите Запрос разрешений во время выполнения для получения дополнительной информации и необходимого кода.

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