持续创作,加速成长!这是我参与「掘金日新计划 · 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())