Android动态申请权限后提示open failed: EACCES (Permission denied)
程序员文章站
2022-06-26 14:50:11
android6.0以上如何分配动态权限略过,网上例子很多。今天碰到一个问题,客户反馈app内自带的更新功能无法使用。我一听懒洋洋的回了句:权限申请了吗?对方答:申请了,并且还给出截图。“哎吆我去,ps的吧!于是我拿出自己的手机尝试,结果没问题,因为我的手机是9.0的。”“录屏我瞅瞅!”于是我崩溃了……原代码: String path = Environment.getExternalStorageDirectory() URL url = new URL(path );...
android6.0以上如何分配动态权限略过,网上例子很多。今天碰到一个问题,客户反馈app内自带的更新功能无法使用。
我一听懒洋洋的回了句:权限申请了吗?
对方答:申请了,并且还给出截图。
“哎吆我去,ps的吧!于是我拿出自己的手机尝试,结果没问题,因为我的手机是9.0的。”
“录屏我瞅瞅!”
于是我崩溃了……
原代码:
String path = Environment.getExternalStorageDirectory()
URL url = new URL(path );
// 创建连接
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.connect();
// 获取文件大小
int length = conn.getContentLength();
// 创建输入流
InputStream is = conn.getInputStream();
File file = new File(mSavePath);
// 判断文件目录是否存在
if (!file.exists()) {
file.mkdir();
}
File apkFile = new File(mSavePath,
mActivity.getPackageName());
FileOutputStream fos = new FileOutputStream(apkFile);
int count = 0;
// 缓存
byte buf[] = new byte[1024];
// 写入到文件中
do {
int numread = is.read(buf);
count += numread;
// 计算进度条位置
progress = (int) (((float) count / length) * 100);
// 更新进度
mHandler.sendEmptyMessage(DOWNLOAD);
if (numread <= 0) {
// 下载完成
mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
break;
}
// 写入文件
fos.write(buf, 0, numread);
} while (!cancelUpdate);// 点击取消就停止下载.
fos.close();
is.close();
问题就出在第一行:String path = Environment.getExternalStorageDirectory();
官方文档:Android Q文件存储机制发生修改,APP只能访问自己目录下的文件和公共媒体文件,不能直接访问根目录。
找到问题所在,修改代码!
第一步:manifest的applicaiton标签添加
android:requestLegacyExternalStorage="true"
<application
android:allowBackup="true"
android:configChanges="locale"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
>
第二步:修改路径. String path = mActivity.getExternalFilesDir(null).getAbsolutePath();
这时文件下载路径在/storage/emulated/0/Android/data/包名/files
当然最好检验一下文件路径是否存在。
File dirFile = new File(path);
if (!dirFile.exists()) {
boolean mkdirs = dirFile.mkdirs();
if (!mkdirs) {
Log.e(TAG, "创建文件:" + mkdirs);
} else {
Log.e(TAG, "创建成功");
}
}
运行,崩溃!检查报错位置,android:requestLegacyExternalStorage="true"报错。
项目采用的sdk 为 28 , 测试机为android 10。
升级sdk至30.
运行,完美!
本文地址:https://blog.csdn.net/x158454996/article/details/110531212