android-studio - 访问 AVD 下载目录中的文件的“权限被拒绝”
问题描述
我尝试使用我放入 Android Studio AVD 设备默认下载文件夹中的文件,但徒劳无功。
我的应用程序首次运行时需要使用下载文件夹中的设置文件,并正确自定义工具。
我知道我必须在清单中添加权限,我做到了。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我测试了所有的 src & des 文件或目录,File.exists()
并且东西都在那里。但我无法将下载中的文件复制到我的应用程序存储 ( 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 在下载目录中打开文件似乎没有问题。
但我仍然对此感到困惑。有人有更多见解吗?
解决方案
新安卓现在需要在运行时获取用户权限。
以下代码应归功于 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;
}
推荐阅读
- javascript - 对象保留引用的轨迹,但不将其保留在对象中
- django - 自定义过滤器集不会同时按两个字段过滤
- react-native - 使用 StyleSheet.create({ 移动元素时,我的可触摸按钮移动但热点保持不变
- javascript - 将 webpack 与 bootstrap 和 less-loader 集成
- javascript - 在 discord.js 中的时间限制之前获取收集的消息
- python - ROS logger 禁用 Python logger
- c++ - 如何使用 cmake 在 C++ 中进行快速检查(基于属性的测试)?
- php - Eclipse PHP 项目报错:“在项目的构建路径中检测到循环”
- tensorflow - 非线性损耗组合
- jenkins - 从应用程序中读取 Jenkins 环境变量