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