Почему получить 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
}
}
Посетите Запрос разрешений во время выполнения для получения дополнительной информации и необходимого кода.