为什么得到java.lang.IllegalStateException:无法创建目录错误?

时间:2014-11-07 13:48:10

标签: android android-file android-download-manager android-internet

我使用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中,每件事情都是对的,我没有任何问题!! 那么,我的错在哪里?!

2 个答案:

答案 0 :(得分:1)

根据docs

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,或   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了解更多信息和所需代码。