十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問題一站解決
作者 / Android 產(chǎn)品經(jīng)理 Diana Wong
創(chuàng)新互聯(lián)建站專注于宜陽(yáng)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城系統(tǒng)網(wǎng)站開發(fā)。宜陽(yáng)網(wǎng)站建設(shè)公司,為宜陽(yáng)等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
在往期 #11WeeksOfAndroid 系列文章中我們介紹了 聯(lián)系人和身份 、 隱私和安全 ,本期將聚焦 Android 11 兼容性 。我們將為大家陸續(xù)帶來(lái) #11WeeksOfAndroid 內(nèi)容,深入探討 Android 的各個(gè)關(guān)鍵技術(shù)點(diǎn),您不會(huì)錯(cuò)過(guò)任何重要內(nèi)容。
本期我們將重點(diǎn)探討 Android 11 兼容性這一對(duì)所有開發(fā)者都非常重要的主題。對(duì)于 Android, 應(yīng)用兼容性 一詞指應(yīng)用可以在特定版本的 Android (通常是最新版本) 上正常運(yùn)行。
您可以前往官方網(wǎng)站詳細(xì)獲取可幫助您進(jìn)行兼容性測(cè)試的資源,以及本期所有關(guān)于該領(lǐng)域的實(shí)用內(nèi)容和資源!
在每次版本更新中,我們都希望盡量減少應(yīng)用適配 Android 所需的工作。在 Android 11 中,我們添加了新的流程、開發(fā)者工具和版本發(fā)布里程碑,以幫助我們最大程度地減少平臺(tái)更新帶來(lái)的影響,更輕松實(shí)現(xiàn)應(yīng)用的兼容性。
請(qǐng)繼續(xù)閱讀,詳細(xì)了解我們?nèi)绾魏?jiǎn)化 Android 11 中的應(yīng)用測(cè)試和調(diào)試流程。
測(cè)試應(yīng)用是否兼容 Android 新版本可能面臨很多挑戰(zhàn),尤其是應(yīng)用在受到多個(gè)平臺(tái)變更影響的情況下。此過(guò)程中可能會(huì)出現(xiàn)很多問題:
開發(fā)者社區(qū)為我們提供了大量相關(guān)問題的優(yōu)質(zhì)反饋。在 Android 11 中,我們?yōu)槠脚_(tái)添加了以下新工具,并在 Android Studio 中添加了新功能,因此您可以更加輕松的進(jìn)行測(cè)試。
和往年的更新一樣,Android 11 的一些平臺(tái)變更可能會(huì)影響您的應(yīng)用。盡管這些變更對(duì)于提升平臺(tái)性能至關(guān)重要,但我們會(huì)盡可能將這些變更安排在平臺(tái)的最新 targetSDKVersion 之后,以便減少對(duì)您的應(yīng)用的直接改動(dòng)。在 Android 11 中,我們還會(huì)將更多此類平臺(tái)變更添加到新的 兼容性框架 中。
您可以使用全新開發(fā)者工具,針對(duì)包含在兼容性框架內(nèi)的變更對(duì)應(yīng)用進(jìn)行測(cè)試和調(diào)試。
例如,我們已將包含在兼容性框架內(nèi)的變更設(shè)為可切換,您可以通過(guò)設(shè)備的開發(fā)者選項(xiàng)或使用 Android ADB 強(qiáng)制啟用或停用單個(gè)變更。Android 平臺(tái)會(huì)自動(dòng)調(diào)整內(nèi)部 API 邏輯,因此您無(wú)需更改 targetSDKVersion 或重新編譯應(yīng)用,即可執(zhí)行基本測(cè)試。此外,您可以隔離各項(xiàng)變更,從而節(jié)省發(fā)現(xiàn)和調(diào)試應(yīng)用中問題所需的時(shí)間。
在切換變更的啟用/停用狀態(tài)之前,您應(yīng)該通讀 行為變更列表 ,確定哪些變更可能會(huì)影響您的應(yīng)用。包含在兼容性框架內(nèi)的變更已在變更描述前列出相應(yīng)的 Change ID 和 Change Name。
一般來(lái)說(shuō),我們建議您從 影響所有應(yīng)用的行為變更 開始測(cè)試,因?yàn)闊o(wú)論 targetSDKVersion 如何,這些變更都可能對(duì)您的應(yīng)用造成影響。我們用下面這個(gè) targetSDKVersion 控制的變更為例,說(shuō)明您可以如何在不使用其他 targetSDK 重編譯應(yīng)用的情況下,對(duì)這些變更進(jìn)行測(cè)試。
在 后臺(tái)位置訪問變更 中,請(qǐng)求始終在后臺(tái)訪問位置的應(yīng)用會(huì)受影響。如果您的應(yīng)用受到這一變更的影響,那么從該變更開始測(cè)試是不錯(cuò)的選擇。此變更的名稱為 BACKGROUND_RATIONALE_CHANGE_ID,變更 ID 為 147316723。您需要先使用這些信息啟用此變更,然后再測(cè)試應(yīng)用因此受到的影響。
確定要測(cè)試的變更后,您可以使用開發(fā)者選項(xiàng)切換此變更的啟用/停用狀態(tài)。如要使用開發(fā)者選項(xiàng),請(qǐng)打開設(shè)備上的 "設(shè)置" 應(yīng)用,導(dǎo)航至 系統(tǒng) 高級(jí) 開發(fā)者選項(xiàng) 應(yīng)用兼容性變更 。
開發(fā)者選項(xiàng)中可切換的平臺(tái)變更,后臺(tái)位置訪問變更已啟用
在本例中,BACKGROUND_RATIONALE_CHANGE_ID 是唯一已啟用的變更,旨在最大程度縮小應(yīng)用可能遇到的各種問題的原因范圍。
您也可以使用 Logcat 或 ADB 識(shí)別已啟用的變更 ,或 使用 ADB 切換變更的啟用/停用狀態(tài) 。請(qǐng)注意,您只能在使用可調(diào)試應(yīng)用時(shí)切換變更。
啟用變更后,您可以使用常用的測(cè)試工作流來(lái)測(cè)試和調(diào)試應(yīng)用。如遇到問題,請(qǐng)查看日志,確定問題的原因。如果不確定問題是否由已啟用的平臺(tái)變更引起,您可以嘗試停用此變更,然后重新測(cè)試應(yīng)用的同一模塊。
如需了解其他相關(guān)示例,您可以觀看有關(guān) 測(cè)試 Android 11 中平臺(tái)變更的視頻 ,或閱讀 官方文檔 。
除了在新平臺(tái)上手動(dòng)進(jìn)行測(cè)試外,我們還簡(jiǎn)化了使用 Android Studio 在最新 Android 系統(tǒng)上運(yùn)行自動(dòng)化測(cè)試的流程。
從 Android Studio 4.2 開始,我們實(shí)現(xiàn)了在多個(gè)實(shí)體或虛擬設(shè)備上并行運(yùn)行插樁測(cè)試 (instrumentation tests)。現(xiàn)在,您可以在運(yùn)行測(cè)試的過(guò)程中,從目標(biāo)設(shè)備下拉菜單中選擇 多個(gè)設(shè)備 。
此功能旨在幫助您在開發(fā)周期中盡早發(fā)現(xiàn)問題,并讓您能夠比較不同 Android 設(shè)備之間的差異。您可以使用 視圖 工具窗口 運(yùn)行 下的新 測(cè)試矩陣 ,研究這些測(cè)試的結(jié)果。
請(qǐng)觀看有關(guān) 使用 Android Studio 測(cè)試應(yīng)用兼容性的視頻 ,或閱讀 官方文檔 。
我們建議您嘗試這些新工具,并 向我們發(fā)送反饋 ,告訴我們這些工具對(duì)您是否有用。我們希望這些工具能幫助您更輕松地測(cè)試 Android 11 應(yīng)用兼容情況。
Android 適用于眾多類型的設(shè)備,從手機(jī)到平板電腦和電視都能搭載使用。作為開發(fā)者,如此廣泛的設(shè)備類型能為您的應(yīng)用帶來(lái)廣大的潛在受眾群體。為了能在所有這些設(shè)備上順利運(yùn)行,應(yīng)用應(yīng)該容許部分設(shè)備功能的變化,并提供可適應(yīng)不同屏幕配置的靈活界面。
隨著您進(jìn)一步閱讀 Android 開發(fā)相關(guān)內(nèi)容,您可能會(huì)在各種語(yǔ)境下遇到“兼容性”一詞。兼容性有兩種類型:設(shè)備兼容性和應(yīng)用兼容性。
作為應(yīng)用開發(fā)者,您無(wú)需擔(dān)心設(shè)備是否兼容 Android,因?yàn)橹挥信c Android 兼容的設(shè)備才會(huì)附帶 Google Play 商店或該設(shè)備的官方手機(jī)應(yīng)用市場(chǎng)。因此,您可以放心,通過(guò)Google Play 商店和官方手機(jī)應(yīng)用市場(chǎng)安裝您的應(yīng)用的用戶使用的是 Android 兼容設(shè)備。
不過(guò),您確實(shí)需要考慮您的應(yīng)用是否兼容每一種可能的設(shè)備配置。由于 Android 以各種設(shè)備配置運(yùn)行,因此部分功能并不適用于所有設(shè)備。例如,某些設(shè)備可能未配備羅盤傳感器。如果應(yīng)用的核心功能需要使用羅盤傳感器,那么應(yīng)用只能與帶有羅盤傳感器的設(shè)備兼容。
應(yīng)用可通過(guò)平臺(tái) API 利用 Android 支持的各種功能。有些功能基于硬件(例如羅盤傳感器),有些功能基于軟件(如應(yīng)用窗口微件),有些功能則依賴于平臺(tái)版本。并非每臺(tái)設(shè)備都支持所有功能,因此您可能需要根據(jù)應(yīng)用所需的功能控制應(yīng)用在設(shè)備上的可用性。
要盡可能擴(kuò)大應(yīng)用的用戶群,您應(yīng)設(shè)法使用單個(gè) APK 支持盡可能多的設(shè)備配置。在大多數(shù)情況下,要實(shí)現(xiàn)這一目標(biāo),您可以在運(yùn)行時(shí)停用可選功能,并為應(yīng)用資源提供針對(duì)不同配置的替代選項(xiàng)(例如針對(duì)不同屏幕尺寸的不同布局)。不過(guò),如果需要,您可以根據(jù)以下設(shè)備特征,通過(guò) Google Play 商店限制應(yīng)用在設(shè)備上的可用性:
為了讓您根據(jù)設(shè)備功能管理應(yīng)用的可用性,Android 為可能并不適用于所有設(shè)備的任何硬件或軟件功能定義了功能 ID。例如,羅盤傳感器的功能 ID 為 FEATURE_SENSOR_COMPASS,而應(yīng)用微件的功能 ID 為 FEATURE_APP_WIDGETS。
根據(jù)需要,要在用戶的設(shè)備不具備特定功能時(shí)阻止用戶安裝您的應(yīng)用,您可以通過(guò)應(yīng)用清單文件中的uses-feature元素聲明這一點(diǎn)。
例如,如果您的應(yīng)用在沒有羅盤傳感器的設(shè)備上沒有意義,您可以使用以下清單標(biāo)記聲明需要羅盤傳感器:
Google Play 商店會(huì)將您的應(yīng)用所需的功能與每個(gè)用戶的設(shè)備上可用的功能進(jìn)行比較,以確定您的應(yīng)用是否與每臺(tái)設(shè)備兼容。如果設(shè)備不具備您的應(yīng)用所需的所有功能,則用戶無(wú)法安裝您的應(yīng)用。
但是,如果應(yīng)用的主要功能不需要某項(xiàng)設(shè)備功能,則應(yīng)將required屬性設(shè)置為 "false"并在運(yùn)行時(shí)檢查是否有該設(shè)備功能。如果應(yīng)用功能在當(dāng)前設(shè)備上不可用,請(qǐng)適當(dāng)降級(jí)相應(yīng)的應(yīng)用功能。例如,您可以通過(guò)調(diào)用hasSystemFeature()來(lái)查詢功能是否可用,如下所示:
Java
Kotlin
不同的設(shè)備可能會(huì)運(yùn)行不同版本的 Android 平臺(tái),例如 Android 4.0 或 Android 4.4。每個(gè)后續(xù)的平臺(tái)版本通常會(huì)添加之前版本中不可用的新 API。為表明可用的 API 集,每個(gè)平臺(tái)版本都會(huì)指定API 級(jí)別。例如,Android 1.0 是 API 級(jí)別 1,而 Android 4.4 是 API 級(jí)別 19。
通過(guò) API 級(jí)別,您可以使用uses-sdk清單標(biāo)記及其minSdkVersion屬性來(lái)聲明應(yīng)用兼容的最低版本。例如,Android 4.0(API 級(jí)別 14)中添加了 日歷提供程序 API。如果您的應(yīng)用在沒有這些 API 的情況下無(wú)法運(yùn)行,您應(yīng)將 API 級(jí)別 14 聲明為應(yīng)用的最低支持版本。
minSdkVersion屬性聲明應(yīng)用兼容的最低版本,targetSdkVersion屬性聲明應(yīng)用經(jīng)過(guò)優(yōu)化后適用的最高版本。
不過(guò),請(qǐng)注意uses-sdk元素中的屬性會(huì)被替換為build.gradle文件中的相應(yīng)屬性。因此,如果您使用的是 Android Studio,則必須在其中指定minSdkVersion和targetSdkVersion值:
要詳細(xì)了解build.gradle文件,請(qǐng)參閱 如何配置編譯版本 。
每個(gè)后續(xù)版本的 Android 都為使用之前平臺(tái)版本的 API 構(gòu)建的應(yīng)用提供兼容性,因此您的應(yīng)用應(yīng)始終與未來(lái)版本的 Android 兼容,同時(shí)使用已記錄的 Android API。
注意 : targetSdkVersion 屬性不會(huì)阻止您的應(yīng)用安裝在高于指定值的平臺(tái)版本上,但它很重要,因?yàn)樗蛳到y(tǒng)指示您的應(yīng)用是否應(yīng)繼承較新版本中的行為更改。如果您不將 targetSdkVersion 更新到最新版本,則系統(tǒng)會(huì)認(rèn)為您的應(yīng)用在最新版本上運(yùn)行時(shí)需要一些向后兼容性行為。例如,在 Android 4.4 中的行為更改 中,使用 AlarmManager API 創(chuàng)建的鬧鐘現(xiàn)在默認(rèn)不精確,因此系統(tǒng)可以批量處理應(yīng)用鬧鐘并節(jié)省系統(tǒng)電量,但如果您的目標(biāo) API 級(jí)別低于“19”,則系統(tǒng)會(huì)為您的應(yīng)用保留之前的 API 行為。
不過(guò),如果您的應(yīng)用使用的是較新平臺(tái)版本中添加的 API,但其主要功能并不需要這些 API,則應(yīng)在運(yùn)行時(shí)檢查 API 級(jí)別,并在 API 級(jí)別過(guò)低時(shí)適當(dāng)降級(jí)相應(yīng)的功能。在這種情況下,請(qǐng)將 minSdkVersion 盡量設(shè)置為適用于應(yīng)用主要功能的最低值,然后將當(dāng)前系統(tǒng)的版本 SDK_INT 與 Build.VERSION_CODES 中對(duì)應(yīng)于您要檢查的 API 級(jí)別的一個(gè)代號(hào)常量進(jìn)行比較。例如:
Android 可在各種尺寸的設(shè)備上運(yùn)行,包括手機(jī)、平板電腦和電視。為了按照屏幕類型對(duì)設(shè)備進(jìn)行分類,Android 為每種設(shè)備定義了兩個(gè)特征:屏幕尺寸(屏幕的物理尺寸)和屏幕密度(屏幕上像素的物理密度,稱為 DPI)。為了簡(jiǎn)化不同的配置,Android 將這些變體歸納成組,使它們更容易作為定位目標(biāo):
四種廣義的尺寸:小、標(biāo)準(zhǔn)、大和特大。
還有幾種廣義的密度:mdpi(中)、hdpi(高)、xhdpi(超高)、xxhdpi(超超高)等。
默認(rèn)情況下,您的應(yīng)用會(huì)兼容所有屏幕尺寸和密度,因?yàn)橄到y(tǒng)會(huì)根據(jù)需要對(duì)各個(gè)屏幕的界面布局和圖片資源進(jìn)行相應(yīng)的調(diào)整。不過(guò),您應(yīng)針對(duì)不同的屏幕尺寸添加專門的布局,針對(duì)常見的屏幕密度添加優(yōu)化的位圖圖片,以優(yōu)化每種屏幕配置的用戶體驗(yàn)。
Android 12之后系統(tǒng)就不允許自由訪問外部存儲(chǔ)了,只能訪問指定的外部存儲(chǔ)存儲(chǔ),例如:context.getExternalFilesDir(Environment.type)下的外部存儲(chǔ),或者其他/Android/data/data下的外部存儲(chǔ)。
老規(guī)矩了,訪問外部存儲(chǔ)前需要申請(qǐng)權(quán)限。
此時(shí)不需要申請(qǐng)權(quán)限了,可以直接訪問。如果你要分享就需要添加FileProvider配置。
WRITE_EXTERNAL_STORAGE when targeting Android 10
打開瀏覽器以后,點(diǎn)擊菜單中偏好設(shè)置;進(jìn)入偏好設(shè)置后,點(diǎn)擊進(jìn)入高級(jí)設(shè)置標(biāo)簽,勾選顯示開發(fā)的菜單;進(jìn)入開發(fā)的菜單中,找到用戶代理,可以看到兼容模式,點(diǎn)擊進(jìn)入,并且開啟兼容模式。
拓展資料:
兼容性:
兼容性(compatibility)是指硬件之間、軟件之間或是軟硬件組合系統(tǒng)之間的相互協(xié)調(diào)工作的程度。兼容的概念比較廣,相對(duì)于硬件來(lái)說(shuō),幾種不同的電腦部件,如CPU、主板、顯示卡等,如果在工作時(shí)能夠相互配合、穩(wěn)定地工作,就說(shuō)它們之間的兼容性比較好,反之就是兼容性不好。
對(duì)于軟件的兼容性,指的是指某個(gè)軟件能穩(wěn)定地工作在若干個(gè)操作系統(tǒng)之中,而不會(huì)出現(xiàn)意外的退出等問題。
在軟件行業(yè),一種是指某個(gè)軟件能穩(wěn)定地工作在若干個(gè)操作系統(tǒng)之中,就說(shuō)明這個(gè)軟件對(duì)于各系統(tǒng)有良好的兼容性。
再就是在多任務(wù)操作系統(tǒng)中,幾個(gè)同時(shí)運(yùn)行的軟件之間,如果能穩(wěn)定地工作,不頻繁崩潰、死機(jī),則稱之為它們之間的兼容性良好,反之兼容性不好。另一種就是軟件共享,幾個(gè)軟件之間無(wú)需復(fù)雜的轉(zhuǎn)換,即能方便地共享相互間的數(shù)據(jù),也稱為兼容。
Android 12 平臺(tái)包含一些行為變更,這些變更可能會(huì)影響您的應(yīng)用。以下行為變更將影響在 Android 12 上運(yùn)行的 所有應(yīng)用 ,無(wú)論采用哪種 targetSdkVersion 都不例外。您應(yīng)該測(cè)試您的應(yīng)用,然后根據(jù)需要進(jìn)行修改,以適當(dāng)?shù)刂С诌@些變更。
此外,請(qǐng)務(wù)必查看 僅影響以 Android 12 為目標(biāo)平臺(tái)的應(yīng)用的行為變更 列表。
在搭載 Android 12 及更高版本的設(shè)備上, 滾動(dòng)事件 的視覺行為發(fā)生了變化。
在 Android 11 及更低版本中,滾動(dòng)事件會(huì)使視覺元素發(fā)光。在 Android 12 及更高版本中,發(fā)生拖動(dòng)事件時(shí),視覺元素會(huì)拉伸和反彈;發(fā)生快速滑動(dòng)事件時(shí),它們會(huì)快速滑動(dòng)和反彈。
如需了解詳情,請(qǐng)參閱 動(dòng)畫演示滾動(dòng)手勢(shì) 指南。
如果您之前在 Android 11 或更低版本中實(shí)現(xiàn)了自定義啟動(dòng)畫面,則需要將您的應(yīng)用遷移到 SplashScreen API,以確保它從 Android 12 開始正確顯示。如果不遷移您的應(yīng)用,則可能會(huì)導(dǎo)致應(yīng)用啟動(dòng)體驗(yàn)變差或出乎預(yù)期。
如需了解相關(guān)說(shuō)明,請(qǐng)參閱 將現(xiàn)有的啟動(dòng)畫面實(shí)現(xiàn)遷移到 Android 12 。
此外,從 Android 12 開始,在所有應(yīng)用的 冷啟動(dòng) 和 溫啟動(dòng) 期間,系統(tǒng)始終會(huì)應(yīng)用新的 Android 系統(tǒng)默認(rèn)啟動(dòng)畫面 。 默認(rèn)情況下,此系統(tǒng)默認(rèn)啟動(dòng)畫面由應(yīng)用的啟動(dòng)器圖標(biāo)元素和主題的 windowBackground (如果是單色)構(gòu)成。
如需了解詳情,請(qǐng)參閱 啟動(dòng)畫面開發(fā)者指南 。
從 Android 12(API 級(jí)別 31)開始,僅當(dāng)您的應(yīng)用獲準(zhǔn)處理某個(gè)通用網(wǎng)絡(luò) intent 中包含的特定網(wǎng)域時(shí),該網(wǎng)絡(luò) intent 才會(huì)解析為應(yīng)用中的 activity。如果您的應(yīng)用未獲準(zhǔn)處理相應(yīng)的網(wǎng)域,則該網(wǎng)絡(luò) intent 會(huì)解析為用戶的默認(rèn)瀏覽器應(yīng)用。
應(yīng)用可通過(guò)執(zhí)行以下某項(xiàng)操作來(lái)獲準(zhǔn)處理相應(yīng)的網(wǎng)域:
如果您的應(yīng)用調(diào)用網(wǎng)絡(luò) intent,不妨考慮添加一個(gè)提示或?qū)υ捒?,要求用戶確認(rèn)操作。
Android 12 整合了現(xiàn)有行為,讓用戶可以 在沉浸模式下更輕松地執(zhí)行手勢(shì)導(dǎo)航命令 。此外,Android 12 還為 粘性沉浸模式提供了向后兼容性行為 。
Android 設(shè)備有許多不同的外形規(guī)格,如大屏設(shè)備、平板電腦和可折疊設(shè)備。為了針對(duì)每種設(shè)備適當(dāng)?shù)爻尸F(xiàn)內(nèi)容,您的應(yīng)用需要確定屏幕或顯示屏尺寸。隨著時(shí)間的推移,Android 提供了不同的 API 來(lái)檢索這些信息。在 Android 11 中,我們引入了 WindowMetrics API 并廢棄了以下方法:
在 Android 12 中,我們繼續(xù)建議使用 WindowMetrics ,并且正在逐步廢棄以下方法:
為了緩解應(yīng)用使用 Display API 檢索應(yīng)用邊界的行為,Android 12 限制了 API 為不完全可調(diào)整大小的應(yīng)用返回的值。這可能會(huì)對(duì)將此信息與 MediaProjection 一起使用的應(yīng)用產(chǎn)生影響。
應(yīng)用應(yīng)使用 WindowMetrics API 查詢其窗口的邊界,并使用 Configuration.densityDpi 查詢當(dāng)前的密度。
為了與較低的 Android 版本實(shí)現(xiàn)更廣泛的兼容性,您可以使用 Jetpack WindowManager 庫(kù),它包含一個(gè) WindowMetrics 類,該類支持 Android 4.0(API 級(jí)別 14)及更高版本。
首先,確保應(yīng)用的 activity 完全可調(diào)整大小 。
activity 應(yīng)依賴于來(lái)自 activity 上下文的 WindowMetrics 來(lái)執(zhí)行任何與界面相關(guān)的工作,尤其是 WindowManager.getCurrentWindowMetrics() 或 Jetpack 的 WindowMetricsCalculator.computeCurrentWindowMetrics() 。
如果您的應(yīng)用創(chuàng)建了 MediaProjection ,則必須正確地調(diào)整邊界的大小,因?yàn)橥队皶?huì)捕獲運(yùn)行投影儀應(yīng)用的顯示分區(qū)。
如果應(yīng)用完全可調(diào)整大小,則 activity 上下文會(huì)返回正確的邊界,如下所示:
如果應(yīng)用并非完全可調(diào)整大小,則它必須從 WindowContext 實(shí)例進(jìn)行查詢,并使用 WindowManager.getMaximumWindowMetrics() 或 Jetpack 方法 WindowMetricsCalculator.computeMaximumWindowMetrics() 檢索 activity 邊界的 WindowMetrics 。
注意 :任何使用 MediaProjection 的庫(kù)也應(yīng)遵循這些建議,并查詢相應(yīng)的 WindowMetrics 。
Android 12 將多窗口模式作為標(biāo)準(zhǔn)行為。
在大屏設(shè)備 (sw = 600dp) 中,所有應(yīng)用都將在多窗口模式下運(yùn)行,無(wú)論應(yīng)用配置為何。如果 resizeableActivity="false" ,應(yīng)用會(huì)在必要時(shí)進(jìn)入兼容模式,以適應(yīng)顯示屏尺寸。
在小屏設(shè)備 (sw 600dp) 中,系統(tǒng)會(huì)檢查 activity 的 minWidth 和 minHeight ,來(lái)確定 activity 能否在多窗口模式下運(yùn)行。如果 resizeableActivity="false" ,則無(wú)論最小寬度和高度如何,應(yīng)用都無(wú)法在多窗口模式下運(yùn)行。
如需了解詳情,請(qǐng)參閱 多窗口模式支持 。
相機(jī)應(yīng)用通常假定設(shè)備的屏幕方向和相機(jī)預(yù)覽的寬高比呈固定關(guān)系。但是,大屏設(shè)備類型(例如可折疊設(shè)備)和顯示模式(例如多窗口和多屏幕)挑戰(zhàn)著這一假設(shè)。
在 Android 12 上,請(qǐng)求特定屏幕方向且不可調(diào)整大小 ( resizeableActivity="false" ) 的相機(jī)應(yīng)用會(huì)自動(dòng)進(jìn)入邊襯區(qū)人像模式,從而確保相機(jī)預(yù)覽的屏幕方向和寬高比正確。在可折疊設(shè)備和其他具有相機(jī)硬件抽象層 ( HAL ) 的設(shè)備上,會(huì)對(duì)相機(jī)輸出應(yīng)用額外的旋轉(zhuǎn)以補(bǔ)償相機(jī)傳感器方向,并會(huì)剪裁相機(jī)輸出以匹配應(yīng)用相機(jī)預(yù)覽的寬高比。無(wú)論設(shè)備屏幕方向如何以及設(shè)備是處于折疊狀態(tài)還是展開狀態(tài),剪裁和額外的旋轉(zhuǎn)可確保應(yīng)用正確呈現(xiàn)相機(jī)預(yù)覽。
除了 一些例外情況 之外,為了為短時(shí)間運(yùn)行的 前臺(tái)服務(wù) 提供流暢體驗(yàn),搭載 Android 12 或更高版本的設(shè)備可以將前臺(tái)服務(wù)通知的顯示延遲 10 秒。此更改使某些短期任務(wù)可在顯示通知之前完成。
Android 11(API 級(jí)別 30)引入了 受限存儲(chǔ)分區(qū) 作為應(yīng)用待機(jī)模式存儲(chǔ)分區(qū)。從 Android 12 開始,此存儲(chǔ)分區(qū)默認(rèn)處于活躍狀態(tài)。在所有存儲(chǔ)分區(qū)中,受限存儲(chǔ)分區(qū)的優(yōu)先級(jí)最低(限制最高)。存儲(chǔ)分區(qū)按優(yōu)先級(jí)從高到低的順序排列如下:
除了使用模式之外,系統(tǒng)還會(huì)考慮應(yīng)用的行為,以決定是否要將您的應(yīng)用放在受限存儲(chǔ)分區(qū)中。
如果您的應(yīng)用更負(fù)責(zé)地使用系統(tǒng)資源,就不太可能被放在受限存儲(chǔ)分區(qū)中。此外,如果用戶直接與您的應(yīng)用互動(dòng),系統(tǒng)會(huì)將其放在一個(gè)限制較少的存儲(chǔ)分區(qū)中。
如需檢查系統(tǒng)是否已將您的應(yīng)用放在受限存儲(chǔ)分區(qū)中,請(qǐng)調(diào)用 getAppStandbyBucket() 。如果此方法的返回值為 STANDBY_BUCKET_RESTRICTED ,則您的應(yīng)用在受限存儲(chǔ)分區(qū)中。
如需測(cè)試您的應(yīng)用在系統(tǒng)將其放在受限存儲(chǔ)分區(qū)中時(shí)的行為,您可以手動(dòng)將您的應(yīng)用移至該存儲(chǔ)分區(qū)。為此,請(qǐng)?jiān)诮K端窗口中運(yùn)行以下命令:
在搭載 Android 12 或更高版本的受支持設(shè)備上,用戶可以通過(guò)按一個(gè)切換開關(guān)選項(xiàng),為設(shè)備上的所有應(yīng)用啟用和停用攝像頭和麥克風(fēng)使用權(quán)限。用戶可以從 快捷設(shè)置 訪問可切換的選項(xiàng)(如圖 1 所示),也可以從系統(tǒng)設(shè)置中的“隱私設(shè)置”屏幕訪問。
詳細(xì)了解這些 切換開關(guān) 以及如何檢查您的應(yīng)用是否遵循了關(guān)于 CAMERA 和 RECORD_AUDIO 權(quán)限的最佳實(shí)踐。
在搭載 Android 12 或更高版本的設(shè)備上,當(dāng)應(yīng)用使用麥克風(fēng)或相機(jī)時(shí),圖標(biāo)會(huì)出現(xiàn)在狀態(tài)欄中。
詳細(xì)了解這些 指標(biāo) 以及如何檢查您的應(yīng)用是否遵循了關(guān)于 CAMERA 和 RECORD_AUDIO 權(quán)限的最佳實(shí)踐。
[圖片上傳中...(image-bd519-1643780883994-1)]
figcaption style="box-sizing: inherit; font-size: 14px; margin-top: -4px;" 圖 1. “快捷設(shè)置”中的麥克風(fēng)和攝像頭切換開關(guān)。/figcaption
[圖片上傳中...(image-f49bfd-1643780883994-0)]
figcaption style="box-sizing: inherit; font-size: 14px; margin-top: -4px;" 圖 2. 麥克風(fēng)和攝像頭指示標(biāo)志,顯示了最近的數(shù)據(jù)訪問。/figcaption
在搭載 Android 12 或更高版本的設(shè)備上,根據(jù)應(yīng)用對(duì)其他應(yīng)用的 軟件包可見性 ,以 Android 11(API 級(jí)別 30)或更高版本為目標(biāo)平臺(tái)且調(diào)用以下某種方法的應(yīng)用會(huì)收到一組過(guò)濾后的結(jié)果:
Android 12 移除了之前棄用的加密算法的許多 BouncyCastle 實(shí)現(xiàn),包括所有 AES 算法。系統(tǒng)改用這些算法的 Conscrypt 實(shí)現(xiàn)。
如果符合以下任何條件,則此變更會(huì)影響您的應(yīng)用:
在 Android 12 及更高版本中,當(dāng)某個(gè)應(yīng)用首次調(diào)用 getPrimaryClip() 以 從另一個(gè)應(yīng)用訪問剪輯數(shù)據(jù) 時(shí),會(huì)彈出一個(gè)消息框消息,通知用戶對(duì)剪貼板的訪問。
消息框消息內(nèi)的文本包含以下格式: var translate="no" style="box-sizing: inherit; color: var(--devsite-var-color); -webkit-font-smoothing: auto; font-weight: 500;"APP/var pasted from your clipboard.
注意 :您的應(yīng)用可能會(huì)調(diào)用 getPrimaryClipDescription() 以接收有關(guān) 剪貼板上當(dāng)前數(shù)據(jù)的信息 。當(dāng)您的應(yīng)用調(diào)用此方法時(shí),系統(tǒng)不會(huì)顯示消息框消息。
在 Android 12 及更高版本中, getPrimaryClipDescription() 可以檢測(cè)到以下詳細(xì)信息:
為了加強(qiáng)用戶與應(yīng)用和系統(tǒng)互動(dòng)時(shí)的控制,從 Android 12 開始,棄用了 ACTION_CLOSE_SYSTEM_DIALOGS intent 操作。除了 一些特殊情況 之外,當(dāng)應(yīng)用嘗試 調(diào)用包含此操作的 intent 時(shí),系統(tǒng)會(huì)基于應(yīng)用的目標(biāo) SDK 版本執(zhí)行以下操作之一:
在以下情況下,應(yīng)用仍然可以在 Android 12 或更高版本上關(guān)閉系統(tǒng)對(duì)話框:
為了維持系統(tǒng)安全并保持良好的用戶體驗(yàn),Android 12 會(huì)阻止應(yīng)用使用 觸摸事件 ,使用觸摸事件時(shí)疊加層會(huì)以不安全的方式遮掩應(yīng)用。 換言之,系統(tǒng)會(huì)屏蔽穿透某些窗口的觸摸操作,但 有一些例外情況 。
此變更會(huì)影響選擇讓觸摸操作穿透其窗口的應(yīng)用,例如使用 FLAG_NOT_TOUCHABLE 標(biāo)志。包括但不限于以下示例:
在以下情況下,允許執(zhí)行“穿透”觸摸操作:
如果系統(tǒng)屏蔽觸摸操作, Logcat 會(huì)記錄以下消息:
在搭載 Android 12 或更高版本的設(shè)備上,不受信任的觸摸功能默認(rèn)被屏蔽。如需允許不受信任的觸摸操作,請(qǐng)?jiān)诮K端窗口中運(yùn)行以下 ADB 命令 :
如需將行為還原為默認(rèn)設(shè)置(不受信任的觸摸操作被屏蔽),請(qǐng)運(yùn)行以下命令:
Android 12 更改了在按下“返回”按鈕時(shí)系統(tǒng)對(duì)為其任務(wù)根的啟動(dòng)器 activity 的默認(rèn)處理方式。在以前的版本中,系統(tǒng)會(huì)在按下“返回”按鈕時(shí)完成這些 activity。在 Android 12 中,現(xiàn)在系統(tǒng)會(huì)將 activity 及其任務(wù)移到后臺(tái),而不是完成 activity。當(dāng)使用主屏幕按鈕或手勢(shì)從應(yīng)用中導(dǎo)航出應(yīng)用時(shí),新行為與當(dāng)前行為一致。
注意 :系統(tǒng)僅會(huì)將新行為應(yīng)用于為其任務(wù)根的啟動(dòng)器 activity,即使用 ACTION_MAIN 和 CATEGORY_LAUNCHER 聲明 intent 過(guò)濾器 的 activity。對(duì)于其他 activity,在按下“返回”按鈕時(shí),系統(tǒng)會(huì)像以前一樣完成 activity。
對(duì)于大多數(shù)應(yīng)用而言,此變更意味著使用“返回”按鈕退出應(yīng)用的用戶可以更快地從 溫狀態(tài) 恢復(fù)應(yīng)用,而不必從 冷狀態(tài) 完全重啟應(yīng)用。
建議您針對(duì)此變更測(cè)試您的應(yīng)用。如果您的應(yīng)用目前替換 onBackPressed() 來(lái)處理返回導(dǎo)航并完成 Activity ,請(qǐng)更新您的實(shí)現(xiàn)來(lái)調(diào)用 super.onBackPressed() 而不是完成 Activity。調(diào)用 super.onBackPressed() 可在適當(dāng)時(shí)將 activity 及其任務(wù)移至后臺(tái),并可為不同應(yīng)用中的用戶提供更一致的導(dǎo)航體驗(yàn)。
另請(qǐng)注意,通常,我們建議您使用 AndroidX Activity API 提供自定義返回導(dǎo)航 ,而不是替換 onBackPressed() 。如果沒有組件攔截系統(tǒng)按下“返回”按鈕,AndroidX Activity API 會(huì)自動(dòng)遵循適當(dāng)?shù)南到y(tǒng)行為。
在 Android 12 中,無(wú)論顯示屏是否支持無(wú)縫過(guò)渡到新的刷新率,都會(huì)發(fā)生使用 setFrameRate() 實(shí)現(xiàn)的刷新率變化;無(wú)縫過(guò)渡是指沒有任何視覺中斷,比如一兩秒鐘的黑屏。以前,如果顯示屏不支持無(wú)縫過(guò)渡,它在調(diào)用 setFrameRate() 后通常會(huì)繼續(xù)使用同一刷新率。您可以調(diào)用 getAlternativeRefreshRates() 來(lái)提前確定向新刷新率的過(guò)渡是否有可能是無(wú)縫過(guò)渡。通常,會(huì)在刷新率切換完成后調(diào)用回調(diào) onDisplayChanged() ,但對(duì)于某些外接顯示屏,會(huì)在非無(wú)縫過(guò)渡期間調(diào)用該回調(diào)。
以下示例說(shuō)明了您可以如何實(shí)現(xiàn)此行為:
Android 12 中添加了以下 API:
如需創(chuàng)建 Passpoint 建議,應(yīng)用必須使用 PasspointConfiguration 、 Credential 和 HomeSp 類。這些類描述了 Wi-Fi Alliance Passpoint 規(guī)范 中定義的 Passpoint 配置文件。
如需了解詳情,請(qǐng)參閱 適用于互聯(lián)網(wǎng)連接的 Wi-Fi 建議 API 。
Android 12 包含更新后的受限制非 SDK 接口列表(基于與 Android 開發(fā)者之間的協(xié)作以及最新的內(nèi)部測(cè)試)。在限制使用非 SDK 接口之前,我們會(huì)盡可能確保有可用的公開替代方案。
如果您的應(yīng)用并非以 Android 12 為目標(biāo)平臺(tái),其中一些變更可能不會(huì)立即對(duì)您產(chǎn)生影響。然而,雖然您目前仍可以使用一些非 SDK 接口( 具體取決于應(yīng)用的目標(biāo) API 級(jí)別 ),但只要您使用任何非 SDK 方法或字段,終歸存在導(dǎo)致應(yīng)用出問題的顯著風(fēng)險(xiǎn)。
如果您不確定自己的應(yīng)用是否使用了非 SDK 接口,則可以 測(cè)試您的應(yīng)用 來(lái)進(jìn)行確認(rèn)。如果您的應(yīng)用依賴于非 SDK 接口,您應(yīng)該開始計(jì)劃遷移到 SDK 替代方案。然而,我們知道某些應(yīng)用具有使用非 SDK 接口的有效用例。如果您無(wú)法為應(yīng)用中的某項(xiàng)功能找到使用非 SDK 接口的替代方案,應(yīng) 請(qǐng)求新的公共 API 。
如需詳細(xì)了解此 Android 版本中的變更,請(qǐng)參閱 Android 12 中有關(guān)限制非 SDK 接口的更新 。如需全面了解有關(guān)非 SDK 接口的詳細(xì)信息,請(qǐng)參閱 對(duì)非 SDK 接口的限制 。