Android 9.0 (P) 系统特性详解

一.简介

 

Android 9 利用人工智能技术,让手机可以为您提供更多帮助。现在,手机变得更智能、更快,并且还可以随着您的使用进行调整。

 

 

 

 

 

二.变化

 

Android 9.0有哪些变化呢,下面一一详解

 

 

<1> Glide 不显示图片

由于Android9.0对传输层安全协议 (TLS) 实现变更。默认不支持Http,所以默认情况下Glide加载不出图片。

 

解决方法

 

【1】修改Gradle文件

 

 

【2】 清单文件添加配置

 

android:usesCleartextTraffic="true"

 

 

 

 

 

<2> Android 9.0 (P) 显示 系统级对话框

最近由于项目依赖的某些第三方库要求targetSdkVersion必须大于等于26,可是targetSdkVersion改到26后项目运行在Android P上每次进入APP都会弹出一个可恶的提示框。

 

Detected problems with API compatibility(visit g.co/dev/appcompat for more info
 

 

如图

 

 

原因

是 Android P 后谷歌限制了开发者调用非官方公开API 方法或接口,也就是说,你用反射直接调用源码就会有这样的提示弹窗出现,非 SDK 接口指的是 Android 系统内部使用、并未提供在 SDK 中的接口,开发者可能通过 Java 反射、JNI 等技术来调用这些接口。但是,这么做是很危险的:非 SDK 接口没有任何公开文档,必须查看源代码才能理解其行为逻辑。
但是源码是JAVA写的,万物皆可反射,所以还是可以用反射干掉这个 每次启动都会弹出的提醒窗口。

 

 

解决

package com.wjn.viewlistdemo.activity;

import android.app.Application;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        closeAndroidPDialog();
    }

    private void closeAndroidPDialog() {
        try {
            Class aClass = Class.forName("android.content.pm.PackageParser$Package");
            Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class);
            declaredConstructor.setAccessible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            Class cls = Class.forName("android.app.ActivityThread");
            Method declaredMethod = cls.getDeclaredMethod("currentActivityThread");
            declaredMethod.setAccessible(true);
            Object activityThread = declaredMethod.invoke(null);
            Field mHiddenApiWarningShown = cls.getDeclaredField("mHiddenApiWarningShown");
            mHiddenApiWarningShown.setAccessible(true);
            mHiddenApiWarningShown.setBoolean(activityThread, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

 

 

 

<3> Android 9.0 安装APK

 

项目中APP版本更新或者安装其他合作的APK9.0需要特殊处理一下

 

【1】添加权限

<!-- Android 9.0 安装APK -->

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

 

 

2安装文件

File apkfile = new File(mSavePath, "XXx.apk");
InstallUtil.installApk(UpgradeActivity.this, apkfile);
package com.bankcomm.widget.upgrade;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.support.v4.content.FileProvider;
import android.webkit.MimeTypeMap;

import com.bankcomm.util.ActivityUtils;

import java.io.File;

/**
 * Android版本更新工具类
 */

public class InstallUtil {

    /**
     * 安装APK文件
     */

    public static void installApk(Activity activity, File file) {

        if (!ActivityUtils.isActivityIsAlive(activity) || null == file || !file.exists()) {
            return;
        }
        // 通过Intent安装APK文件
        openFile(file, activity);
    }

    /**
     * 区分Android 系统
     */

    public static void openFile(File var0, Activity activity) {
        Intent var2 = new Intent();
        var2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        var2.setAction(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri uriForFile = FileProvider.getUriForFile(activity, "com.XXX.fileprovider", var0);
            var2.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            var2.setDataAndType(uriForFile, activity.getContentResolver().getType(uriForFile));
        } else {
            var2.setDataAndType(Uri.fromFile(var0), getMIMEType(var0));
        }
        try {
            activity.startActivity(var2);
        } catch (Exception var5) {
            var5.printStackTrace();
        }
    }

    /**
     * 获取文件夹名称
     */

    public static String getMIMEType(File var0) {
        String var1 = "";
        String var2 = var0.getName();
        String var3 = var2.substring(var2.lastIndexOf(".") + 1, var2.length()).toLowerCase();
        var1 = MimeTypeMap.getSingleton().getMimeTypeFromExtension(var3);
        return var1;
    }

}

 

 

 

 

 

<4> 跳转Activity

 

项目中经常遇到非Activity跳转到某个Activity的需求,比如Adapter中点击Item跳转到详情Activity中。

在 Android 9 中,您不能从非 Activity 环境中启动 Activity,除非您传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果您尝试在不传递此标志的情况下启动 Activity,则该 Activity 不会启动,系统会在日志中输出一则消息。

 

 

 

 

<5> Https改造

 

Android 9.0 传输层安全协议 (TLS) 实现变更,对Http默认拦截不支持,所以改造Http成Https至关重要。

 

详解:OKhttp实现https请求 :https://blog.csdn.net/weixin_37730482/article/details/78082969

 

 

 

 

 

<6> 不再支持 Android 安全加密文件

Android 9 完全取消了对 Android 安全加密文件 (ASEC) 的支持。

在 Android 2.2(API 级别 8)中,Android 引入了 ASEC 以支持 SD 卡加载应用功能。 在 Android 6.0(API 级别 23)上,平台引入了一个可采用的存储设备 技术,开发者可用它来代替 ASEC。

 

 

 

 

 

<7> 电源管理

Android 9(API 级别 28)引入了一些新功能来改进设备电源管理。 这些变化,连同先前版本中已经存在的功能,有助于确保将系统资源提供给最需要它们的应用。

 

电源管理功能可以分为两个类别:

【1】应用待机群组
      系统将根据用户的使用模式限制应用对 CPU 或电池等设备资源的访问。 这是 Android 9 中新增的一项功能。

 

【2】省电模式改进
      开启省电模式后,系统会对所有应用施加限制。 这是一项已有的功能,但在 Android 9 中得到了改进。

 

注:这些变化适用于所有应用,无论它们是否以 Android 9 为目标。

 

 

 

 

 

<8> 隐私权变更

 

为了增强用户隐私,Android 9 引入了若干行为变更,如限制后台应用访问设备传感器、限制通过 Wi-Fi 扫描检索到的信息,以及与通话、手机状态和 Wi-Fi 扫描相关的新权限规则和权限组。

无论采用哪一种目标 SDK 版本,这些变更都会影响运行于 Android 9 上的所有应用。

后台对传感器的访问受限
Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:

您的应用不能访问麦克风或摄像头。
使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
使用变化或一次性报告模式的传感器不会接收事件。
如果您的应用需要在运行 Android 9 的设备上检测传感器事件,请使用前台服务。

 

限制访问通话记录
Android 9 引入 CALL_LOG 权限组并将 READ_CALL_LOG、WRITE_CALL_LOG 和 PROCESS_OUTGOING_CALLS 权限移入该组。 在之前的 Android 版本中,这些权限位于 PHONE 权限组。

对于需要访问通话敏感信息(如读取通话记录和识别电话号码)的应用,该 CALL_LOG 权限组为用户提供了更好的控制和可见性。

如果您的应用需要访问通话记录或者需要处理去电,则您必须向 CALL_LOG 权限组明确请求这些权限。 否则会发生 SecurityException。

 

 

 

 

 

附:官网:https://developer.android.google.cn/about/versions/pie

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值