0

Я использую DownloadManager класс, чтобы загрузить файл в андроиде
why get java.lang.IllegalStateException: Не удалось создать ошибку каталога?

и это мой код для загрузки:

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 все правильно, у меня нет проблем !!
Итак, Где моя ошибка ?!

ответ

1

Согласно docs:

setDestinationInExternalPublicDir(String dirType, String subPath)

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

dirType Should be one of DIRECTORY_MUSIC, DIRECTORY_PODCASTS, DIRECTORY_RINGTONES, DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES, DIRECTORY_MOVIES, DIRECTORY_DOWNLOADS, or DIRECTORY_DCIM. May not be null.

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

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

И идут оттуда, если это не совсем папка, в которую вы хотите.

+0

Но в nexus 7 я запускаю приложение и его работу! создайте мою директорию без любая ошибка! Я думаю, это потому, что общественное хранилище! в Galaxy S5 и S4 общедоступное хранилище sd-карта, но у nexus7 нет SD-карты! что вы думаете?! –

+0

Да, возможно, это часть проблемы. Установили ли вы разрешение WRITE_EXTERNAL_STORAGE на ваш манифест? – MadEqua

+0

Да, так как я могу создать файл в корне каталога ?! –

0

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

System permissions are divided into two categories, normal and dangerous:

1- Normal permissions do not directly risk the user's privacy. If your app lists a normal permission in its manifest, the system grants the permission automatically.

2- Dangerous permissions can give the app access to the user's confidential data. If your app lists a normal permission in its manifest, the system grants the permission automatically. If you list a dangerous permission, the user has to explicitly give approval to your app.

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 
    } 
} 

Requesting Permissions at Run Time Посетите для получения дополнительной информации и необходимый код.

Смежные вопросы