Android版本适配

240 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

Android 11

分区存储

分区存储是Android10中新增的功能,但是当时可以在AndroidManifest.xml中添加requestLegacyExternalStorage=true 标志,就可以跳过此限制。

然而在针对以 Android 11 为目标平台的应用中,requestLegacyExternalStorage=true标志将失效,强制实行分区存储。不过Android 11 允许使用除 MediaStore API 之外的 API 通过文件路径直接访问共享存储空间中的媒体文件。例如File Api,不过,使用原始文件路径直接访问共享存储空间中的媒体文件会重定向到 MediaStoreAPI,这次重定向会造成性能影响,所以还是建议直接使用 MediaStore API。

对于文件管理类的应用来说可以申请MANAGE_EXTERNAL_STORAGE权限获取外部存储管理权限,然后引导用户跳转系统设置页面开启。

Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

不过即使APP有MANAGE_EXTERNAL_STORAGE权限,也无法访问Android/data/目录下的文件。

包可见性

为了避免用户数据泄露,减少应用获取其他应用信心等不安全隐患,Android11加入了软件包可见性。这一功能会影响提供其他应用相关信息的方法的返回结果。例如getInstalledApplications()方法。 此功能的添加会影响支付类的功能。我们可以在AndroidManifest.xml 中增加queries元素,里面增加需求可见的应用的包名。

<queries>
    <package android:name="com.tencent.mm"/>  //指定微信包名
    <package android:name="com.sina.weibo" />  // 微博
    <package android:name="com.tencent.mobileqq" /> //QQ
    <package android:name="com.eg.android.AlipayGphone" /> //支付宝
</queries>

Toast

从Android 11开始,从后台发送自定义view的Toast消息会被系统屏蔽,而且Toast对应的setView 和 getView方法也已经废弃不建议使用。

状态态栏

Android11新增了WindowMetrics类,用于获取窗口边界以及导航栏的高度。

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
    val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val wi=  wm.currentWindowMetrics.windowInsets
    val insets=wi.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() or WindowInsets.Type.displayCutout())
}

废弃的方法

  • AsyncTask在Android11不建议使用,推荐使用Kotlin协程。
  • Handler无参构造函数不推荐使用,创建Handler的时候需要指定Looper。
Handler(Looper.getMainLooper())