【问题标题】:Unable to download files using download manager in emulator无法使用模拟器中的下载管理器下载文件
【发布时间】:2016-06-24 10:15:33
【问题描述】:

Android Studio 2.1.2,API 23

    Error:

java.lang.SecurityException: 没有写权限 to/storage/emulated/0/Download/aabd.pdf:既不是用户 10059 也不是 当前进程有 android.permission.WRITE_EXTERNAL_STORAGE。

代码:

     File file = new File(Environment.getExternalStoragePublicDirectory
            (Environment.DIRECTORY_DOWNLOADS), nameOfFile);
   request.setDestinationInExternalPublicDir
  (Environment.DIRECTORY_DOWNLOADS, nameOfFile);
   request.setVisibleInDownloadsUi(true);
   myDownloadReference = downloadManager.enqueue(request);

在设备中,它工作正常。

在 Manifest 中有权限

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.player">


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

【问题讨论】:

    标签: android android-download-manager


    【解决方案1】:

    如果你有 targetSdk 23,你必须像这样检查权限

        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
            checkPermission();
        }
        else {
    
        File file = new File(Environment.getExternalStoragePublicDirectory
            (Environment.DIRECTORY_DOWNLOADS), nameOfFile);
                request.setDestinationInExternalPublicDir
            (Environment.DIRECTORY_DOWNLOADS, nameOfFile);
            request.setVisibleInDownloadsUi(true);
            myDownloadReference = downloadManager.enqueue(request);
        }
    
    
    private void checkPermission() {
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
                    Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {//Can add more as per requirement
    
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},
                            123);
    
                } else {
    
                }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 123: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
             File file = new File(Environment.getExternalStoragePublicDirectory
            (Environment.DIRECTORY_DOWNLOADS), nameOfFile);
                request.setDestinationInExternalPublicDir
            (Environment.DIRECTORY_DOWNLOADS, nameOfFile);
            request.setVisibleInDownloadsUi(true);
            myDownloadReference = downloadManager.enqueue(request);
    
                } else {
    
                    checkPermission();
                }
                return;
            }
        }
    }
    

    【讨论】:

    • 谢谢,但是为什么我必须再次写清单权限@Nisarg
    • @G.I Joe 是的 targetSdk : 23 你必须这样做
    • 它仍然无法正常工作而且你已经使用了 File file = new File(Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS), nameOfFile);告诉我为什么使用它?
    • @Umair 只是为了将内容下载到“下载”文件夹中
    【解决方案2】:

    模拟器中是否启用了 sd 卡模拟?您可能想使用 Genymotion 模拟器而不是内置的

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 2022-10-18
      • 2018-06-10
      • 2020-11-09
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多