一.简介
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。