“拒绝访问”以访问AVD下载目录中的文件

时间:2018-11-12 11:08:15

标签: android-studio avd

我尝试使用我放入Android Studio AVD设备默认默认下载文件夹中的文件是徒劳的。

我的应用程序在首次运行时需要使用“下载”文件夹中的安装文件,并正确定制该工具。

我知道我必须在清单上添加权限,而我做到了。

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

然后我用File.exists()测试了所有src&des文件或dir,一切都准备好了。但是我无法将“下载”中的文件复制到应用存储(getFilesDir())或将其解压缩。.

我得到

的下载路径
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 

但是似乎路径仍在内部NVM上。 AVD中有模拟的外部SDCARD,但那里没有文件夹。我开始怀疑AVD是否仍将Downloads文件夹视为内部文件夹,因此“外部存储”的<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />权限对此没有影响??

如果是,那么我该怎么办?还是这是AVD错误?

PS 下载目录的路径显示为:

/storage/emulated/0/Download/

自上个月发布以来的一些更新:

这是我到目前为止所知道的。

API版本似乎有所不同。上面的问题正在运行Oreo(API 26)。我只是在KitKat(API 19)上尝试过,并且文件位于

/storage/sdcard/Download/ 

奥利奥(Oreo)在看

/storage/emulated/0/Download/ 

,并一直返回“权限被拒绝”。但是KitKat在下载目录中打开文件似乎没有问题。

但是我对此仍然感到困惑。有人有更多的见识吗?

1 个答案:

答案 0 :(得分:0)

新的Android现在需要在运行时获取用户权限。

以下代码应归功于慷慨分享和教授其知识的康斯坦丁·H。

// Credit: Konstantin H.
    if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
         if (shouldShowRequestPermissionRationale(
                        Manifest.permission.READ_EXTERNAL_STORAGE)) {
    // Explain to the user why we need to read the contacts
        }
          requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);

    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
    // app-defined int constant that should be quite unique

        return;
   } // Konstantin H.

当然还有写权限:

if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {

    if (shouldShowRequestPermissionRationale(
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
    // Explain to the user why we need to read the contacts
    }
    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);

    return;
}