Android11 3分钟快速适配 实战demo 微信分享和qq分享

比较好的文档
简单明了的
demo实战
 
太复杂详细了
========================================================
1.写统一的接口先(ok)
2.文件共享
跑步模式
舌头分享
AI健身分享
赛事web分享,周报
3.读写统一迁移
先把旧目录拷贝到新的目录。
具体步骤:
1).判定新的目录是否存在
2).不存在,把旧版本拷贝过来
3).存在,用新版本
4.电话本
先改成30,可以查找出哪里有问题了。
 
 
分享的放在外面的公有目录,让第三方sdk可以访问。
1.微信已经做了适配
2.qq还没有做适配
不同版本的微信和qq可能不一样。
自己的总结:
1.需要第三方的,要放到公有目录
2.如果是自己用的放入到私有目录
 
文件修改的地方:
PathMgr(重要)
ImagePickerMgr(图片选择)
Log2File(日志)
 
ActivityPersonalInfo(ai教练,没用到)
Global(另外一个手环的)
 
sAppDir += ".yuedong/";不起作用
 
 
分区存储
关于分区存储,在Android10就已经推行了,简单的说,就是应用对于文件的读写只能在沙盒环境,也就是属于自己应用的目录里面读写。其他媒体文件可以通过MediaStore进行访问。
从 Android 11 开始,应用无法在外部存储设备上创建自己的应用专用目录
targetSdkVersion = 30 中不行了,强制开启分区存储。
 
相机权限和麦克风权限
单次授权:一次性权限,后面每次都要授权
一次性权限和永远权限的API是什么?
 
 
位置权限

1) 先申请前台位置信息访问权限

2) 再申请后台位置信息访问权限,也就是所谓的“始终允许”,而用户将被引导到设置中进行授予

 
 
  • requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
  1. Android11 设备,targetSdkVersion<=29 (Android 10), 申请前台和后台位置权限:
  2. requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
  1. Android11 设备,targetSdkVersion=30 (Android 11), 申请前台和后台位置权限:
 
  • requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION), 100)
 
所以,该怎么适配呢:
  • targetSdkVersion<30 情况下,如果你之前就有判断过前台和后台位置权限,那就无需担心,没有什么需要适配。
  • targetSdkVersion>30 情况下,需要分开申请前后台位置权限,并且对后台位置权限申请做好说明和引导,当然也是为了更好的服务用户
权限申请的 demo 代码:
val permissionAccessCoarseLocationApproved = ActivityCompat
    .checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) ==
    PackageManager.PERMISSION_GRANTED

if (permissionAccessCoarseLocationApproved) {
   val backgroundLocationPermissionApproved = ActivityCompat
       .checkSelfPermission(this, permission.ACCESS_BACKGROUND_LOCATION) ==
       PackageManager.PERMISSION_GRANTED

   if (backgroundLocationPermissionApproved) {
        //前后台位置权限都有
   } else {
        //申请后台权限
        if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.R){
            ActivityCompat.requestPermissions(this,
                    arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                    200)
        }else{
            AlertDialog.Builder(this).setMessage("需要提供后台位置权限,请在设置页面选择始终允许")
                    .setPositiveButton("确定", DialogInterface.OnClickListener { dialog, which ->
                        ActivityCompat.requestPermissions(this,
                                arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                                200)
                    }).create().show()
        }

   }
} else {
    if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.R){
        //申请前台和后台位置权限
        ActivityCompat.requestPermissions(this,
                arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_BACKGROUND_LOCATION),
                100)
    }else{
        //申请前台位置权限
        ActivityCompat.requestPermissions(this,
                arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION),
                100)
    }
}
图:后台位置信息访问权限的授予只能在设置中进行

在Android10 之前,我们通过ACCESSCOARRSELOCATION 或 ACCESSFINELOCATION(精确位置) 配置即可申请前后台位置权限。

Android 11将位置权限分为前台和后台两种权限。前文说的主要是前台权限,授权方式没有变化。应用想要申请后台权限,除了需要在清单文件中额外添加 ACCESSBACKGROUNDLOCATION 权限外,还需要应用主动引导用户到指定页面授权。

电话号码相关权限展开目录

Android 11 更改了您的应用在读取电话号码时使用的与电话相关的权限。

具体改了什么呢?其实就是两个 API:

  • TelecomManager 类中的 getLine1Number () 方法
  • TelecomManager 类中的 getMsisdn () 方法

TelephonyManager 类中不受支持的 getMsisdn () 方法。

如果您的应用声明 READ_PHONE_STATE 

也就是当用到这两个 API 的时候,原来的 READ_PHONE_STATE 权限不管用了,需要 READ_PHONE_NUMBERS 权限才行。

