Android8.0與Android9.0的新特性兼容適配代碼修改

《Android Studio開發實戰 從零基礎到App上線(第2版)》在書後面的附錄中給出了Android8和Android9的主要特性說明,附錄表格如下圖所示:


不過附錄表格只涵蓋了常見的功能代碼適配,而Android8和Android9的衆多新特性還涉及到其它的代碼適配,下面就補充列出Android8和Android9的額外兼容處理說明:

Android8.0

1、屬性動畫組合AnimatorSet增加了setCurrentPlayTime和reverse方法,從而允許倒過來播放屬性動畫組合。
setCurrentPlayTime和reverse方法的調用方式示例如下:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        animSet.setCurrentPlayTime(0); // 設置當前播放的時間點
        animSet.reverse(); // 從動畫尾巴開始倒播至setCurrentPlayTime設置的時間點
    }

完整的代碼例子見以下github頁面
https://github.com/aqi00/android2/blob/master/animation/src/main/java/com/example/animation/ObjectGroupActivity.java

 

2、普通應用不允許修改系統設置
也就是Android8.0之後無法再調用系統設置的修改方法Settings.System.putInt,像原來在代碼裏調整屏幕亮度的辦法就不再適用了。
完整的代碼例子見以下github頁面
https://github.com/aqi00/android2/blob/master/device/src/main/java/com/example/device/LightActivity.java

 

3、懸浮窗要使用類型TYPE_APPLICATION_OVERLAY,原來的類型TYPE_SYSTEM_ALERT從Android8.0開始被捨棄了。
設置懸浮窗類型的兼容代碼示例如下:

    WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
    // 設置爲TYPE_SYSTEM_ALERT類型,才能懸浮在其它頁面之上
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        // 注意TYPE_SYSTEM_ALERT從Android8.0開始被捨棄了
        wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
    } else {
        // 從Android8.0開始懸浮窗要使用TYPE_APPLICATION_OVERLAY
        wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    }

完整的代碼例子見以下github頁面
https://github.com/aqi00/android2/blob/master/media/src/main/java/com/example/media/widget/FloatWindow.java

 

Android9.0

1、獲取設備序列號的方式由Build.SERIAL改爲Build.getSerial(),同時還需要先獲得權限READ_PHONE_STATE
獲取設備序列號的兼容代碼示例如下:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        et_wifi_name.setText(Build.getSerial());
    } else {
        et_wifi_name.setText(Build.SERIAL);
    }

完整的代碼例子見以下github頁面
https://github.com/aqi00/android2/blob/master/mixture/src/main/java/com/example/mixture/WifiApActivity.java

 

2、默認禁止訪問http地址,只允許方法https地址。如果仍要訪問http地址,需要修改配置
Android9開始默認使用加密連接,也就是隻能訪問https打頭的網絡地址,不能訪問http打頭的網絡地址(如果訪問http地址就會報錯“No Network Security Config specified”)。此時要在network模塊的res目錄下面創建xml目錄,並在xml目錄下新建文件network_security_config.xml,文件內容如下所示:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然後打開network模塊的AndroidManifest.xml,在該文件的application節點下增加android:networkSecurityConfig屬性,也就是下面這樣:

    <application
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:networkSecurityConfig="@xml/network_security_config"
        android:name=".MainApplication">

配置完畢重新運行network模塊,就能訪問http打頭的地址了。
其它無法訪問網絡圖片、無法打開網頁、無法下載APK等問題,均可照此辦理。或者直接把http換成https也行。

完整的代碼例子見以下github頁面
https://github.com/aqi00/android2/blob/master/network/src/main/res/xml/network_security_config.xml
https://github.com/aqi00/android2/blob/master/network/src/main/AndroidManifest.xml
 

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