我徒劳地尝试使用我放入Android Studio AVD设备默认下载文件夹中的文件。
我的应用程序首次运行时需要使用“下载”文件夹中的安装文件,并正确定制工具。
我知道我必须在Manifest上添加权限,我做到了。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我用File.exists()
测试了所有src&des文件或目录,事情就在那里。但我无法将下载中的文件复制到我的应用程序存储(getFilesDir()
)或解压缩到它...
我得到了下载路径
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
但似乎路径仍在内部NVM上。 AVD中有模拟的外部SDCARD,但还没有文件夹。我开始怀疑下载文件夹是否仍被AVD视为内部文件夹,因此“外部存储”的<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/
奥利奥在看
/storage/emulated/0/Download/
并且它一直返回“许可被拒绝”。但KitKat似乎没有在下载目录打开文件的问题。
但我仍然对此感到困惑。有人有更多的见解吗?
新的Android现在需要在运行时获得用户权限。
以下代码应该归功于Konstantin 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;
}