Android 10.0以上创建文件失败,说找不到该文件

问题场景:

如果你的app下的build.gradle设置了compileSdkVersion 30,且targetSdkVersion 30。你测试手机刚好是Android 11的。如果文件根目录还是Environment.getExternalStorageDirectory()就会创建失败。

log错误提示:

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Starwberry/img/local_sendpic_temp.jpg: open failed: ENOENT (No such file or directory)

不用去看是否是读写权限问题,Android 11根本没有这目录了

解决方案:

方式一:把compileSdkVersion和targetSdkVersion降到29以下(我没测,理论上可以)

方式二:加版本判断获取根目录

public static String getSDPath(Context context) {
    File sdDir = null;
    boolean sdCardExist = Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED);// 判断sd卡是否存在
    if (sdCardExist) {
        if (Build.VERSION.SDK_INT>=29){
            //Android10之后
            sdDir = context.getExternalFilesDir(null);
        }else {
            sdDir = Environment.getExternalStorageDirectory();// 获取SD卡根目录
        }
    } else {
        sdDir = Environment.getRootDirectory();// 获取跟目录
    }
    return sdDir.toString();
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Android中经常需要使用文件存储用户数据 本文将梳理各个版本中的文件存储,希望能帮上忙。 1. 简介 A...
    彭旭锐阅读 6,611评论 11 81
  • 文章内容转载自Android 7.0 行为变更 通过FileProvider在应用间共享文件吧 - CSDN博客 ...
    暴躁的西瓜阅读 2,383评论 0 3
  • 写在前面 虽然这个出来好久了,之前也一直没有遇到什么问题,但是最近在不同app中共享的时候还是出了问题,现在引用鸿...
    dlihasa阅读 9,662评论 0 13
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,303评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,122评论 0 4