sj131******** 2023-12-15 16:47 采纳率: 0%
浏览 14
已结题

/data/user/0/com.myapp.car/路径下的文件访问提示permission denied

我有一个运行在android11上的安卓应用,使用了微信的MMKV框架来读取写入一些基础配置信息,比如用户名,会记录在MMKV框架中来保存,数据会存储在/data/user/0/com.myapp.car/files/mmkv里面,这个程序一开始运行的完全正常,我也给他申请了所需要的读取写入权限,但是程序使用半年以来,出现了两次突然所有的配置信息都无法读取出来的现象,而且即使我再把信息输入进去保存,再次打开软件会发现配置信息还是丢失了,我打印logcat日志,会发现对于/data/user/0/com.myapp.car/files/mmkv这个文件夹访问会报错 permission denied,如下图:

img

我的安卓sdk是:

img

软件即使我去系统设置里面,清除存储和缓存,再次运行还是会报错,导致配置写不成功,我之前也试过用/data/user/0/com.myapp.car/shared_prefs/main_share.xml文件,也发生过类似的问题,现在我没有任何头绪了,希望有人遇到过类似的情况能够提供一个思路或解决方案。

  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-12-15 16:56
    关注

    引自强大而免费的微信小程序:皆我知道

    问题分析: 根据您提供的信息,您的安卓应用在运行过程中,突然无法读取存储在/data/user/0/com.myapp.car/files/mmkv目录下的配置信息,并且即使重新写入配置信息,再次打开应用仍然丢失。您在logcat日志中发现访问该目录时会出现"permission denied"的错误提示。

    可能的原因和解决方案如下:

    1. 权限申请问题: 您提到已经申请了所需的读取写入权限,但仍然出现权限被拒绝的问题。请确保您在AndroidManifest.xml文件中添加了正确的权限申请配置,并在运行时动态请求权限。示例代码如下:

      // 在AndroidManifest.xml中添加权限申请配置
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      
      // 在代码中动态请求权限
      private static final int REQUEST_PERMISSION = 1;
      
      private void checkPermissions() {
          if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) !=
                  PackageManager.PERMISSION_GRANTED) {
              ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                      REQUEST_PERMISSION);
          }
      
          if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
                  PackageManager.PERMISSION_GRANTED) {
              ActivityCompat.requestPermissions(this,
                      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                      REQUEST_PERMISSION);
          }
      }
      
      @Override
      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
          if (requestCode == REQUEST_PERMISSION) {
              // 处理权限请求的结果
          }
      }
      

      请确保在请求权限前后,您的应用已经重新安装,以确保权限被正确授权。

    2. 文件访问问题: 如果您已正确申请了权限,仍然无法访问文件夹中的文件,可能是因为文件夹的权限被更改或损坏。可以通过以下步骤尝试解决问题:

      • 在应用的清除存储设置中,清除应用数据和缓存,并重新运行应用。

      • 检查应用的文件夹权限是否正确设置为可读写。您可以使用以下代码检查并设置文件夹的权限:

        File mmkvDir = new File(getFilesDir(), "mmkv");
        if (!mmkvDir.exists()) {
            if (mmkvDir.mkdirs()) {
                Log.d(TAG, "mmkv directory created");
            } else {
                Log.e(TAG, "Failed to create mmkv directory");
            }
        }
        
        if (mmkvDir.setReadable(true) && mmkvDir.setWritable(true)) {
            Log.d(TAG, "mmkv directory can be read and written");
        } else {
            Log.e(TAG, "Failed to set permissions for mmkv directory");
        }
        

        上述代码将确保mmkv文件夹存在,并设置其可读写权限。

    3. MMKV框架问题: 如果以上步骤仍然无法解决问题,可能是MMKV框架本身的问题。您可以尝试更新MMKV框架到最新版本,或者尝试使用其他的本地存储框架替代MMKV。例如,您可以尝试使用SharedPreferences或SQLite数据库来保存配置信息。

    以上是对可能原因的分析和相应解决方案的建议,您可以按照上述步骤逐一排查,希望能够解决您的问题。如果问题仍然存在,请提供更多细节以便进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 创建了问题 12月15日

悬赏问题

  • ¥15 地图软件开发技术答疑(api, 地点获取,外观样式)
  • ¥20 物理远程控制麦克风使用问题
  • ¥15 打印预览会泄漏纸钱包密码吗
  • ¥15 在hololens1上运行unity项目只有空窗口
  • ¥25 TABLEAU PREP无法打开
  • ¥15 百度帐号问题/centos
  • ¥15 关于#c语言#的问题:求完整代码条件好说
  • ¥100 HALCON DELPHI
  • ¥15 (需要远程,AI不回)VB6二进制文件转换成功,但是C#转换总是失败
  • ¥15 关于#matlab#的问题:有没有什么其他办法能够保证不退出进程(相关搜索:matlab调用)