权限会被重置的问题
新API:30
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    Environment.isExternalStorageManager();
}
Environment.isExternalStorageManager();
 
 
 
 
 
 
实战分析:
1.单次权限,不需要适配
注意:如果应用在请求运行时权限时已遵循最佳做法,您无需更改应用即可支持单次授权。
2.位置权限:不需啊适配了,已经有了
3.电话权限:一键登入的电话权限(是否被弄掉了)
4.ai里面的文件存储到了  media和文件的根目录了
存储目录:现将所有的存储统一
Environment.getExternalStorageDirectory()
  • 应用专属存储空间:存储仅供应用使用的文件,可以存储到内部存储卷中的专属目录或外部存储空间中的其他专属目录。使用内部存储空间中的目录保存其他应用不应访问的敏感信息。
例如,如果应用允许用户拍摄照片,用户会希望即使卸载应用后仍可访问这些照片。因此,您应改为使用共享存储空间将此类文件保存到适当的媒体集合中。

您的数据需要占用多少空间?

内部存储空间中用于存储应用专属数据的空间有限。如果您需要保存大量数据,请使用其他类型的存储空间。

 
第一种:是否需要存储权限????不需啊                  从内部存储空间访问,可以使用 getFilesDir() 或 getCacheDir() 方法

创建缓存文件:getCacheDir().当设备的内部存储空间不足时,Android 可能会删除这些缓存文件以回收空间。因此,请在读取前检查缓存文件是否存在。

sp存放的路径和位置
// 不需要权限
return context.getFilesDir().getPath() + StrUtil.toMD5Hex(videoUrl);
第二种:Android /
内部存储目录:data/data/com.yuedong.sport//files/resource
return context.getExternalFilesDir("assets").getAbsolutePath()
第三种:是否需要存储权限????需要           从外部存储空间访问,可以使用 getExternalFilesDir() 或 getExternalCacheDir() 方法

内部存贮API

// 内部私有缓存路径,/data/user/0/com.exam.pkg/cache (6.0之后路径)

context.getCacheDir().getPath()

// 内部私有存贮路径,/data/user/0/com.exam.pkg/files (6.0之后路径)

context.getFilesDir().getPath()

外部存贮API

// 外部私有目录路径

// /storage/emulated/0/Android/data/com.exam.pkg/files/Pictures

context.getExternalFilesDir(Environment.DIRECTORY_PICTURES).getPath()

// 外部私有缓存目录路径

// /storage/emulated/0/Android/data/com.exam.pkg/cache

context.getExternalCacheDir().getPath()

// 外部私有media目录

Context#getExternalMediaDirs()

Environment

// 外部存贮根目录

// /storage/emulated/0

Environment.getExternalStorageDirectory().getPath()

// 外部存贮公共目录

Environment.getExternalStoragePublicDirectory(type).getPath()

 

二、getDataDirectory,getFilesDir,getCacheDir,getDir,getExternalStorageDirectory,getExternalStoragePublicDirectory,getExternalFilesDir,getExternalCacheDir,getExternalCacheDir,getRootDirectory的区别和联系

上面这些方法,我们可能似曾相识,但是对于有些同学来说却又很难分清出,主要还是不同的Android版本的问题。为了方便大家理解,我先简要介绍以上各个方法,为方便大家理解我把这些方法的结果打印出来(以下的打印结果是基于荣耀7的(系统版本6.0): 
1、Environment.getDataDirectory() = /data 
这个方法是获取内部存储的根路径 
2、getFilesDir().getAbsolutePath() = /data/user/0/packname/files 
这个方法是获取某个应用在内部存储中的files路径 
3、getCacheDir().getAbsolutePath() = /data/user/0/packname/cache 
这个方法是获取某个应用在内部存储中的cache路径 
4、getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() = /data/user/0/packname/app_myFile 
这个方法是获取某个应用在内部存储中的自定义路径 
方法2,3,4的路径中都带有包名,说明他们是属于某个应用 
………………………………………………………………………………………… 

External存在的都是外部存储,Environment的是根目录下的地址
5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0 
这个方法是获取外部存储的根路径 
6、Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = /storage/emulated/0 
这个方法是获取外部存储的根路径 

================================================
7、getExternalFilesDir(“”).getAbsolutePath() = /storage/emulated/0/Android/data/packname/files 
这个方法是获取某个应用在外部存储中的files路径 
8、getExternalCacheDir().getAbsolutePath() = /storage/emulated/0/Android/data/packname/cache 
这个方法是获取某个应用在外部存储中的cache路径 

最重要的:
5.
解决办法
微信开发文档
 
外部存储设备上的应用专用目录

从 Android 11 开始,应用无法在外部存储设备上创建自己的应用专用目录。如需访问系统为您的应用提供的目录,请调用 getExternalFilesDirs()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值