新项目要求在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.其他

图库的修改,图标适配等