美文网首页
Android 9.0(8.0) API28 、27 适配相关,

Android 9.0(8.0) API28 、27 适配相关,

作者: suniney | 来源:发表于2019-04-18 12:48 被阅读0次

    1、 Android 9.0上QQ分享报错

    原因
    在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。
    拥有最低 SDK 版本 23 或更低版本的应用需要 android:required=”false” 属性,
    因为在 API 级别低于 24 的设备上,org.apache.http.legacy 库不可用。
    解决方案
    1、确保App对应build.gradle脚本配置中 compileSdkVersion值为28。

        compileSdkVersion 28
        ......
        defaultConfig {
            applicationId "com.umeng.soexample"
            minSdkVersion 18
            targetSdkVersion 28
    

    2、在App清单文件AndroidManifest.xml application项中配置useLibrary项。明确引用org.apache.http.legacy库。

     ......
        <application  android:label="@string/app_name"
            android:icon="@drawable/umeng_share_solid_icon"
            android:name=".App">
            <uses-library android:name="org.apache.http.legacy" android:required="false"/>
            <activity
            ......
    

    3、sync gradle配置,clean工程,rebuild工程,重新安装App。已在运行Android 9.0的Google Pixel手机上实测,报错问题不再复现。

    2、API 28导致的Canvas FLAG失效

    原代码

     int flags = Canvas.MATRIX_SAVE_FLAG |
     Canvas.CLIP_SAVE_FLAG |
     Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
     Canvas.FULL_COLOR_LAYER_SAVE_FLAG | 
     Canvas.CLIP_TO_LAYER_SAVE_FLAG;
    int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, flags);
    

    更改为

    int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
    

    原因根据源码查看,在api28中已经全部改为:ALL_SAVE_FLAGS,其他已经无效:

    /**
         * Restore everything when restore() is called (standard save flags).
         * <p class="note"><strong>Note:</strong> for performance reasons, it is
         * strongly recommended to pass this - the complete set of flags - to any
         * call to <code>saveLayer()</code> and <code>saveLayerAlpha()</code>
         * variants.
         *
         * <p class="note"><strong>Note:</strong> all methods that accept this flag
         * have flagless versions that are equivalent to passing this flag.
         */
        public static final int ALL_SAVE_FLAG = 0x1F;
     
        private static void checkValidSaveFlags(int saveFlags) {
            if (sCompatiblityVersion >= Build.VERSION_CODES.P
                    && saveFlags != ALL_SAVE_FLAG) {
                throw new IllegalArgumentException(
                        "Invalid Layer Save Flag - only ALL_SAVE_FLAGS is allowed");
            }
    

    3、java.io.IOException: Cleartext HTTP traffic to dict.youdao.com not permitted

    原因分析
    从Android 6.0开始引入了对Https的推荐支持,与以往不同,Android P的系统上面默认所有Http的请求都被阻止了。

    <application android:usesCleartextTraffic=true>
    

    4、 notification没有显示

    原因分析

    如果targetsdkversion设定为26或以上,开始要求notification必须知道channel,具体查阅这里

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = "";
            String description = "";
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(DOWNLOAD_CHANNEL_ID, name, importance);
            channel.setDescription(description);
            mNotificationManager.createNotificationChannel(channel);
        }
    }
    

    5、无法通过“application/vnd.android.package-archive” action安装应用

    原因分析

    targetsdkversion大于25必须声明REQUEST_INSTALL_PACKAGES权限,见官方说明REQUEST_INSTALL_PACKAGES
    在AndroidManifest中加入

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    

    相关文章

      网友评论

          本文标题:Android 9.0(8.0) API28 、27 适配相关,

          本文链接:https://www.haomeiwen.com/subject/iybzwqtx.html