爱笑的姑娘|拖不得了,Android11真的要来了,最全适配实践指南奉上( 四 )

糟了糟了 , 自定义toast被弃用了?我们项目就是用的这个啊!不用担心 , 只是不允许自定义toast从后台显示了 。比如我写一个3秒后再显示toast , 然后应用一打开就进入后台 , 看看会发生什么:
Handler().postDelayed({IToast.show("你好 , 我是自定义toast")}, 3000)W/NotificationService: Blocking custom toast from package com.example.studynote due to package not in the foreground啥也没显示 , 只是发出来一个警告 。所以不用太过担心 , 如果实在需要后台显示 , 就用普通的toast吧!
现在需要 APK 签名方案 v2 ?对于以 Android 11(API 级别 30)为目标平台 , 且目前仅使用 APK 签名方案 v1 签名的应用 , 现在还必须使用 APK 签名方案 v2 或更高版本进行签名 。 用户无法在搭载 Android 11 的设备上安装或更新仅通过 APK 签名方案 v1 签名的应用 。
这个介绍已经很明显了吧 , 如果你的targetSdkVersion修改到30 , 那么你就必须要加上v2签名才行 。 否则无法安装和更新 。
媒体intent操作需要系统默认相机 ?从 Android 11 开始 , 只有预装的系统相机应用可以响应以下 intent 操作:
android.media.action.VIDEO_CAPTURE android.media.action.IMAGE_CAPTURE android.media.action.IMAGE_CAPTURE_SECURE
也就是说 , 如果我调用intent唤起照相机 , 使用VIDEO_CAPTURE的action , 只有系统的相机能够响应 , 而第三方的相机应用不会响应了 。
val intent=Intent()intent.action=android.provider.MediaStore.ACTION_IMAGE_CAPTUREstartActivity(intent)//无法唤起第三方相机了 , 只能唤起系统相机这点对普通的相机应用还是有点打击的 , 官方给的建议是如果要使用特定的第三方相机应用来代表其捕获图片或视频 , 可以通过为intent设置软件包名称或组件来使这些intent变得明确 。
5G ?Android 11 添加了在您的应用中支持 5G 的功能
新的Android11也是支持了5G相关的一些功能 , 包括:

  • 检测是否连接到了5G网络
  • 检查按流量计费性
首先是检测5G网络 , 通过TelephonyManager的监听方法:
private fun getNetworkType(){val tManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManagertManager.listen(object : PhoneStateListener() {@RequiresApi(Build.VERSION_CODES.R)override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) {if (ActivityCompat.checkSelfPermission(this@Android11Test2Activity, android.Manifest.permission.READ_PHONE_STATE) != android.content.pm.PackageManager.PERMISSION_GRANTED) {return}super.onDisplayInfoChanged(telephonyDisplayInfo)when(telephonyDisplayInfo.networkType) {TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO -> showToast("高级专业版 LTE (5Ge)")TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA -> showToast("NR (5G) - 5G Sub-6 网络")TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE -> showToast("5G+/5G UW - 5G mmWave 网络")else -> showToast("other")}}}, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)}如果是5g网络 , 就免不了要去判断是不是按流量计费的 , 否则5G的流量可不是开玩笑的 。
检测流量计费方法也很简单 , 监听网络 , 在回调中判断:
val manager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManagermanager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {super.onCapabilitiesChanged(network, networkCapabilities)//true 代表连接不按流量计费val isNotFlowPay=networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) ||networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED)}})