Android 10升级☞11适配指南

314 阅读2分钟

主要就是分区存储了。 如果已经适配过Android 10就会轻松很多了。涉及分区存储的地方就不用处理了。当然不是

 android:requestLegacyExternalStorage="true"

因为这个配置11就不生效了

一、方法过时

自定义Toast setView的方式会有错误日志,虽然11还能显示,推荐使用系统toast或者snackbar 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 2、handler 在这里插入图片描述 替换为 new Handler(Looper.myLooper())

3、AsyncTask 在这里插入图片描述 使用Rx或者kotlin协程

二、软件包可见性

涉及分享和支付 open.weixin.qq.com/cgi-bin/ann… 从Android 11开始,需要在AndroidManifest.xml清单文件中加入query权限申请,才能检测到手机上安装的三方应用包安装状态,在主工程的AndroidManifest.xml 中增加标签,即可解决以上影响,代码如下:

<manifest package="com.example.app">

      // 在应用的AndroidManifest.xml添加如下<queries>标签
    <queries>
        <package android:name="com.tencent.mm" />            // 指定微信包名
        <package android:name="com.tencent.mobileqq" />    //指定qq包名
        <package android:name="com.sina.weibo" />             //指定微博包名
        <package android:name="com.tencent.wework" />      //指定企业微信包名
        <package android:name="com.qzone" />                   //指定QQ空间包名
       <package android:name="com.alibaba.android.rimet" /> // 指定钉钉包名
       <package android:name="com.eg.android.AlipayGphone" /> // 指定支付宝包名
       <package android:name="com.instagram.android" />         // 指定instagram包名
    </queries>


</manifest>

2.添加以上标签之后,需要开发者升级编译工具,否则会出现编译错误。

1)Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本;

2)Android SDK Build-Tools 需要升级至 30 及以上版本;

3)com.android.tools.build:gradle 需要升级至 3.6.0 版本,建议升级至最新的 3.6.4 版本。

三、动态权限

增加 “仅限这一次”提示。需要每次都要动态获取应用权限

在这里插入图片描述

四、签名

Android 11 为目标平台的应用,仅通过v1 签名的应用无法在Android 11的设备上安装或更新。必须使用v2或更高版本进行签名。

同时Android 11 添加了对 APK 签名方案 v4 的支持。

 v1SigningEnabled true
 v2SigningEnabled true

在这里插入图片描述

五、状态栏高度

发现系统为Android 11的手机上targetSdkVersion 是30时获取状态栏高度为0,低于30获取值正常。。。因此需要使用WindowMetrics 适配一下:

public static int getStatusBarHeight(Context context) {

 	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();
        WindowInsets windowInsets = windowMetrics.getWindowInsets();
        Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout());
        return insets.top;
    }       

}

六、所有文件管理权限

如果你的应用是手机管家、文件管理器这类需要访问大量文件的app,可以申请MANAGE_EXTERNAL_STORAGE权限,将用户引导至系统设置页面开

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />


public static void checkStorageManagerPermission(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
                !Environment.isExternalStorageManager()) {

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

MANAGE_EXTERNAL_STORAGE权限,国内使用应该没有什么影响。但是在Google Play上需要说明为什么已有的SAF或MediaStore不满足你的应用需求,审核通过才允许上架使用。所以一般情况下,我个人不推荐你为了适配简单,直接申请使用MANAGE_EXTERNAL_STORAGE权限。

七 、webview加载本地文件

 Uri fileUri = FileProvider.getUriForFile(CSDNApp.csdnApp, CSDNApp.csdnApp.getPackageName() + ".fileprovider", file);
                return fileUri.toString();

Android 11官方文档 OPPO Android Q版本应用兼容性适配指导