我使用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)中运行app时,我收到此错误:
java.lang.IllegalStateException: Unable to create directory: /storage/emulated/0/my file name
这是由setDestinationInExternalPublicDir(..)
但在Nexus 7中,每件事情都是对的,我没有任何问题!! 那么,我的错在哪里?!
答案 0 :(得分:1)
根据docs:
setDestinationInExternalPublicDir(String dirType, String subPath)
dirType应该是DIRECTORY_MUSIC,DIRECTORY_PODCASTS之一, DIRECTORY_RINGTONES,DIRECTORY_ALARMS,DIRECTORY_NOTIFICATIONS, DIRECTORY_PICTURES,DIRECTORY_MOVIES,DIRECTORY_DOWNLOADS,或 DIRECTORY_DCIM。不能为空。
因此,例如,尝试:
setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, titleAudio + String.valueOf(colForUrl) + pasvand);
如果它不完全是您想要的文件夹,请从那里开始。
答案 1 :(得分:0)
Android API级别23具有权限模型的新概念。该概念建议在运行时检查并询问用户是否允许。
系统权限分为两类,普通和 危险:
1-普通权限不会直接影响用户的隐私。如果你的 应用程序列出其清单中的正常权限,系统授予 自动许可。
2-危险权限可以提供应用程序 访问用户的机密数据。如果您的应用列出正常 在其清单中的权限,系统授予权限 自动。如果列出危险权限,则用户必须这样做 明确批准您的应用。
WRITE_EXTERNAL_STORAGE 属于危险权限,因此您必须在运行时检查以获得创建目录的权限。
第一步是在 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了解更多信息和所需代码。