Android 11 開發者預覽版計劃從 2020 年 2 月啓動,到向 AOSP 和 OEM 提供最終的公開版本時結束,最終版本預計將於 2020 年第 3 季度發佈。那就是說等我們真正用上正式版的時間大概是九、十月份,不過因爲疫情原因可能會有些許推遲,希望疫情能早日結束吧!
附上谷歌官網放出的時間線:
很多小夥伴說剛剛用上了Android 10完成了版本適配,然而Android 11就已經到來了,安卓仔表示太難了...
雖然有些不情願,但是想着系統版本升級肯定是爲了Android系統更加完善,想想還是挺好的一件事。那就讓我們一起來看看這次Android 11給我們帶來了什麼吧 !
版本特性
對於用戶來說有哪些重要更新呢?
無縫更新
無縫更新會在Android 11 系統啓動時需要虛擬A / B兩個分區以減少由系統更新引起的停機時間,並提供一種在更新出現問題時可以恢復的機制。
Android系統更新時手機會啓動進入恢復狀態,並且可能會停留在“安裝系統更新”屏幕上長達25分鐘。這將導致大量的停機時間,在此期間您將無法運行任何APP,查看任何短信或接聽任何電話。發生停機是因爲更新系統文件時需要使系統分區脫機,但是無縫更新系統通使用兩個系統分區來解決這個問題。
優化5G支持
Android 11 帶來了全新的鏈接 API,用以支持 5G 網絡,因此可以充分利用 5G 提供的改進的速度和延遲,如在檢測到高質量網絡時,使 APP 自動提供高質量視頻。
動態計量API
使用此API,你可以檢查連接是否未計量,如果是,則提供更高的分辨率或質量,從而可能使用更多數據。擴展了API的範圍,使其包含蜂窩網絡,以便您可以識別運營商在連接到運營商的5G網絡時提供真正未計量數據的用戶。
帶寬估算器API
已更新了適用於5G的API,以使其更易於檢查下行/上行帶寬,而無需輪詢網絡或計算您自己的估算值。如果調制解調器不提供支持,我們將基於當前連接進行默認估算。
打開飛行模式,藍牙耳機不斷連
在 Android 11 開發者預覽版中,用戶連接藍牙耳機後,開啓飛行模式依然支持藍牙不斷連,並且還有消息提醒。
滾動截屏/長截圖
雖然很多手機廠商深度定製系統中早已集成,但是原生Android 11系統總算是支持了,也不錯了。
電池共享
電池共享功能類似於“反向無線充電”,用戶可以與其他兼容設備(包括智能手錶,耳機等)共享 Pixel 的電池。
在快速回復中使用富媒體
從 Android 11 開始,用戶可以在快速回復中插入圖片和其他富媒體內容。
懸浮聊天氣泡
Android 11 的新增了懸浮聊天氣泡功能,只要 APP 使用全新的 API,就可以將正在進行的對話以氣泡的形式懸浮在屏幕中。
隱私和權限
Android 11 新增了關於位置、麥克風和攝像頭的一次性權限許可。也就是說,獲得一次性權限許可的 APP 在下次使用時,依然要詢問用戶獲取授權。
屏幕錄像
屏幕錄像曾在 Android 10 的早期版本中出現,但隨後被刪除了。隨着 Android 11 開發者預覽版的推出,屏幕錄像功能又再次上線。
對於開發人員適配需要注意哪些呢?
存儲機制更新
權限更新
應用包可見性
前臺服務類型
消息框(Toast)的更新
支持併發使用多個攝像頭
其他一些新功能
附官網重大隱私權變更圖:
存儲機制更新
分區存儲強制執行
Android10 就開始引進了分區存儲功能,分區存儲主要是將共享存儲去分爲各個集合,並限制應用對此區域隨意訪問
清晰的應用歸屬
對應用數據的保護
對用戶數據的保護
大家都知道Android10 提供了requestLegacyExternalStorage = true 選擇退出分區存儲,在Android11中就將會強制使用分區存儲了。
不過官方爲了給開發者更多時間進行測試,以 Android 10(API 級別 29)爲目標平臺的應用仍可請求 requestLegacyExternalStorage 屬性。應用可以利用此標記暫時停用與分區存儲相關的變更,例如授予對不同目錄和不同類型的媒體文件的訪問權限。當您將應用更新爲以 Android 11 爲目標平臺後,系統會忽略 requestLegacyExternalStorage 標記。
保持與 Android 10 的兼容性
如果應用在 Android 10 設備上運行時選擇退出分區存儲,建議您繼續在應用的清單文件中將 requestLegacyExternalStorage 設爲 true。這樣,應用就可以在運行 Android 10 的設備上繼續按預期運行。
將數據遷移到使用分區存儲時可見的目錄
如果您的應用使用舊版存儲模型且之前以 Android 10 或更低版本爲目標平臺,您可能會將數據存儲到啓用分區存儲模型後您的應用無法訪問的目錄中。在以 Android 11 爲目標平臺之前,請將數據遷移到與分區存儲兼容的目錄。在大多數情況下,您可以將數據遷移到您的應用專用目錄。
如果您有需要遷移的數據,當用戶升級到以 Android 11 爲目標平臺的新版應用時,可以保留舊版存儲模型。這樣,用戶就可以保留對您的應用之前用於保存數據的目錄中存儲的應用數據的訪問權限。如需啓用舊版存儲模型以進行升級,請在應用的清單中將 preserveLegacyExternalStorage 屬性設爲 true。
注意:大多數應用都不需要使用 preserveLegacyExternalStorage。此標記僅適用於這樣一種情況:您將應用數據遷移到了與分區存儲兼容的位置,並且希望用戶在更新您的應用時保留對數據的訪問權限。使用此標記會導致更難以測試分區存儲對您應用的用戶有何影響,因爲當用戶更新您的應用時,它會繼續使用舊版存儲模型。
如果您使用 preserveLegacyExternalStorage,舊版存儲模型只在用戶卸載您的應用之前保持有效。如果用戶在搭載 Android 11 的設備上安裝或重新安裝您的應用,那麼無論 preserveLegacyExternalStorage 的值是什麼,您的應用都無法停用分區存儲模型。
測試分區存儲如需在您的應用中啓用分區存儲,而不考慮應用的目標 SDK 版本和清單標記值,請啓用以下應用兼容性標記:
DEFAULT_SCOPED_STORAGE(默認情況下,對所有應用處於啓用狀態) FORCE_ENABLE_SCOPED_STORAGE(默認情況下,對所有應用處於停用狀態) 如需停用分區存儲而改用舊版存儲模型,請取消設置這兩個標記。
媒體文件訪問權限
存儲權限
針對所有應用
存儲(Storage)運行時權限已更名爲文件和媒體(Files & Media)
針對Android11爲目標平臺的應用
WRITE_EXTERNALSTORAGE 和WRITE_MEDIA_STORAGE不再提供任何其他訪問權限
管理設備存儲空間
如果您的應用是文件管理器應用並且在 Android 11 上運行,它就不能再刪除其他應用的緩存文件,即使您的應用具有所有文件訪問權限也是如此。相反,您的應用應執行以下操作:
通過調用 ACTION_MANAGE_STORAGE intent 操作檢查可用空間。如果設備上的可用空間不足,請提示用戶同意讓您的應用清除所有緩存。爲此,請調用 ACTION_CLEAR_APP_CACHE intent 操作。
注意:ACTION_CLEAR_APP_CACHE intent 操作會嚴重影響設備的電池續航時間,並且可能會從設備上移除大量的文件。
MediaStore API 和 批量處理
Android 11中未經過用戶同意是不能再刪除其他應用的文件,即使您的應用具有所有文件訪問權限也是如此。
允許進行批量編輯/刪除
MediaStore API 中添加了多種方法
createWriteRequest()
用戶嚮應用授予對指定媒體文件組的寫入訪問權限的請求。
createFavoriteRequest()
用戶將設備上指定的媒體文件標記爲“收藏”的請求。對該文件具有讀取訪問權限的任何應用都可以看到用戶已將該文件標記爲“收藏”。
createTrashRequest()
用戶將指定的媒體文件放入設備垃圾箱的請求。垃圾箱中的內容會在系統定義的時間段後被永久刪除。
createDeleteRequest()
用戶立即永久刪除指定的媒體文件(而不是先將其放入垃圾箱)的請求。
申請媒體文件的批量操作權限如下:(感謝google團隊分享)
使用原始路徑訪問文件
Android 10是不允許直接使用文件路徑這種方式訪問的,但是有些第三方框架調用native方法很難避免直接使用文件路徑的方式,所以Android 11 開始允許具有 READ_EXTERNAL_STORAGE 權限的應用讀取使用直接文件路徑和原生庫的設備媒體文件。藉助此功能,您的應用與第三方媒體庫會配合使用得更順暢。
如果您使用直接文件路徑和原生庫,建議您在應用的清單文件中將 requestLegacyExternalStorage 設置爲 true,從而選擇停用分區存儲。這樣就能保證各個版本之前的兼容了。
需要注意的地方:
直接訪問路徑是基於MediaStore的,直接使用必定會造成性能下降,對性能的影響取決於I/O模式
打開和第一次讀取相對來說性能影響會比較明顯
如果第三方庫需要直接訪問路徑的時候才考慮用它,而爲了性能考慮還是儘可能的使用MediaStore API
訪問其他應用的私有目錄
在 Android 11 上,應用無法再訪問外部存儲設備中的任何其他應用的專用於特定應用的目錄中的文件。
文檔訪問限制
爲讓開發者有時間進行測試,以下與存儲訪問框架 (SAF) 相關的變更只有在應用以 Android 11 爲目標平臺時纔會生效。
訪問目錄
您無法再使用 ACTION_OPEN_DOCUMENT_TREE intent 操作請求訪問以下目錄:
內部存儲卷的根目錄。
設備製造商認爲可靠的各個 SD 卡卷的根目錄,無論該卡是模擬卡還是可移除的卡。Download 目錄。
訪問文件
您無法再使用 ACTION_OPEN_DOCUMENT_TREE 或 ACTION_OPEN_DOCUMENT intent 操作請求用戶從以下目錄中選擇單獨的文件:
Android/data/ 目錄及其所有子目錄。
Android/obb/ 目錄及其所有子目錄。
所有文件訪問權限
如果你的應用需要訪問大量共享存儲區的文件可以通過以下方式獲取“所有文件訪問權限”:
聲明 MANAGE_EXTERNAL_STORAGE 權限。
使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent
操作將用戶引導至一個系統設置頁面,在該頁面上,用戶可以爲您的應用啓用以下選項:授予所有文件的管理權限。
“所有文件訪問權限”可授予以下權限:
對共享的存儲空間內所有文件的讀寫訪問權限。
對 MediaStore.Files 表的內容的訪問權限。
該權限適用於文件管理和備份還原等批量處理功能的應用使用的,如果您只需要訪問一個文件和幾個文件這樣的功能時使用存儲訪問框架就可以而不是獲取“所有文件訪問權限”,期待Google play作出更進一步的規範,明確合規/不合規的用例。
權限更新
隨着用戶更加在意應用的隱私性,在Android 11 中,用戶能夠針對位置信息、麥克風和攝像頭指定更精細的權限
一次性權限
Android 11 中加入了一次性權限,每當應用請求與位置信息、麥克風或攝像頭相關的權限時,面向用戶的權限對話框就會包含僅限這一次選項。如果用戶在對話框中選擇此選項,系統會嚮應用授予臨時的單次授權。當使用完功能之後,系統就會回收此次權限。
然後,應用可以在一段時間內訪問相關數據,具體時間取決於應用的行爲和用戶的操作:
當應用的 Activity 可見時,應用可以訪問相關數據。
如果用戶將應用轉爲後臺運行,應用可以在短時間內繼續訪問相關數據。
如果您在 Activity 可見時啓動了一項前臺服務,並且用戶隨後將您的應用轉到後臺,那麼您的應用可以繼續訪問相關數據,直到該前臺服務停止。
如果用戶撤消單次授權(例如在系統設置中撤消),無論您是否啓動了前臺服務,應用都無法訪問相關數據。與任何權限一樣,如果用戶撤消了應用的單次授權,應用進程就會終止。
關於適配:無需任何改動!!!
如果您的應用已遵循與權限相關的最佳做法,您無需更改應用即可支持單次授權。
需要特別指出的是,在嘗試訪問受某項權限保護的信息之前,請務必檢查應用是否具有該權限;如果應用首次請求權限,或者如果用戶已撤消權限,請完成以下流程:
1.調用 shouldShowRequestPermissionRationale()。如果此方法返回 true,請在您的應用中顯示一個界面元素,向用戶說明您的應用爲何需要獲取權限。
2.請求權限。
再次請求權限時顯示的對話框
當用戶下次打開應用並且應用隨後再次請求與位置信息、麥克風或攝像頭相關的權限時,系統會再次提示用戶。
請求權限的流程(感謝google團隊分享):
第一次申請權限默認是不會有權限的調用原因,當用戶第一次拒絕了在這個回調裏解釋其權限調用原因,當用戶知道了原因,再次申請權限系統就會調shouldShowRequestPermissionRationale() = true,開發者就可以在這個判斷裏面彈出權限的解釋並讓用戶決定是否繼續申請權限調取系統權限框或者(no thanks),系統的權限框調用了二次都拒絕了的話,就再也不會顯示了。
權限對話框的可見性
Android 11 不建議重複請求特定權限組中的權限。在應用安裝到設備上後,如果用戶在使用過程中兩次針對某項特定的權限點按拒絕,此操作表示其希望以後請求相應權限組中的該權限時“不再詢問”。
系統還對與點按拒絕選項相仿的操作的響應行爲做出了定義:
如果用戶按返回按鈕關閉權限對話框,此操作不算作“拒絕”操作。
如果用戶使用 requestPermissions() 從您的應用轉到系統設置,然後按返回按鈕,此操作就算作“拒絕”操作。
電話號碼
Android 11 更改了您的應用在讀取電話號碼時使用的與電話相關的權限。
如果您的應用以 Android 11 爲目標平臺,並且需要訪問以下列表中顯示的電話號碼 API,則必須請求 READ_PHONE_NUMBERS 權限,而不是 READ_PHONE_STATE 權限。
TelephonyManager 類和 TelecomManager 類中的 getLine1Number() 方法。
TelephonyManager 類中不受支持的 getMsisdn() 方法。
如果您的應用聲明 READ_PHONE_STATE 以調用前面列表中的方法以外的方法,您可以繼續在所有 Android 版本中請求 READ_PHONE_STATE。不過,如果您僅對前面列表中的方法使用 READ_PHONE_STATE 權限,請按以下方式更新您的清單文件:
更改 READ_PHONE_STATE 的聲明,以使您的應用僅在 Android 10(API 級別 29)及更低版本中使用該權限。
添加 READ_PHONE_NUMBERS 權限。
以下清單聲明代碼段演示了此過程:
<manifest>
<!-- Grants the READ_PHONE_STATE permission only on devices that run
Android 10 (API level 29) and lower. -->
<uses-permission android:name="READ_PHONE_STATE"
android:maxSdkVersion="29" />
<uses-permission android:name="READ_PHONE_NUMBERS" />
</manifest>
位置權限
關於位置權限有前臺位置權限和後臺位置權限,在目標版本Android R以下版本的時候默認是申請前臺位置權限的時候就同時申請了後臺位置權限,而Android R開始是不能同時申請的,只能先申請前臺位置權限再申請後臺位置權限。
後臺位置信息訪問權限
Android 11 通過以下方法進一步強調了用戶對位置信息的控制:添加了單次授權,並移除了用戶通過應用內提示授予 ACCESS_BACKGROUND_LOCATION 權限的功能
如果您的應用以 Android 11 爲目標平臺,您可以創建自定義界面,向用戶解釋您的應用爲什麼需要 ACCESS_BACKGROUND_LOCATION 權限。
如果您的應用以較低版本爲目標平臺,您必須使用系統提供的界面,該界面中指出您的應用需要在後臺訪問位置信息,即使您的應用沒有被使用。
創建自定義界面
如果您的應用以 Android 11 爲目標平臺,您可以顯示自定義界面,用於更清楚地向用戶解釋您的應用爲什麼需要 ACCESS_BACKGROUND_LOCATION 權限。
請遵循本部分中的準則,創建用戶更容易理解的界面。
說明應用對後臺位置信息的要求 如需在您的應用中請求 ACCESS_BACKGROUND_LOCATION,您的應用必須先獲取前臺位置權限,即 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION。如果您嘗試同時請求 ACCESS_BACKGROUND_LOCATION 和其他任何權限,系統會拋出異常。
當有了前臺位置權限後,你需要彈出爲什麼請求後臺位置權限的原因的對話框:
授予權限。如果用戶選擇此選項,就對 ACCESS_BACKGROUND_LOCATION 發出權限請求。系統會將用戶定向到系統設置,以完成授予此權限的過程。
爲了幫助用戶在設置中找到用於授予 ACCESS_BACKGROUND_LOCATION 權限的選項,您可以在應用的界面中爲相應的設置選項添加用戶可見的標籤。getBackgroundPermissionOptionLabel() 方法可提供根據用戶的設備語言偏好設置進行了本地化的標籤。
不授予權限。如果用戶不授予權限,他們應能夠繼續使用應用。如果用戶選擇此選項,應用可以正常繼續運行,但可能會讓用戶離開需要後臺位置信息訪問權限的功能。
請注意,即使在嚮應用授予 ACCESS_BACKGROUND_LOCATION 權限後,用戶也可以在系統設置中將其位置信息訪問權限更改爲僅在使用該應用時允許或每次都詢問。用戶也可以完全拒絕應用訪問位置信息。
根據需要將用戶定向到系統設置
如果用戶同意向您的應用授予 ACCESS_BACKGROUND_LOCATION 權限,您的應用應將用戶定向系統設置裏去選擇開啓權限
重定向到系統設置受限制
在應用讓用戶轉到其在系統設置中的權限頁面後,用戶可能會選擇始終允許以外的位置信息訪問權限級別,如拒絕。Android 11 最多允許應用將用戶從一個界面引導至系統設置兩次。因此,請務必清楚地向用戶解釋應用功能爲什麼需要在後臺訪問位置信息。
當應用達到此限制時,您仍然可以調用一個 intent,以將用戶定向到應用在系統設置中的信息頁面。在該頁面中,用戶可以轉到應用的權限頁面。如需加載應用信息頁面,請使用 Settings.ACTION_APPLICATION_DETAILS_SETTINGS intent 操作。
應用包可見性
Android 11 更改了應用查詢同一設備上的其他已安裝應用以及與之交互的方式。如果您的應用以 Android 11 爲目標平臺,您可能需要在應用的清單文件中添加 元素,以便系統瞭解應向您的應用顯示哪些其他應用。
查詢特定軟件包及與之交互
如果您知道要查詢或與之交互的一組特定應用(例如,與您的應用集成的應用或您使用其服務的應用),請將其軟件包名稱添加到 標記內的一組 元素中:
<manifest package="com.example.game">
<queries>
<package android:name="com.example.store" />
<package android:name="com.example.services" />
</queries>
...
</manifest>
在給定 intent 過濾器的情況下查詢應用及與之交互
您的應用可能需要查詢一組具有特定用途的應用或與之交互,但您可能不知道要添加的具體軟件包名稱。在這種情況下,您可以在 標記中列出 intent 過濾器簽名。然後,您的應用就可以發現具有匹配的 標記的應用。
以下示例允許您的應用看到支持 JPEG 圖片共享功能的已安裝應用:
<manifest package="com.example.game">
<queries>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="image/jpeg" />
</intent>
</queries>
...
</manifest>
查詢所有應用及與之交互
在極少數情況下,您的應用可能需要查詢設備上的所有已安裝應用或與之交互,不管這些應用包含哪些組件。例如,Google Play 等應用商店。爲了允許您的應用看到其他所有已安裝應用,Android 11 引入了 QUERY_ALL_PACKAGES 權限。
在即將推出的開發者預覽版中,Google Play 會爲需要此權限的應用提供相關指南,敬請期待。
不受變更影響的用例
以下列表包含幾個不需要 聲明的用例示例:
目標應用是您自己的應用。
您可以使用隱式 intent 啓動 Activity。您的應用可能會限制其使用隱式 intent 與其他應用交互的方式。
您的應用與實現 Android 核心功能的某些系統軟件包(如媒體提供程序)交互。其他應用期望從您的應用獲得結果。當您的應用是內容提供程序時、當其他應用通過調用 startActivityForResult() 調用您的應用時,以及當您的應用是其他應用嘗試啓動或連接到的服務時,會出現這種情況。
例如,如果其他應用向您應用中的內容提供程序發出請求,系統將允許您的應用看到該其他應用。
在非瀏覽器應用中啓動網絡 intent
如果你想通過應用打開一個url,但是又不想打開的方式框裏出現通過瀏覽器打開選項,則可以按照如下方式實現
如果手機中除了瀏覽器外沒有適合打開該url的方式,則會拋出ActivityNotFoundException異常,可以獲取到這個異常進行下一步的處理。
前臺服務類型
從 Android 9 開始,應用僅限於在前臺訪問攝像頭和麥克風。爲了進一步保護用戶,Android 11 更改了前臺服務訪問攝像頭和麥克風相關數據的方式。如果您的應用以 Android 11 爲目標平臺並且在某項前臺服務中訪問這些類型的數據,您需要在該前臺服務的聲明的 foregroundServiceType 屬性中添加新的 camera 和 microphone 類型。
使用位置信息和攝像頭的示例
如果應用中的某項前臺服務需要訪問與設備的位置信息和攝像頭相關的數據,請按以下代碼段所示聲明該服務:
<manifest>
...
<service ... android:foregroundServiceType="location|camera" />
</manifest>
使用位置信息、攝像頭和麥克風的示例
如果某項前臺服務需要訪問位置信息、攝像頭和麥克風,請按以下代碼段所示聲明該服務:
<manifest>
...
<service ...
android:foregroundServiceType="location|camera|microphone" />
</manifest>
消息框(Toast)的更新
Android 11 爲了保護用戶而棄用了自定義消息框視圖。爲了給開發者更多的時間來適應這些變更,只有在您的應用以 Android 11 爲目標平臺時,這些變更纔會生效。
需要注意的地方:
如果包含自定義視圖(使用了setView())的消息框是以 Android 11 爲目標平臺的應用從後臺發送的,則系統會屏蔽這些消息框。
仍允許使用文本消息框;此類消息框是使用 Toast.makeText() 創建的,並不調用 setView()
如果您希望在消息框(文本消息框或自定義消息框)出現或消失時收到通知,請使用新的 addCallback() 方法。
文本消息框 API 變更(以 Android 11 爲目標平臺的應用)
以下方法的返回值並不反映實際值,因此不應在您的應用中依賴於它們:
以下方法是空操作,因此您的應用不應使用它們:
setMargin() setGravity()
getHorizontalMargin() getVerticalMargin() getGravity() getXOffset() getYOffset()
getView() 方法返回 null
支持併發使用多個攝像頭
Android 11 添加了 API 以查詢對同時使用多個攝像頭(包括前置攝像頭和後置攝像頭)的支持。
如需在運行應用的設備上檢查支持情況,請使用以下方法:
getConcurrentCameraIds() 可返回攝像頭 ID 組合 Set,這些組合可與有保證的數據流組合併發進行流式傳輸(如果它們是由同一應用進程配置的)。
isConcurrentSessionConfigurationSupported() 可查詢攝像頭設備是否可以併發支持相應的會話配置。
其他一些新功能
更好地支持瀑布屏
Android 11 提供了一些 API 以支持瀑布屏,這是一種無邊框的全面屏。這種顯示屏被視爲劉海屏的變體。現有的 DisplayCutout.getSafeInset…() 方法現在會返回能夠避開瀑布區域以及劉海的安全邊襯區。如需在瀑布區域中呈現您的應用內容,請執行以下操作:
調用 DisplayCutout.getWaterfallInsets() 以獲取瀑布邊襯區的精確尺寸。
將窗口布局屬性 layoutInDisplayCutoutMode 設爲 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,以允許窗口延伸到屏幕各個邊緣上的劉海和瀑布區域。您必須確保劉海或瀑布區域中沒有重要的內容。
合頁角度傳感器和可摺疊設備
使用 Android 11,可以通過以下方法使運行在採用合頁式屏幕配置的設備上的應用能夠確定合頁角度:提供具有 TYPE_HINGE_ANGLE 的新傳感器,以及新的 SensorEvent,後者可以監控合頁角度,並提供設備的兩部分之間的角度測量值。您可以使用這些原始測量值在用戶操作設備時執行精細的動畫顯示。
儘管對於某些類型的應用(例如啓動器和壁紙)而言,知道確切的合頁角度會很有用,但大多數應用都應該使用 Jetpack 窗口管理器庫,通過調用 DeviceState.getPosture() 檢索設備狀態。
或者,您的應用也可以調用 registerDeviceStateChangeCallback(),以在 DeviceState 更改時收到通知,並在狀態發生變化時做出響應。
由於目前市場上已經有且未來還會出現更多不同的窗口和設備配置,因此對設備狀態做出響應更加安全可靠。
5G 圖標顯示
在 Android 11(API 級別“R”)及更高版本中,具有 android.Manifest.permission.READ_PHONE_STATE 權限的應用可以通過 PhoneStateListener.onDisplayInfoChanged() 請求更新電話顯示信息,其中包括用於營銷和品牌塑造的無線接入技術信息。
這款新 API 提供了適用於不同運營商的各種 5G 圖標顯示解決方案。支持的技術包括:
LTE
採用載波聚合技術的 LTE (LTE+)
高級專業版 LTE (5Ge)
NR (5G)
毫米波移動網絡頻段上的 NR (5G+)
作者:Rain_Shieh
鏈接:https://juejin.im/post/5ed339546fb9a047a11da81a
關注我獲取更多知識或者投稿