欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android动态申请权限后提示open failed: EACCES (Permission denied)

程序员文章站 2022-03-26 10:28:59
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

相关标签: android