Android 11+ Handler/startActivityForResult->Result API/运行时权限变更

private Handler handler = new Handler();

Handler() 此构造函数在 Android 11 /R 之后已弃用。

在 Handler 构造期间隐式选择 Looper 会导致操作无声地丢失(如果 Handler 不期待新任务并退出)、崩溃(如果有时在没有 Looper 活动的线程上创建处理程序)或竞争条件,处理程序关联的线程不是作者预期的。

相反,使用 Executor 或 显式指定 Looper,使用 Looper#getMainLooper {link android.view.View#getHandler} 或类似方法。如果为了兼容性需要隐式线程本地行为,请使用 new Handler(Looper.myLooper())。

解决

1、添加 Looper.getMainLooper() 或 Looper.myLooper() 方法。

private final Handler handler = new Handler(Looper.getMainLooper());
private final Handler handler = new Handler(Looper.myLooper());

 

new Handler() 变更为 new Handler(Looper.myLooper())
new Handler(Handler.Callback callback) 变更为 new Handler(Looper.myLooper(), callback


refs:
官方API:链接

https://stackoverflow.com/questions/61023968/what-do-i-use-now-that-handler-is-deprecated


除了startActivityForResult()方法之外,requestPermissions()方法也被废弃了。至于理由都是一样的,推荐使用Activity Result API。

 详细替换方案见:
https://developer.android.com/training/basics/intents/result?hl=zh-cn#java
https://blog.csdn.net/guolin_blog/article/details/121063078
 

 

 

#activity跳转
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {


#当个授权
registerForActivityResult(ActivityResultContracts.RequestPermission()) {

#多个授权
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()()) {

 

appcompat 1.3.0版本所支持的所有内置Contract,以后还可能会继续增加新的Contract:

  • StartActivityForResult()
  • StartIntentSenderForResult()
  • RequestMultiplePermissions()
  • RequestPermission()
  • TakePicturePreview()
  • TakePicture()
  • TakeVideo()
  • PickContact()
  • GetContent()
  • GetMultipleContents()
  • OpenDocument()
  • OpenMultipleDocuments()
  • OpenDocumentTree()
  • CreateDocument()


说明:
startActivityForResult()方法,需要给它设置不同的 requestCode。

在onActivityResult()方法当中,我们为了区分这个结果是来自之前的哪个任务的,所以要在这里再对requestCode进行判断。

这是以前使用startActivityForResult()方法时的传统写法。

而Activity Result API是没有地方让你传入requestCode的。

针对具体的intent跳转,都有专门的xxLauncher.launcher调用,并进行回传处理,因此此种架构调整能达到更好的解耦,避免reqCode这种产生混乱。

refs:
android官网:Activity Result API

android运行时权限变更:

1.Bluetooth
Google在Android 12当中新增了几个蓝牙相关的运行时权限。原因是因为当开发者去访问一些蓝牙相关的接口时,却需要申请地理位置权限才行,这就让一些对隐私敏感的用户非常反感。

这是一个历史遗留问题,为了更好地保护用户隐私,Google在Android 12当中增加了BLUETOOTH_SCAN,BLUETOOTH_ADVERTISE,BLUETOOTH_CONNECT,这3个运行时权限。这样当开发者需要访问蓝牙相关的接口时,只需要请求这些蓝牙权限即可。

=》
1.android版本<12:
访问一些蓝牙相关的接口时,需要申请地理位置权限

2.android版本>12:
访问蓝牙相关的接口时,只需要请求如下这些蓝牙权限即可:
BLUETOOTH_SCAN,BLUETOOTH_ADVERTISE,BLUETOOTH_CONNECT,这3个运行时权限


2.Wi-Fi
Android 13当中,Google将保护用户隐私延伸到了WIFI领域。

和蓝牙类似,Android 13之前(12-)当开发者去访问一些WIFI相关的接口时,如热点、WIFI直连、WIFI RTT等,也需要申请地理位置权限才行。
这其实也是一个历史遗留问题,用户肯定无法理解为什么使用一些WIFI功能时却需要授权地理位置权限。

为此,Android 13当中新增了一个NEARBY_WIFI_DEVICES权限,当再使用以上场景相关的WIFI API时,我们只需申请 NEARBY_WIFI_DEVICES 权限即可,从而更好地保护了用户的隐私。


3.运动传感器
另外还有一个变化是运动传感器权限。

之前我们如果想要读取手机运动传感器的数据,需要申请BODY_SENSORS权限。而在Android 13当中,Google给BODY_SENSORS权限又添加了一个只能在前台使用的限定。

在这里插入图片描述

可以看到,在Android 13上申请BODY_SENSORS权限时,用户只能授权在前台使用。

那么如果我们的应用程序就是要在后台获取运动传感器数据怎么办呢?别担心,Android 13又新增了一个BODY_SENSORS_BACKGROUND权限,申请这个权限即可。

需要注意的是,申请BODY_SENSORS_BACKGROUND权限之前必须得要先获得BODY_SENSORS授权才行,不然申请就是无效的。这个设定有点像当初Android 10增加后台获取地理位置权限的设定。

refs:
https://guolin.blog.csdn.net/article/details/126334526?spm=1001.2014.3001.5502

posted @ 2023-06-28 12:00  petercao  阅读(76)  评论(0编辑  收藏  举报