新项目要求在android13的基础上开发,基于此调查13的一些变化
1.本地sdcard权限申请改变
原来的:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
细化媒体权限改为:
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
2.intentFilter
Intent 过滤器会屏蔽不匹配的 intent
当 App 以 Android 13(33) 或更高版本为 Target 的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的 <intent-filter> 元素匹配时,系统才会传送该 intent,换言之系统会屏蔽所有不匹配的 intent,但以下情况除外:
- 发送给其他应用的未声明任何 intent 过滤器的组件的 intent;
- 发送给你应用中的其他组件的 intent;
- 由系统发送的 intent;
- 由具有根级特权的用户发送的 intent;
3.静态广播Broadcast
从Android 13开始,以Android13(API 33+)为目标平台的应用,注册静态广播时,需设置对其他应用的可见性(需要先启用DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 开发者选项 -> App Compatibility Changes ->Your App->DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED):
若对其他应用可见,广播注册时设置:Context.RECEIVER_EXPORTED
若仅应用内使用,广播注册时设置:Context.RECEIVER_NOT_EXPORTED
当你的 Receiver 声明了 RECEIVER_NOT_EXPORTED 的话,其他 App 向其发送广播会失败,并打印如下日志提醒你的 Receiver 需要公开:
BroadcastQueue: Exported Denial: sending Intent { act=com.example.demoapplication.RECEIVER flg=0x10 }, action: com.example.demoapplication.RECEIVER from com.example.tiramisu_demo (uid=10161)
due to receiver ProcessRecord{8e5f11c 16942:com.example.demoapplication/u0a158} (uid 10158) not specifying RECEIVER_EXPORTED
豁免:
需要留意的是,系统级广播是受保护的,普通 App 没有权限发送。
所以只是监听系统广播的话,动态注册的 Receiver 无需指定上述 flag。即便指定了 RECEIVER_NOT_EXPORTED,和静态注册方式一致也能正常接收、不受影响。
适配办法
找到所有动态注册 Broadcast Receiver 的代码。如果监听的包含非系统广播,请根据是否公开给其他 App 的需要使用来添加 flag 的声明。
private void registerTestReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction("com.xiaxl.test.action");
// api >= 33
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// 跨应用间使用
MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
// 应用内使用
//MainActivity.this.registerReceiver(mTestReceiver, filter, Context.RECEIVER_EXPORTED);
}
// api <= 32
else {
MainActivity.this.registerReceiver(mTestReceiver, filter);
}
}
4.wifi权限:
新增NEARBY_WIFI_DEVICES权限,将原有的ACCESS_FINE_LOCATION
权限 与 Wi-Fi能力使用
进行了区分,原来申请wifi权限的同时还会申请位置请求(避免早先开发者使用Wi-Fi能力时,需要请求用户位置权限,从而引起用户的歧义)
5.剪切板:
从Android 13(API 33)开始,Android剪切板新增了一项新API:
Android 13(API 33)开始,用户可以选择使用API PersistableBundle#(ClipDescription.EXTRA_IS_SENSITIVE, true)隐藏要复制到剪切板的用户账户、密码登敏感信息。
6.废弃android:sharedUserId="android.uid.system"
共享用户 ID 会在软件包管理器中导致具有不确定性的行为。因此,强烈建议不要使用它,并且在未来的 Android 版本中会将其移除。相反,应用应使用适当的通信机制(例如服务和 content provider),在共享组件之间实现互操作性。请注意,现有应用无法移除此值,因为不支持不使用共享用户 ID。这类应用应添加 android:sharedUserMaxSdkVersion="32"
,以免在新用户安装时使用共享用户 ID。
7.其他
图库的修改,图标适配等