Android P應用適配相關指南
Android P應用適配相關指南
本文對開發Android P應用適配以及新版本相關特性,下圖是博主開發的教育專案對劉海屏相關適配.
如圖:
一 Android P適配指導
AndroidP開始提供規範化的介面,應用可以使用標準介面,獲取當前是否有劉海,控制應用在劉海屏上的佈局顯示區域。AndroidP的裝置支援模擬劉海效果,持有P的裝置的可以開啟“開發者選項”,找到“模擬巨有凹口的顯示屏”進行模擬除錯。
二 劉海屏適配指導
怎麼判斷支援劉海屏?
谷歌API: DisplayCutout cutout = mContext.getDisplayCutout();
返回DisplayCutout物件,為劉海的描述資訊,不支援則返回空
怎麼獲取劉海資訊?
DisplayCutout.getSafeInsets() 返回安全區域Rect
DisplayCutout.getBounds() 返回劉海的區域的Region
如何控制應用的佈局顯示?
1,LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
2,LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
3,LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
屬性說明:
1,沒有設定的情況下預設此標記,只有狀態列區域可見的情況下,才意味著加了FLAG_FULLSCREEN or SYSTEM_UI_FLAG_FULLSCREEN標記的應用視窗都會被切邊放在劉海以下
2,此flag下不進行應用視窗的限制,視窗可以顯示到劉海區域
3,此flag下應用視窗一直被限制在劉海區域以下
應用也可以通過theme來達到同樣的效果
<item name="android:windowLayoutInDisplayCutoutMode">default</item>
對應LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
對應LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
<item name="android:windowLayoutInDisplayCutoutMode">never</item>
對應LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
應用遇到視窗顯示被限制在劉海以下區域的可以調整layoutInDisplayCutoutMode 設定為LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,再通過獲取DisplayCutout 關於劉海區域資訊,調整UI達到更好的滿屏體驗。
三 Crypto JCA 提供程式已被移除,棄用 Bouncy Castle 加密
Crypto JCA 提供程式已被移除。呼叫 SecureRandom.getInstance(“SHA1PRNG”,“Crypto”) 將會引發 NoSuchProviderException,呼叫Bouncy Castle 提供程式的 getInstance(),會生成 NoSuchAlgorithmException 錯誤。
A:影響範圍:
(1)Crypto JCA 提供程式已被移除,此影響所有執行AndriodP系統的所有應用;
(2)Bouncy Castle 提供程式異常的問題,影響所有targetsdkversion>=28的應用;
B: 如何適配
模組應該在getInstance()的時候不指派提供程式,採用預設實現即可
四 FLAG_ACTIVITY_NEW_TASK被強制要求
AndroidP上,從非 Activity 環境中啟動 Activity,除非傳遞 Intent 標誌 FLAG_ACTIVITY_NEW_TASK。 如果嘗試在不傳遞此標誌的情況下啟動 Activity,則該 Activity 不會啟動,此限制對所有執行AndroidP的應用生效。
五 禁止空閒應用訪問相機、麥克風和感測器
Android 9 限制後臺應用訪問使用者輸入和感測器資料的能力。 如果您的應用在執行 Android 9 裝置的後臺執行,系統將對您的應用採取以下限制:
(1)應用不能訪問麥克風或攝像頭。
(2)使用連續報告模式的感測器(例如加速度計和陀螺儀)不會接收事件。
(3)使用變化或一次性報告模式的感測器不會接收事件。
六 前臺服務的應用必須請求 FOREGROUND_SERVICE 許可權
targetsdkversion>=28的應用在使用前臺服務的都需要進行必須請求 FOREGROUND_SERVICE 許可權。 這是普通許可權,因此,系統會自動為請求許可權的應用授予此許可權。
<uses-permission ndroid:name="android.permission.FOREGROUND_SERVICE"/>
七 預設情況下啟用網路傳輸層安全協議
AndroidP上,對應targetsdkversion>=28的應用需要為特定域名啟用明文,必須在應用的網路安全性配置中針對這些域名將 cleartextTrafficPermitted 顯式設定為 true,預設情況下明文傳輸會直接丟擲“java.io.IOException: Cleartext HTTP traffic to xxx.com not permitted”異常。
八 不允許共享 WebView 資料目錄
targetsdkversion>=28的應用不允許在不同程序之間共享一個 WebView 資料目錄。如果應用有多個程序使用 WebView、CookieManager 或 android.webkit 軟體包中的任何其他 API,則在第二個程序呼叫 WebView 函式時,應用將會崩潰。
九 應用禁止訪問xt_qtagui目錄的檔案
AndroidP後,不再允許應用直接讀取 /proc/net/xt_qtaguid 資料夾中的檔案。 這樣做是為了確保與某些根本不提供這些檔案的裝置保持一致。應用應該採用標準 API TrafficStats 和 NetworkStatsManager 進行訪問,此限制對所有執行AndroidP系統上的應用生效。
十 SELinux 禁止訪問應用的資料目錄
對於targetsdkversion>=28的應用,系統強制每個應用的 SELinux 沙盒對每個應用的私有資料目錄強制執行逐個應用的 SELinux 限制。現在,不允許直接通過路徑訪問其他應用的資料目錄。應用可以繼續使用程序間通訊 (IPC) 機制(包括通過傳遞 FD)共享資料,例如可以採用FileProvider。
尾言
為自己技術增值,量變引起質變.物件亦來源於生活,模式亦來源於驗證的OO經驗,那麼請學會使用輪子,再到感受制造輪子的樂趣,你會發現原來程式設計那麼美妙.如有錯誤或不當之處,請讀者留言,博主好吸取經驗,互相交流學習
參考連結
(1)AndroidP所有應用行為變更:https://developer.android.com/about/versions/pie/android-9.0-changes-all
(2)AndroidP targetSDK 28應用行為變更:https://developer.android.com/about/versions/pie/android-9.0-changes-28
(3)AndroidP 電源管理:https://developer.android.com/about/versions/pie/power
(4)pixles系列映象升級:https://developers.google.com/android/images