Android10(Q,API-29)以上版本无法在存储卡目录创建文件夹的问题

运行环境:华为Mate P10 Pro,Android 10,EMUI版本10.0.0

注意:内部存储/外部存储等非本文讨论内容

Android 10(Q, API-29)新建文件夹

Android 10(Q,API-29)中不在允许随意创建文件夹了,要用安卓提供的文件夹。

原来比较常用的方式是:

Environment.getExternalStorageDirectory() 

Android 10(Q,API-29)后需要使用的方式:

Context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)

有说在AndroidMenifest.xml中的application添加如下标签也可以解决,但是貌似试了不行(build.gradle中使用了targetVersion:29),

android:requestLegacyExternalStorage="true"

注意:requestLegacyExternalStorage属性只能在api>=29以上版本使用。

 

build.gradle

笔者一个旧项目中的build.gradle配置:

    compileSdkVersion 25
//    buildToolsVersion "21.1.2"
    buildToolsVersion '28.0.3'
    defaultConfig {
        applicationId 'com.xx.xx'
        minSdkVersion 18
        targetSdkVersion 25
        multiDexEnabled true
        versionCode myVersionCode
        versionName myVersionName

可以在 Environment.getExternalStorageDirectory()  的旧方式目录创建对应的文件夹,于是将新项目中的targetSdkVersion改为了28,仍旧失败,再往下改版本可能有些资源依赖无法正常执行,这时候看到一个说明:

在开发过程中,使用File.mkdirs()会返回false创建文件夹失败,有可能是权限不够的原因,需要在AndroidManifest.xml中添加如下权限:

 
     
     

但有的权限可能会报Permission is only granted to system apps错误,导致权限申请失败,
原因是运行时权限:API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。在android6.0以前,我们程序需要的权限我们一般只需要在AndroidManifest.xml中直接更新就好,然而Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,又新增了运行时权限动态检测。
如果你的程序在6.0以上的手机报权限的问题,简单粗暴最有效的解决方法是在工程下的build.gradle中的 targetSdkVersion 改为21或22,因为Android6.0系统或以上默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限。


作者:Drc15H
链接:https://www.jianshu.com/p/1e6e9f9b2ef1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

时间比较旧,后续有时间可以新建一个空工程尝试一下,但就文件权限问题,可能还是使用最新版本的API较为合适,不然要去兼容旧版本,总是要有一些牺牲,很多功能性内容可能无法使用了。

其实最新版本的权限还算合理,安全性也较高,划分了公用外部存储,其实可以在公用外部存储空间自行创建目录,只不过以前习惯了根目录直接创建的方式,会有一些不习惯。

附:Android平台版本与API对照表

平台版本 API 级别 VERSION_CODE
Android 10.0 29 Q
Android 9 28 Pie
Android 8.1 27 Oreo
Android 8 26 Oreo
Android 7.1 25 Nougat
Android 7.0 24 Nougat
Android 6.0 23 Marshmallow
Android 5.1 22 LOLLIPOP_MR1
Android 5.0 21 LOLLIPOP
Android 4.4W 20 KITKAT_WATCH
Android 4.4 19 KITKAT
Android 4.3 18 JELLY_BEAN_MR2
Android 4.2、4.2.2 17 JELLY_BEAN_MR1
Android 4.1、4.1.1 16 JELLY_BEAN
Android 4.0.3、4.0.4 15 ICE_CREAM_SANDWICH_MR1
Android 4.0、4.0.1、4.0.2 14 ICE_CREAM_SANDWICH
Android 3.2 13 HONEYCOMB_MR2
Android 3.1.x 12 HONEYCOMB_MR1
Android 3.0.x 11 HONEYCOMB
Android 2.3.3、2.3.4 10 GINGERBREAD_MR1
Android 2.3、2.3.1、2.3.2 9 GINGERBREAD
Android 2.2.x 8 FROYO
Android 2.1.x 7 ECLAIR_MR1
Android 2.0.1 6 ECLAIR_0_1
Android 2.0 5 ECLAIR
Android 1.6 4 DONUT
Android 1.5 3 CUPCAKE
Android 1.1 2 BASE_1_1
Android 1.0 1 BASE

你可能感兴趣的:(D0021,Android)