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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章