Android 11 更新內(nèi)容(開發(fā)必讀)

功能和 API 概覽

Android 11 面向開發(fā)者引入了一些出色的新功能和 API女坑。以下幾部分內(nèi)容可幫助您了解適用于您的應(yīng)用的功能并開始使用相關(guān) API。

有關(guān)新增、修改和移除的 API 的詳細(xì)列表营罢,請(qǐng)參閱 API 差異報(bào)告豺型。如需詳細(xì)了解新的 API仲智,請(qǐng)?jiān)L問 Android API 參考文檔 — 新 API 會(huì)突出顯示以方便查看。此外姻氨,如需了解平臺(tái)變更可能會(huì)在哪些方面影響您的應(yīng)用钓辆,請(qǐng)務(wù)必查看會(huì)影響以 Android R 為目標(biāo)平臺(tái)的應(yīng)用所有應(yīng)用的 Android 11 行為變更,以及隱私權(quán)變更肴焊。

新體驗(yàn)

屏幕

更好地支持瀑布屏

Android 11 提供了一些 API 以支持瀑布屏前联,這是一種無邊框的全面屏。這種顯示屏被視為劉海屏的變體∪⒕欤現(xiàn)有的 DisplayCutout.getSafeInset…() 方法現(xiàn)在會(huì)返回能夠避開瀑布區(qū)域以及劉海的安全邊襯區(qū)似嗤。如需在瀑布區(qū)域中呈現(xiàn)您的應(yīng)用內(nèi)容,請(qǐng)執(zhí)行以下操作:

  • 調(diào)用 DisplayCutout.getWaterfallInsets() 以獲取瀑布邊襯區(qū)的精確尺寸届宠。

  • 將窗口布局屬性 layoutInDisplayCutoutMode 設(shè)為 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS烁落,以允許窗口延伸到屏幕各個(gè)邊緣上的劉海和瀑布區(qū)域。您必須確保劉和阕ⅲ或瀑布區(qū)域中沒有重要的內(nèi)容伤塌。

注意:如果您未將上述窗口布局屬性設(shè)為 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,Android 會(huì)在黑邊模式下顯示窗口轧铁,從而避開缺口和瀑布區(qū)域每聪。

合頁(yè)角度傳感器和可折疊設(shè)備

使用 Android 11,可以通過以下方法使運(yùn)行在采用合頁(yè)式屏幕配置的設(shè)備上的應(yīng)用能夠確定合頁(yè)角度:提供具有 TYPE_HINGE_ANGLE 的新傳感器,以及新的 SensorEvent熊痴,后者可以監(jiān)控合頁(yè)角度日熬,并提供設(shè)備的兩部分之間的角度測(cè)量值涨醋。您可以使用這些原始測(cè)量值在用戶操作設(shè)備時(shí)執(zhí)行精細(xì)的動(dòng)畫顯示箫章。

盡管對(duì)于某些類型的應(yīng)用(例如啟動(dòng)器和壁紙)而言美侦,知道確切的合頁(yè)角度會(huì)很有用,但大多數(shù)應(yīng)用都應(yīng)該使用 Jetpack 窗口管理器庫(kù)巾陕,通過調(diào)用 DeviceState.getPosture() 檢索設(shè)備狀態(tài)讨跟。

或者,您的應(yīng)用也可以調(diào)用 registerDeviceStateChangeCallback()鄙煤,以在 DeviceState 更改時(shí)收到通知晾匠,并在狀態(tài)發(fā)生變化時(shí)做出響應(yīng)。

由于目前市場(chǎng)上已經(jīng)有且未來還會(huì)出現(xiàn)更多不同的窗口和設(shè)備配置梯刚,因此對(duì)設(shè)備狀態(tài)做出響應(yīng)更加安全可靠凉馆。

會(huì)話

Android 11 對(duì)會(huì)話的處理方式進(jìn)行了多項(xiàng)改進(jìn)。會(huì)話是滿足以下條件的通信:

  • 具有實(shí)時(shí)性亡资。
  • 可為雙向或多向通信澜共,但不能是單向的性質(zhì)。
  • 在兩人或更多人(不能是聊天機(jī)器人)之間進(jìn)行锥腻。

現(xiàn)在嗦董,這些會(huì)話顯示于各自的區(qū)域中,這些會(huì)話的通知會(huì)突出顯示并具有額外的功能:

  • 如果用戶長(zhǎng)按會(huì)話通知瘦黑,系統(tǒng)會(huì)為用戶提供多個(gè)選項(xiàng):
    • 將會(huì)話提升為氣泡(如果應(yīng)用支持氣泡)京革。
    • 為此會(huì)話創(chuàng)建快捷方式并將其添加到主屏幕。
    • 將此會(huì)話的通知設(shè)為靜音或暫停通知幸斥。
    • 將此會(huì)話標(biāo)記為非常重要匹摇。
  • 通知的設(shè)計(jì)采用新版本的 MessagingStyle,突出了用于代表用戶的頭像甲葬,同時(shí)還顯示了進(jìn)行會(huì)話的應(yīng)用的圖標(biāo)廊勃。

要確定某個(gè)會(huì)話以便對(duì)其進(jìn)行這種特殊處理,應(yīng)用需要向該會(huì)話發(fā)布快捷方式演顾,這可以通過調(diào)用現(xiàn)有的 ShortcutManager 方法 setDynamicShortcuts()addDynamicShortcuts() 來完成供搀。此快捷方式必須長(zhǎng)期存在并附有個(gè)人數(shù)據(jù)隅居,用于標(biāo)識(shí)會(huì)話中的對(duì)方參與者钠至。我們還建議您為快捷方式設(shè)置 LocusId,并使用該 LocusId 注釋應(yīng)用內(nèi) Activity 和 Fragment胎源。這樣做有助于系統(tǒng)根據(jù)應(yīng)用的使用情況對(duì)對(duì)話進(jìn)行準(zhǔn)確排名棉钧。

如果某個(gè)對(duì)話已不存在,應(yīng)用可以使用 ShortcutManager.removeLongLivedShortcuts() 來刪除相應(yīng)快捷方式涕蚤;這樣做會(huì)讓系統(tǒng)刪除與該對(duì)話關(guān)聯(lián)的所有數(shù)據(jù)宪卿。

當(dāng)應(yīng)用發(fā)送與會(huì)話相關(guān)的通知時(shí)的诵,您必須使用 MessagingStyle包含會(huì)話快捷方式的鏈接。這樣做可讓系統(tǒng)為您的通知提供特殊的對(duì)話處理佑钾。

根據(jù)用戶行為西疤,系統(tǒng)可能會(huì)將某些對(duì)話指定為特別重要并進(jìn)行緩存,讓它們看起來更加顯眼休溶。您的應(yīng)用不能影響對(duì)話是否會(huì)得到這種優(yōu)先處理代赁,但您可以通過調(diào)用新方法 ShortcutManager.getShortcuts() 并傳遞 FLAG_MATCH_CACHED 來找出當(dāng)前緩存了哪些對(duì)話。

改進(jìn)了會(huì)話

Android 11 對(duì)會(huì)話的處理方式進(jìn)行了多項(xiàng)改進(jìn)兽掰。會(huì)話是兩人或更多人之間的實(shí)時(shí)雙向通信芭碍。這些會(huì)話具有特殊的重要性,并且用戶在如何與其進(jìn)行交互方面有多個(gè)新的選項(xiàng)可以選擇孽尽。

如需詳細(xì)了解會(huì)話以及您的應(yīng)用如何支持會(huì)話窖壕,請(qǐng)參閱會(huì)話

聊天氣泡

借助氣泡杉女,用戶可以從設(shè)備上的任何位置輕松進(jìn)行多任務(wù)處理瞻讽。氣泡的設(shè)計(jì)目的是成為 SYSTEM_ALERT_WINDOW 的替代方案。

注意:“氣泡”功能內(nèi)置在開發(fā)者預(yù)覽版中宠纯,僅供開發(fā)者使用卸夕,該功能不應(yīng)該用于生產(chǎn)。默認(rèn)情況下婆瓜,氣泡處于禁用狀態(tài)快集。開發(fā)者可在開發(fā)者選項(xiàng)設(shè)置中啟用該功能。

[圖片上傳失敗...(image-c66076-1590046907721)]

氣泡內(nèi)置于通知系統(tǒng)中廉白。它們懸浮在其他應(yīng)用內(nèi)容之上个初,并會(huì)跟隨用戶移動(dòng)到任何位置。氣泡可以展開以顯示應(yīng)用功能和信息猴蹂,并可在不使用時(shí)收起院溺。

當(dāng)設(shè)備處于鎖定狀態(tài)或“顯示屏始終開啟”功能啟用時(shí),氣泡的顯示方式和常規(guī)通知相同磅轻。

氣泡是一種可以選擇停用的功能珍逸。在應(yīng)用顯示第一個(gè)氣泡時(shí),系統(tǒng)會(huì)彈出權(quán)限對(duì)話框聋溜,提供兩個(gè)選項(xiàng):

  • 屏蔽來自您應(yīng)用的所有氣泡 - 系統(tǒng)不會(huì)屏蔽通知谆膳,但永遠(yuǎn)不會(huì)以氣泡形式顯示通知
  • 允許來自您應(yīng)用的所有氣泡 - 通過 BubbleMetaData 發(fā)送的所有通知都會(huì)以氣泡形式顯示
Bubble API

氣泡通過 Notification API 創(chuàng)建,因此您可以正常發(fā)送通知撮躁。如果您想讓通知以氣泡形式顯示漱病,則需要附加一些額外數(shù)據(jù)。

氣泡的展開視圖從您選擇的 Activity 中創(chuàng)建,因此該 Activity 需要經(jīng)過配置才能以氣泡形式妥善顯示杨帽。此 Activity 必須是大小可調(diào)嵌入式 Activity漓穿,并且始終在文檔界面模式中啟動(dòng)。如果這些要求中的任何一項(xiàng)無法得到滿足注盈,該 Activity 都將以通知形式顯示晃危。

以下代碼演示如何實(shí)現(xiàn)簡(jiǎn)單的氣泡:

<activity
 android:name=".bubbles.BubbleActivity"
 android:theme="@style/AppTheme.NoActionBar"
 android:label="@string/title_activity_bubble"
 android:allowEmbedded="true"
 android:documentLaunchMode="always"
 android:resizeableActivity="true"
/>

如果您的應(yīng)用顯示多個(gè)相同類型的氣泡(例如與不同聯(lián)系人的多個(gè)聊天對(duì)話),則該 Activity 必須能夠啟動(dòng)多個(gè)實(shí)例老客。將 documentLaunchMode 設(shè)置為“always”山害。

如要發(fā)送氣泡,請(qǐng)按以下步驟操作:

// Create bubble intent
Intent target = new Intent(mContext, BubbleActivity.class);
PendingIntent bubbleIntent =
    PendingIntent.getActivity(mContext, 0, target, 0 /* flags */);

// Create bubble metadata
Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIcon(Icon.createWithResource(context, R.drawable.icon))
        .setIntent(bubbleIntent)
        .build();

// Create notification
Person chatBot = new Person.Builder()
        .setBot(true)
        .setName("BubbleBot")
        .setImportant(true)
        .build();

Notification.Builder builder =
    new Notification.Builder(mContext, CHANNEL_ID)
        .setContentIntent(contentIntent)
        .setSmallIcon(smallIcon)
        .setBubbleMetadata(bubbleData)
        .addPerson(chatBot);

注意:首次發(fā)送顯示氣泡的通知時(shí)朴则,您必須使用具有 IMPORTANCE_MIN 或更高級(jí)別的通知渠道权纤。

如果發(fā)送氣泡時(shí)您的應(yīng)用位于前臺(tái),則系統(tǒng)會(huì)忽略重要性并始終顯示您的氣泡(除非用戶屏蔽了來自您應(yīng)用的氣泡或通知)乌妒。

創(chuàng)建展開的氣泡

您可將氣泡配置為自動(dòng)以展開狀態(tài)顯示汹想。我們建議您,僅在用戶執(zhí)行會(huì)顯示氣泡的操作(例如點(diǎn)按按鈕以開始新聊天)時(shí)使用此功能撤蚊。在這種情況下古掏,您也有必要禁止顯示在創(chuàng)建氣泡時(shí)發(fā)送的初始通知。

您可以使用以下方法設(shè)置啟用這些行為的標(biāo)記:setAutoExpandBubble()setSuppressInitialNotification()侦啸。

Notification.BubbleMetadata bubbleData =
    new Notification.BubbleMetadata.Builder()
        .setDesiredHeight(600)
        .setIntent(bubbleIntent)
        .setAutoExpandBubble(true)
        .setSuppressInitialNotification(true)
        .build();
氣泡內(nèi)容生命周期

當(dāng)氣泡展開時(shí)槽唾,內(nèi)容 Activity 會(huì)經(jīng)歷常規(guī)進(jìn)程生命周期,從而使應(yīng)用成為前臺(tái)進(jìn)程(如果應(yīng)用尚未在前臺(tái)運(yùn)行)光涂。

當(dāng)氣泡被收起或關(guān)閉時(shí)庞萍,系統(tǒng)會(huì)銷毀該 Activity。這可能導(dǎo)致系統(tǒng)緩存進(jìn)程忘闻,并在之后將其終止钝计,具體取決于應(yīng)用是否有正在運(yùn)行的其他前臺(tái)組件。

顯示氣泡的時(shí)機(jī)

為減少干擾用戶的次數(shù)齐佳,氣泡僅在滿足以下一個(gè)或多個(gè)條件時(shí)顯示:

如果上述條件均不滿足,則僅顯示通知提针。

最佳實(shí)踐
  • 氣泡會(huì)占用屏幕空間命爬,并遮擋其他應(yīng)用內(nèi)容。您應(yīng)僅在非常有必要(例如持續(xù)通信)或用戶明確要求將某些內(nèi)容顯示為氣泡時(shí)辐脖,才以氣泡形式發(fā)送通知饲宛。
  • 請(qǐng)注意,用戶可以禁用氣泡嗜价。在這種情況下艇抠,氣泡通知以正常通知形式顯示。同時(shí)久锥,您應(yīng)始終確保您的氣泡通知以正常通知形式顯示家淤。
  • 從氣泡啟動(dòng)的進(jìn)程(例如)會(huì)在氣泡容器中顯示。也就是說氣泡可以擁有任務(wù)堆棧瑟由。如果您的氣泡中有許多功能或?qū)Ш叫踔兀闆r就會(huì)變得很復(fù)雜。我們建議您盡量讓功能保持輕量具體歹苦。

在快速回復(fù)中使用富媒體

從 Android 11 開始青伤,用戶可以在快速回復(fù)中插入圖片和其他富媒體內(nèi)容。如需支持此功能殴瘦,應(yīng)用需要向 RemoteInput 通知添加信息狠角,指定可以處理的 MIME 類型。應(yīng)用可以通過調(diào)用 RemoteInput.Builder.setAllowDataType() 執(zhí)行此操作蚪腋。此外丰歌,應(yīng)用還必須檢查收到的任何 RemoteInput 廣播,以查看廣播是否包含其中任何一種類型的內(nèi)容屉凯;應(yīng)用可使用 RemoteInput.getDataResultsFromIntent() 執(zhí)行此操作动遭。

通知的設(shè)計(jì)由系統(tǒng)模板決定,您的應(yīng)用只需定義模板各部分的內(nèi)容神得。通知的某些詳細(xì)信息僅在展開視圖中顯示厘惦。

  1. 小圖標(biāo):此為必要圖標(biāo),通過 [setSmallIcon()] 設(shè)置哩簿。
  2. 應(yīng)用名稱:此由系統(tǒng)提供宵蕉。
  3. 時(shí)間戳:此由系統(tǒng)提供,不過您可以通過 [setWhen()] 進(jìn)行替換节榜,或使用 [setShowWhen(false)] 將其隱藏羡玛。
  4. 大圖標(biāo):此為可選圖標(biāo)(通常僅用于聯(lián)系人照片;請(qǐng)勿將其用于應(yīng)用圖標(biāo))宗苍,通過 [setLargeIcon()] 設(shè)置稼稿。
  5. 標(biāo)題:此為可選內(nèi)容薄榛,通過 [setContentTitle()] 設(shè)置。
  6. 文本:此為可選內(nèi)容让歼,通過 [setContentText()] 設(shè)置敞恋。

如需詳細(xì)了解如何使用上述及更多功能創(chuàng)建通知,請(qǐng)參閱創(chuàng)建通知谋右。

與內(nèi)容捕獲服務(wù)共享數(shù)據(jù)

從 Android 11 開始硬猫,應(yīng)用可以與設(shè)備的內(nèi)容捕獲服務(wù)共享數(shù)據(jù)。借助此功能改执,設(shè)備可以更輕松地提供情境智能啸蜜,例如顯示用戶環(huán)境中正在播放的歌曲的名稱,或者在用戶靠近車站或機(jī)場(chǎng)時(shí)顯示相關(guān)的旅行信息辈挂。

如需將應(yīng)用中的數(shù)據(jù)共享給內(nèi)容捕獲服務(wù)衬横,請(qǐng)對(duì) ContentCaptureManager 的實(shí)例調(diào)用 shareData() 方法。如果系統(tǒng)接受數(shù)據(jù)共享請(qǐng)求终蒂,應(yīng)用會(huì)收到將與內(nèi)容捕獲服務(wù)共享的只寫文件描述符冕香。

5G 圖標(biāo)顯示

在 Android 11(API 級(jí)別“R”)及更高版本中,具有 android.Manifest.permission.READ_PHONE_STATE 權(quán)限的應(yīng)用可以通過 PhoneStateListener.onDisplayInfoChanged() 請(qǐng)求更新電話顯示信息后豫,其中包括用于營(yíng)銷和品牌塑造的無線接入技術(shù)信息悉尾。

這款新 API 提供了適用于不同運(yùn)營(yíng)商的各種 5G 圖標(biāo)顯示解決方案。支持的技術(shù)包括:

  • LTE
  • 采用載波聚合技術(shù)的 LTE (LTE+)
  • 高級(jí)專業(yè)版 LTE (5Ge)
  • NR (5G)
  • 毫米波移動(dòng)網(wǎng)絡(luò)頻段上的 NR (5G+)

隱私權(quán)

Android 11 引入了大量變更和限制挫酿,目的是加強(qiáng)用戶隱私保護(hù)构眯。如需了解詳情,請(qǐng)參閱隱私權(quán)頁(yè)面早龟。

重大隱私權(quán)變更

下表匯總了 Android 11 中與隱私權(quán)相關(guān)的主要變更惫霸。

| | 隱私權(quán)變更 | 受影響的應(yīng)用 | 緩解策略 |
| | 分區(qū)存儲(chǔ)強(qiáng)制執(zhí)行
以 Android 11 為目標(biāo)平臺(tái)的應(yīng)用始終會(huì)受分區(qū)存儲(chǔ)行為的影響 | 以 Android 11 為目標(biāo)平臺(tái)的應(yīng)用,以及以 Android 10 為目標(biāo)平臺(tái)且未將 requestLegacyExternalStorage 設(shè)為 true 以停用分區(qū)存儲(chǔ)的應(yīng)用 | 更新您的應(yīng)用以使用分區(qū)存儲(chǔ)
詳細(xì)了解分區(qū)存儲(chǔ)變更 |
| | 一次性權(quán)限
通過一次性權(quán)限葱弟,用戶可以向位置壹店、麥克風(fēng)和攝像頭授予臨時(shí)訪問權(quán)限 | 以任何版本為目標(biāo)平臺(tái)且請(qǐng)求位置信息、麥克風(fēng)或攝像頭權(quán)限的應(yīng)用 | 在嘗試訪問受某項(xiàng)權(quán)限保護(hù)的數(shù)據(jù)之前芝加,檢查您的應(yīng)用是否具有該權(quán)限
遵循權(quán)限方面的最佳做法 |
| | 后臺(tái)位置信息訪問權(quán)限
Android 11 更改了應(yīng)用向用戶請(qǐng)求后臺(tái)位置信息權(quán)限的方式 | 目標(biāo)平臺(tái)為 Android 11 且需要隨時(shí)訪問位置信息的應(yīng)用 | 通過對(duì)權(quán)限請(qǐng)求方法的多次單獨(dú)調(diào)用硅卢,逐步請(qǐng)求前臺(tái)(粗略或精確)和后臺(tái)位置權(quán)限。在每次請(qǐng)求之前藏杖,使用全屏視圖向用戶說明授予該權(quán)限所能得到的益處
詳細(xì)了解后臺(tái)位置信息訪問權(quán)限 |
| | 軟件包可見性
Android 11 更改了應(yīng)用查詢同一設(shè)備上的其他已安裝應(yīng)用及與之交互的方式 | 以 Android 11 為目標(biāo)平臺(tái)且與設(shè)備上的其他已安裝應(yīng)用交互的應(yīng)用 | 將 <queries> 元素添加到應(yīng)用的清單
詳細(xì)了解軟件包可見性 |
| | 前臺(tái)服務(wù)類型
Android 11 更改了前臺(tái)服務(wù)訪問攝像頭和麥克風(fēng)數(shù)據(jù)的方式 | 以 Android 11 為目標(biāo)平臺(tái)且在前臺(tái)服務(wù)中訪問攝像頭或麥克風(fēng)的應(yīng)用 | 分別在訪問攝像頭數(shù)據(jù)和麥克風(fēng)數(shù)據(jù)的服務(wù)中聲明 cameramicrophone 前臺(tái)服務(wù)類型
詳細(xì)了解新的前臺(tái)服務(wù)類型 |

安全

生物識(shí)別身份驗(yàn)證機(jī)制更新

為了幫助您控制應(yīng)用數(shù)據(jù)的安全級(jí)別将塑,Android 11 對(duì)生物識(shí)別身份驗(yàn)證機(jī)制進(jìn)行了多項(xiàng)改進(jìn)。

身份驗(yàn)證類型

Android 11 引入了 BiometricManager.Authenticators 接口蝌麸,該接口定義了 BiometricManager 類支持的身份驗(yàn)證類型:

BIOMETRIC_STRONG

使用滿足兼容性定義頁(yè)面上定義的強(qiáng)強(qiáng)度級(jí)別要求的硬件元素進(jìn)行身份驗(yàn)證点寥。

BIOMETRIC_WEAK

使用滿足兼容性定義頁(yè)面上定義的強(qiáng)度級(jí)別要求的硬件元素進(jìn)行身份驗(yàn)證。

DEVICE_CREDENTIAL

使用屏幕鎖定憑據(jù)(即用戶的 PIN 碼来吩、解鎖圖案或密碼)進(jìn)行身份驗(yàn)證敢辩。

如需定義您的應(yīng)用接受的生物識(shí)別身份驗(yàn)證類型蔽莱,請(qǐng)向 setAllowedAuthenticators() 方法傳遞一個(gè)身份驗(yàn)證類型或按位類型組合。例如戚长,如果您的應(yīng)用接受“強(qiáng)”硬件元素或屏幕鎖定憑據(jù)盗冷,請(qǐng)傳入 BIOMETRIC_STRONG | DEVICE_CREDENTIAL

如需檢查是否有必要的身份驗(yàn)證元素历葛,請(qǐng)將同一按位類型組合傳入 canAuthenticate() 方法。如有必要嘀略,請(qǐng)調(diào)用 ACTION_BIOMETRIC_ENROLL intent 操作恤溶。在 intent extra 中,提供您的應(yīng)用可接受的一組身份驗(yàn)證器帜羊。該 intent 會(huì)提示用戶為您的應(yīng)用接受的身份驗(yàn)證器注冊(cè)憑據(jù)咒程。

注意:為了注冊(cè)身份驗(yàn)證器,用戶需要?jiǎng)?chuàng)建 PIN 碼讼育、解鎖圖案或密碼帐姻。如果用戶還沒有 PIN 碼、解鎖圖案或密碼奶段,生物識(shí)別注冊(cè)流程會(huì)提示他們創(chuàng)建一個(gè)饥瓷。

在用戶進(jìn)行身份驗(yàn)證后,您可以通過調(diào)用 getAuthenticationType() 檢查用戶是使用設(shè)備憑據(jù)還是生物識(shí)別憑據(jù)進(jìn)行的身份驗(yàn)證痹籍。

對(duì)“每次使用時(shí)進(jìn)行身份驗(yàn)證”密鑰的額外支持

Android 11 在 BiometricPrompt 類中提供了對(duì)“每次使用時(shí)進(jìn)行身份驗(yàn)證”密鑰的更多支持呢铆。此類密鑰要求每次您的應(yīng)用需要訪問受該密鑰保護(hù)的數(shù)據(jù)時(shí),用戶都必須提供生物識(shí)別憑據(jù)蹲缠、設(shè)備憑據(jù)或上述任一憑據(jù)棺克。“每次使用時(shí)進(jìn)行身份驗(yàn)證”密鑰對(duì)高價(jià)值的事務(wù)(如支付大筆款項(xiàng)或更新個(gè)人的健康檔案)很有用线定。

如需將 BiometricPrompt 對(duì)象與“每次使用時(shí)進(jìn)行身份驗(yàn)證”密鑰相關(guān)聯(lián)娜谊,請(qǐng)?zhí)砑宇愃埔韵碌拇a:

KeyGenParameterSpec authPerOpKeyGenParameterSpec  =  new KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
    // Accept either a biometric credential or a device credential.
    // To accept only one type of credential, include only that type as the
    // 2nd argument.
    .setUserAuthenticationParameters(0 /* duration */,
            KeyProperties.AUTH_BIOMETRIC_STRONG |
            KeyProperties.AUTH_DEVICE_CREDENTIAL)
    .build();

已棄用的方法

Android 11 棄用了以下方法:

  • setDeviceCredentialAllowed() 方法。
  • setUserAuthenticationValidityDurationSeconds() 方法斤讥。
  • 不帶任何參數(shù)的 canAuthenticate() 過載版本纱皆。

安全共享大型數(shù)據(jù)集

在某些情況下,例如涉及機(jī)器學(xué)習(xí)或媒體播放時(shí)芭商,您的應(yīng)用可能需要與其他應(yīng)用使用同一個(gè)大型數(shù)據(jù)集抹剩。在較早的 Android 版本中,您的應(yīng)用與其他應(yīng)用需要各自單獨(dú)下載該數(shù)據(jù)集蓉坎。

為幫助減少網(wǎng)絡(luò)中和磁盤上的數(shù)據(jù)冗余澳眷,Android 11 允許使用共享數(shù)據(jù) blob 在設(shè)備上緩存這些大型數(shù)據(jù)集。如需詳細(xì)了解如何共享數(shù)據(jù)集蛉艾,請(qǐng)參閱有關(guān)共享大型數(shù)據(jù)集的深度指南骚灸。

性能和質(zhì)量

無線調(diào)試

Android 11 支持通過 Android 調(diào)試橋 (adb) 從工作站以無線方式部署和調(diào)試應(yīng)用。例如棺蛛,您可以將可調(diào)試的應(yīng)用部署到多臺(tái)遠(yuǎn)程設(shè)備呀袱,而無需通過 USB 實(shí)際連接您的設(shè)備,從而避免常見的 USB 連接問題(例如驅(qū)動(dòng)程序安裝方面的問題)况芒。

如需使用無線調(diào)試,您需要使用配對(duì)碼將您的設(shè)備與工作站配對(duì)。您的工作站和設(shè)備必須連接到同一無線網(wǎng)絡(luò)面氓。如需連接到您的設(shè)備,請(qǐng)按以下步驟操作:

  1. 在您的工作站上蛆橡,更新到最新版本的 SDK 平臺(tái)工具舌界。
  2. 在設(shè)備上啟用開發(fā)者選項(xiàng)
  3. 啟用無線調(diào)試選項(xiàng)泰演。
  4. 在詢問要在此網(wǎng)絡(luò)上允許無線調(diào)試嗎呻拌?的對(duì)話框中,點(diǎn)擊允許睦焕。
  5. 選擇使用配對(duì)碼配對(duì)設(shè)備藐握。記下設(shè)備上顯示的配對(duì)碼、IP 地址和端口號(hào)(參見圖片)垃喊。
  6. 在工作站上猾普,打開一個(gè)終端并導(dǎo)航到 android_sdk
  7. 運(yùn)行 adb pair ipaddr port本谜。使用第 5 步中的 IP 地址和端口號(hào)抬闷。
  8. 當(dāng)系統(tǒng)提示時(shí),輸入您在第 5 步中獲得的配對(duì)碼耕突。系統(tǒng)會(huì)顯示一條消息笤成,表明您的設(shè)備已成功配對(duì)。
 Enter pairing code: 482924
 Successfully paired to 192.168.1.130:37099 [guid=adb-235XY]
  1. (僅適用于 Linux 或 Microsoft Windows)運(yùn)行 adb connect ipaddr :port眷茁。使用無線調(diào)試下的 IP 地址和端口(參見下圖)炕泳。

ADB 增量 APK 安裝

在設(shè)備上安裝大型(2GB 以上)APK 可能需要很長(zhǎng)的時(shí)間,即使應(yīng)用只是稍作更改也是如此上祈。ADB(Android 調(diào)試橋)增量 APK 安裝可以安裝足夠的 APK 以啟動(dòng)應(yīng)用培遵,同時(shí)在后臺(tái)流式傳輸剩余數(shù)據(jù),從而加速這一過程登刺。如果設(shè)備支持該功能籽腕,并且您安裝了最新的 SDK 平臺(tái)工具adb install 將自動(dòng)使用此功能纸俭。如果不支持皇耗,系統(tǒng)會(huì)自動(dòng)使用默認(rèn)安裝方法。

運(yùn)行以下 adb 命令以使用該功能揍很。如果設(shè)備不支持增量安裝郎楼,該命令將會(huì)失敗并輸出詳細(xì)的解釋万伤。

adb install --incremental

在運(yùn)行 ADB 增量 APK 安裝之前,您必須先為 APK 簽名并創(chuàng)建一個(gè) APK 簽名方案 v4 文件呜袁。必須將 v4 簽名文件放在 APK 旁邊敌买,才能使此功能正常運(yùn)行。

使用原生內(nèi)存分配器進(jìn)行錯(cuò)誤檢測(cè)

GWP-ASan 是一種原生內(nèi)存分配器功能阶界,可幫助查找釋放后使用和堆緩沖區(qū)溢出錯(cuò)誤虹钮。您可以全局啟用此功能,也可以為應(yīng)用的特定子進(jìn)程啟用此功能膘融。如需了解詳情芙粱,請(qǐng)參閱 GWP-Asan 指南

Neural Networks API 1.3

Android 11 擴(kuò)展并改進(jìn)了 Neural Networks API (NNAPI)托启。

新運(yùn)算方式

NNAPI 1.3 引入了新的運(yùn)算數(shù)類型 TENSOR_QUANT8_ASYMM_SIGNED宅倒,以支持 TensorFlow Lite 的新量化方案攘宙。

此外屯耸,NNAPI 1.3 還引入了以下新運(yùn)算:

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

新的機(jī)器學(xué)習(xí)控件

NNAPI 1.3 引入了新控件以幫助機(jī)器學(xué)習(xí)流暢運(yùn)行:

NDK Thermal API

當(dāng)設(shè)備過熱時(shí),它們可能會(huì)限制 CPU 和/或 GPU立轧,而這可能會(huì)以意想不到的方式影響應(yīng)用格粪。如果應(yīng)用或游戲包含復(fù)雜圖形,大量計(jì)算或持續(xù)網(wǎng)絡(luò)活動(dòng)氛改,它們就更容易遇到問題帐萎。

在 Android 11 中使用 NDK Thermal API 監(jiān)控設(shè)備上的溫度變化,然后采取相應(yīng)措施以降低耗電量和設(shè)備溫度胜卤。該 API 類似于Java Thermal API疆导;您可以使用它接收任何熱狀態(tài)更改的通知或直接輪詢當(dāng)前狀態(tài)。

文本和輸入

改進(jìn)了 IME 轉(zhuǎn)換

Android 11 引入了新的 API 以改進(jìn)輸入法 (IME) 的轉(zhuǎn)換葛躏,例如屏幕鍵盤是鬼。這些 API 可讓您更輕松地調(diào)整應(yīng)用內(nèi)容肤舞,與 IME 的出現(xiàn)和消失以及狀態(tài)和導(dǎo)航欄等其他元素保持同步。

如需在聚焦至任何 EditText 時(shí)顯示 IME均蜜,請(qǐng)調(diào)用 view.getInsetsController().[show(Type.ime())](https://developer.android.com/reference/android/view/WindowInsetsController#show(int))(您可以在與聚焦的 EditText 相同層次結(jié)構(gòu)中的任何視圖上調(diào)用此方法李剖,無需專門在 EditText 上調(diào)用它)。如需隱藏 IME囤耳,請(qǐng)調(diào)用 view.getInsetsController().[hide(Type.ime())](https://developer.android.com/reference/android/view/WindowInsetsController#hide(int))篙顺。您可以通過調(diào)用 view.getRootWindowInsets().[isVisible(Type.ime())](https://developer.android.com/reference/android/view/WindowInsets#isVisible(int)) 檢查 IME 當(dāng)前是否可見。

如需同步應(yīng)用的視圖與 IME 的顯示和消失充择,請(qǐng)通過提供 WindowInsetsAnimation.CallbackView.setWindowInsetsAnimationCallback() 在視圖上設(shè)置監(jiān)聽器(您可以在任何視圖上設(shè)置該監(jiān)聽器德玫,它不一定必須為 EditText)。IME 會(huì)調(diào)用監(jiān)聽器的 onPrepare() 方法椎麦,之后會(huì)在轉(zhuǎn)換開始時(shí)調(diào)用 onStart()宰僧。然后,它會(huì)在每次轉(zhuǎn)換的過程中調(diào)用 onProgress()观挎。轉(zhuǎn)換完成后琴儿,IME 會(huì)調(diào)用 onEnd()。在轉(zhuǎn)換過程中嘁捷,您隨時(shí)可以調(diào)用 WindowInsetsAnimation.getFraction() 以了解轉(zhuǎn)換的進(jìn)度造成。

有關(guān)如何使用這些 API 的示例,請(qǐng)參閱新的 WindowInsetsAnimation 代碼示例雄嚣。

控制 IME 動(dòng)畫

您還可以控制 IME 動(dòng)畫或其他系統(tǒng)欄(如導(dǎo)航欄)的動(dòng)畫晒屎。如需執(zhí)行此操作,請(qǐng)先調(diào)用 setOnApplyWindowInsetsListener()缓升,為窗口邊襯區(qū)更改設(shè)置新的監(jiān)聽器:

 mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {
       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,barsIme.bottom);
      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});  

如需移動(dòng) IME 或其他系統(tǒng)欄鼓鲁,請(qǐng)調(diào)用控制器的 controlWindowInsetsAnimation() 方法:

 mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }
           @Override
           public void onCancelled() {}
       }); 

ICU 庫(kù)更新

Android 11 更新了 android.icu 軟件包,以使用 ICU 庫(kù)版本 66港谊,而 Android 10 中使用的是版本 63骇吭。新版庫(kù)包含更新的 CLDR 語(yǔ)言區(qū)域數(shù)據(jù)以及眾多對(duì)于 Android 中的國(guó)際化支持的增強(qiáng)功能。

新版庫(kù)包含以下主要變更:

  • 許多格式化 API 現(xiàn)在都支持可擴(kuò)展 FormattedValue 的新返回對(duì)象類型封锉。
  • LocaleMatcher API 在以下方面得到增強(qiáng):提供了構(gòu)建器類绵跷,支持 java.util.Locale 類型,并且結(jié)果類可提供有關(guān)匹配的額外數(shù)據(jù)成福。
  • 現(xiàn)在支持 Unicode 13碾局。

媒體

分配 MediaCodec 緩沖區(qū)

Android 11 包含一個(gè)新的 MediaCodec API,可讓應(yīng)用在分配輸入和輸出緩沖區(qū)時(shí)獲得更多控制奴艾。這樣可以讓您的應(yīng)用更高效地管理內(nèi)存净当。

新類:

新方法:

此外,MediaCodec.Callback() 中兩種方法的行為也發(fā)生了變化:

onInputBufferAvailable()

如果配置為使用 Block Model API,應(yīng)用應(yīng)通過索引使用 MediaCodec.getQueueRequest像啼,并將 LinearBlock/HardwareBuffer 附加到插槽俘闯,而不是通過索引調(diào)用 MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer()

onOutputBufferAvailable()

應(yīng)用可以通過索引使用 MediaCodec.getOutputFrame() 獲取包含更多信息的 OutputFrame 對(duì)象和 LinearBlock/HardwareBuffer 緩沖區(qū)忽冻,而不是通過索引調(diào)用 MediaCodec.getOutputBuffer()真朗。

</dl>

MediaCodec 低延時(shí)解碼

Android 11 增強(qiáng)了 MediaCodec,針對(duì)游戲和其他實(shí)時(shí)應(yīng)用支持低延時(shí)解碼僧诚。您可以將 FEATURE_LowLatency 傳遞到 MediaCodecInfo.CodecCapabilities.isFeatureSupported()遮婶,檢查編解碼器是否支持低延時(shí)解碼。

如需啟用或停用低延時(shí)解碼湖笨,請(qǐng)執(zhí)行以下任一操作:

注意:支持低延時(shí)解碼可能需要額外的資源慈省,例如更高的功耗臀防。僅在必要時(shí)使用低延時(shí)解碼。

已棄用 OpenSL ES

從 NDK r21b Beta 版 2 開始边败,已棄用 OpenSL ES API袱衷。您應(yīng)改用 Oboe

平臺(tái)仍支持現(xiàn)有應(yīng)用的 OpenSL ES放闺。然而祟昭,使用 minSdkVersion 為 30 或更高版本的 OpenSL ES 時(shí)缕坎,系統(tǒng)會(huì)顯示構(gòu)建警告怖侦。

新的 AAudio 函數(shù) AAudioStream_release()

函數(shù) AAudioStream_close() 會(huì)同時(shí)釋放和關(guān)閉音頻流。這可能很危險(xiǎn)谜叹。如果其他進(jìn)程在音頻流關(guān)閉后嘗試對(duì)其進(jìn)行訪問匾寝,該進(jìn)程將會(huì)崩潰。

新函數(shù) AAudioStream_release() 會(huì)釋放音頻流荷腊,但不會(huì)將其關(guān)閉艳悔。這樣會(huì)釋放其資源并使音頻流處于已知狀態(tài)。該對(duì)象將一直存在女仰,直到您調(diào)用 AAudioStream_close()猜年。

MediaParser API

MediaParser 是用于媒體提取的新型低級(jí)別 API。它比 MediaExtractor 更靈活疾忍,并提供對(duì)媒體提取功能的額外控制乔外。

網(wǎng)絡(luò)連接

Wi-Fi Passpoint 增強(qiáng)功能

通過 Passpoint,應(yīng)用可以自動(dòng)靜默地執(zhí)行身份驗(yàn)證并連接到安全的 Wi-Fi 熱點(diǎn)一罩。以 API 級(jí)別“R”及更高級(jí)別為目標(biāo)平臺(tái)的應(yīng)用可以使用 Passpoint 的以下附加功能杨幼。

失效日期強(qiáng)制執(zhí)行和通知

對(duì)個(gè)人資料強(qiáng)制執(zhí)行失效日期可讓框架避免使用過期憑據(jù)自動(dòng)連接到接入點(diǎn),該操作必定會(huì)失敗。這樣可以阻止無線連接差购,并節(jié)省電量和后端帶寬四瘫。當(dāng)用戶的個(gè)人資料位于范圍內(nèi)但已過期時(shí),該功能會(huì)向用戶顯示通知欲逃。

FQDN 匹配

允許使用 PerProviderSubscription (PPS) 管理對(duì)象 (MO) 中的 Extension/Android 節(jié)點(diǎn)找蜜,配置獨(dú)立于接入網(wǎng)絡(luò)查詢協(xié)議 (ANQP) 完全限定域名 (FQDN) 的命名 AAA 域。

自簽名的私人 CA

對(duì)于 Passpoint R1 個(gè)人資料稳析,Android 接受采用私人自簽名 CA 進(jìn)行連接身份驗(yàn)證锹杈。

允許使用具有相同 FQDN 的多個(gè)個(gè)人資料

允許安裝具有相同 FQDN 的多個(gè) Passpoint 個(gè)人資料。FQDN 不用作個(gè)人資料的鍵迈着。需要 FQDN 的現(xiàn)有 Passpoint API(如 remove)會(huì)將請(qǐng)求應(yīng)用于具有相同 FQDN 的所有匹配的個(gè)人資料竭望。

允許安裝沒有根 CA 證書的個(gè)人資料

允許使用沒有根 CA 證書的個(gè)人資料。在這種情況下裕菠,系統(tǒng)會(huì)根據(jù)安裝在信任庫(kù)中的公共根 CA 證書驗(yàn)證 AAA 服務(wù)器證書咬清。

改進(jìn)了家庭網(wǎng)絡(luò)服務(wù)提供商和漫游服務(wù)提供商的匹配

系統(tǒng)會(huì)匹配家庭網(wǎng)絡(luò)或漫游網(wǎng)絡(luò),而不考慮所通告的身份驗(yàn)證方法奴潘。此外旧烧,還增加了對(duì) OtherHomePartnersHomeOIList 列表的家庭網(wǎng)絡(luò)匹配功能的支持。

Wi-Fi Suggestion API 擴(kuò)展

Android 11 擴(kuò)展了 Wi-Fi Suggestion API画髓,以提高應(yīng)用的網(wǎng)絡(luò)管理能力掘剪,包括:

  • 連接管理應(yīng)用可以通過允許斷開連接請(qǐng)求管理自己的網(wǎng)絡(luò)。
  • Passpoint 網(wǎng)絡(luò)集成到 Suggestion API 中奈虾,可以推薦給用戶夺谁。
  • 通過 Analytics API,您可以獲取有關(guān)網(wǎng)絡(luò)質(zhì)量的信息肉微。

CallScreeningService 更新

從 Android 11 開始匾鸥,CallScreeningService 可以針對(duì)來電請(qǐng)求有關(guān) STIR/SHAKEN 驗(yàn)證狀態(tài) (verstat) 的信息。此信息將包含在來電的通話詳情中碉纳。

如果 CallScreeningService 持有 READ_CONTACTS 權(quán)限勿负,當(dāng)收到用戶聯(lián)系人號(hào)碼的來電或撥打用戶聯(lián)系人號(hào)碼時(shí),應(yīng)用會(huì)收到通知劳曹。

GNSS 天線支持

Android 11 引入了 GnssAntennaInfo 類奴愉,讓您的應(yīng)用能夠更多地利用全球?qū)Ш叫l(wèi)星系統(tǒng) (GNSS) 提供的厘米精度定位。用戶向您的應(yīng)用授予 ACCESS_FINE_LOCATION 權(quán)限之后铁孵,您的應(yīng)用可以訪問與 GNSS 天線相關(guān)的以下詳細(xì)信息:

  • 相位中心偏移 (PCO) 坐標(biāo)
  • 相位中心變化 (PCV) 校正
  • 信號(hào)增益校正

如需確定設(shè)備是否可以向您的應(yīng)用提供 GNSS 天線信息锭硼,請(qǐng)調(diào)用 hasGnssAntennaInfo()

隱私注意事項(xiàng)

  • GNSS 天線只能識(shí)別設(shè)備型號(hào)库菲,而不能識(shí)別具體設(shè)備账忘。
  • 如需使用 GnssAntennaInfo 類,必須具備 ACCESS_FINE_LOCATION 權(quán)限。

圖形

NDK 圖像解碼器

NDK ImageDecoder API 提供了一種標(biāo)準(zhǔn) API鳖擒,供 Android C/C++ 應(yīng)用直接解碼圖像溉浙。應(yīng)用開發(fā)者不再需要使用框架 API(通過 JNI)或捆綁第三方圖像解碼庫(kù)。有關(guān)詳情蒋荚,請(qǐng)參閱圖像解碼器開發(fā)者指南戳稽。

Frame rate API

Android 11 提供了一個(gè) API,可讓應(yīng)用告知系統(tǒng)其預(yù)期幀速率期升,從而減少支持多個(gè)刷新率的設(shè)備上的抖動(dòng)惊奇。有關(guān)如何使用此 API 的信息,請(qǐng)參閱幀速率指南播赁。

請(qǐng)求并檢查低延時(shí)支持

特定的顯示屏可以執(zhí)行圖形后期處理颂郎,例如某些外部顯示屏和電視。此類后期處理改善了圖形質(zhì)量容为,但可能會(huì)增加延時(shí)乓序。支持 HDMI 2.1 的新款顯示屏具有自動(dòng)低延時(shí)模式(ALLM,也稱為游戲模式)坎背,該模式可以通過關(guān)閉后期處理以最大限度地縮短延時(shí)替劈。如需詳細(xì)了解 ALLM,請(qǐng)參閱 HDMI 2.1 規(guī)范得滤。

窗口可以請(qǐng)求使用自動(dòng)低延時(shí)模式(如果可用)陨献。ALLM 對(duì)于游戲和視頻會(huì)議等應(yīng)用特別有用,因?yàn)閷?duì)于這些應(yīng)用而言懂更,低延時(shí)的重要性要高于擁有最佳的圖形質(zhì)量眨业。

如需開啟或關(guān)閉最低限度的后期處理,請(qǐng)調(diào)用 Window.setPreferMinimalPostProcessing()膜蛔,或?qū)⒋翱诘?preferMinimalPostProcessing 屬性設(shè)置為 true坛猪。并非所有的顯示屏都支持最低限度的后期處理脖阵;如需了解某個(gè)顯示屏是否支持該功能皂股,可調(diào)用新方法 Display.isMinimalPostProcessingSupported()

注意:如果用戶停用最低限度的后期處理命黔,或者顯示屏不支持低延時(shí)模式呜呐,那么調(diào)用 Window.setPreferMinimalPostProcessing() 不會(huì)有任何作用。

高性能圖形調(diào)試層注入

應(yīng)用現(xiàn)在可以將外部圖形層(GLES悍募、Vulkan)加載到原生應(yīng)用代碼中蘑辑,可以在不產(chǎn)生性能開銷的前提下,提供與可調(diào)試應(yīng)用相同的功能坠宴。在使用 GAPID 等工具對(duì)應(yīng)用進(jìn)行性能剖析時(shí)洋魂,此功能尤為重要。如需對(duì)應(yīng)用進(jìn)行性能剖析,只需要在應(yīng)用清單文件中添加以下元數(shù)據(jù)元素副砍,而無需讓應(yīng)用變成可調(diào)試應(yīng)用:

<application ... >  
  <meta-data  android:name="com.android.graphics.injectLayers.enable"  
                       android:value="true"  />  
</application>  

適用于 OpenGL ES 的 ANGLE

您可以使用 ANGLE 運(yùn)行非核心應(yīng)用以評(píng)估性能衔肢,并確定特定應(yīng)用是否應(yīng)使用 ANGLE,而不是原生 OpenGL ES 驅(qū)動(dòng)程序豁翎。有關(guān)說明角骤,請(qǐng)參閱使用適用于 OpenGL ES 的 ANGLE

圖片和相機(jī)

在主動(dòng)拍攝期間關(guān)閉通知提示音和振動(dòng)

從 Android 11 開始心剥,在主動(dòng)使用相機(jī)時(shí)邦尊,您的應(yīng)用可以使用 setCameraAudioRestriction() 以僅關(guān)閉振動(dòng)、同時(shí)關(guān)閉聲音和振動(dòng)或都不關(guān)閉优烧。

Android 模擬器中的相機(jī)支持?jǐn)U展

Android 11 改進(jìn)了Android 模擬器相機(jī)功能蝉揍。添加的功能包括:

  • RAW 捕獲
  • YUV 重新處理
  • 3 級(jí)設(shè)備
  • 邏輯攝像頭支持

更好地支持包含多個(gè)幀的 HEIF 圖片

從 Android 11 開始,如果您調(diào)用 ImageDecoder.decodeDrawable() 并傳遞包含幀序列的 HEIF 圖片(如動(dòng)畫或連拍照片)畦娄,則該方法會(huì)返回包含整個(gè)圖片序列的 AnimatedImageDrawable疑苫。在較低版本的 Android 系統(tǒng)中,該方法會(huì)返回僅包含單個(gè)幀的 BitmapDrawable纷责。

如果 HEIF 圖片包含的多個(gè)幀不在一個(gè)序列中捍掺,您可以通過調(diào)用 MediaMetadataRetriever.getImageAtIndex() 檢索各個(gè)幀。

無障礙功能

面向無障礙服務(wù)開發(fā)者的更新

如果您創(chuàng)建自定義無障礙服務(wù)再膳,可以在 Android 11 中使用以下功能:

  • 在無障礙服務(wù)的面向用戶的解釋中挺勿,除了純文本之外,現(xiàn)在還允許使用 HTML 和圖片喂柒。這種靈活性可讓您更輕松地向最終用戶解釋您的服務(wù)有何功能以及對(duì)他們有何幫助不瓶。
  • 如需使用比 contentDescription 在語(yǔ)義上更有意義的界面元素的狀態(tài)說明,請(qǐng)調(diào)用 getStateDescription() 方法灾杰。
  • 如需請(qǐng)求觸摸事件繞過系統(tǒng)的觸摸瀏覽器蚊丐,請(qǐng)調(diào)用 setTouchExplorationPassthroughRegion()。同樣艳吠,如需請(qǐng)求手勢(shì)繞過系統(tǒng)的手勢(shì)檢測(cè)器未玻,請(qǐng)調(diào)用 setGestureDetectionPassthroughRegion()
  • 您可以請(qǐng)求 IME 操作(如“輸入”和“下一個(gè)”)搓彻,以及不啟用 FLAG_SECURE 標(biāo)記的窗口的屏幕截圖峦甩。

其他功能

應(yīng)用進(jìn)程退出原因

Android 11 引入了 ActivityManager.getHistoricalProcessExitReasons() 方法,用于報(bào)告近期任何進(jìn)程終止的原因栏渺。應(yīng)用可以使用此方法收集崩潰診斷信息呛梆,例如進(jìn)程終止是由于 ANR、內(nèi)存問題還是其他原因所致磕诊。此外填物,您還可以使用新的 setProcessStateSummary() 方法存儲(chǔ)自定義狀態(tài)信息纹腌,以便日后進(jìn)行分析。

getHistoricalProcessExitReasons() 方法會(huì)返回 ApplicationExitInfo 類的實(shí)例滞磺,該類包含與應(yīng)用進(jìn)程終止相關(guān)的信息壶笼。通過對(duì)此類的實(shí)例調(diào)用 getReason(),您可以確定應(yīng)用進(jìn)程終止的原因雁刷。例如覆劈,REASON_CRASH 的返回值表示應(yīng)用中發(fā)生了未處理的異常。如果應(yīng)用需要確保退出事件的唯一性沛励,可以保留特定于應(yīng)用的標(biāo)識(shí)符责语,例如基于 getTimestamp() 方法的時(shí)間戳的哈希值。

資源加載器

歡迎您提供相關(guān)反饋目派!請(qǐng)?zhí)顚戇@份簡(jiǎn)短的調(diào)查問卷坤候,將您使用此功能的情況告知我們。特別是企蹭,請(qǐng)將受此功能影響的用例告知我們白筹。

Android 11 引入了一個(gè)新 API,允許應(yīng)用動(dòng)態(tài)擴(kuò)展資源的搜索和加載方式谅摄。新的 API 類 ResourcesLoaderResourcesProvider 主要負(fù)責(zé)提供新功能徒河。兩者協(xié)同作用,可以提供額外的資源送漠,或修改現(xiàn)有資源的值顽照。

ResourcesLoader 對(duì)象是向應(yīng)用的 Resources 實(shí)例提供 ResourcesProvider 對(duì)象的容器,而 ResourcesProvider 對(duì)象提供從 APK 和資源表加載資源數(shù)據(jù)的方法闽寡。

此 API 的一個(gè)主要用例是自定義資源加載代兵。您可以將新 API 類 DirectoryAssetsProvider 的實(shí)例與 ResourcesProvider 配對(duì),以重定向基于文件的資源的解析爷狈,這樣就只需搜索特定目錄植影,而無需搜索應(yīng)用 APK。您可以通過 AssetManager API 類中的 open() 系列方法訪問這些資源涎永,就像訪問 APK 中綁定的資源一樣思币。

APK 簽名方案 v4

Android 11 添加了對(duì) APK 簽名方案 v4 的支持。此方案會(huì)在單獨(dú)的文件 (apk-name.apk.idsig) 中生成一種新的簽名土辩,但在其他方面與 v2 和 v3 類似支救。沒有對(duì) APK 進(jìn)行任何更改。此方案支持 ADB 增量 APK 安裝拷淘,這樣會(huì)加快 APK 安裝速度。

動(dòng)態(tài) intent 過濾器

如需接收 intent指孤,應(yīng)用必須通過在其清單中定義 intent 過濾器启涯,在編譯時(shí)聲明它能夠接收哪些類型的數(shù)據(jù)贬堵。在 Android 10 及更低版本中,應(yīng)用無法在運(yùn)行時(shí)更改其 intent 過濾器结洼。這對(duì)于虛擬化應(yīng)用(如虛擬機(jī)和遠(yuǎn)程桌面)而言是一個(gè)問題黎做,因?yàn)檫@些應(yīng)用無法確切得知用戶將在它們內(nèi)部安裝什么軟件。

Android 11 引入了 MIME 組松忍,這是一個(gè)新的清單元素蒸殿,可讓應(yīng)用在 intent 過濾器中聲明一組動(dòng)態(tài)的 MIME 類型,并在運(yùn)行時(shí)以編程方式對(duì)其進(jìn)行修改鸣峭。如需使用 MIME 組宏所,請(qǐng)使用新的 android:mimeGroup 屬性在應(yīng)用清單中添加一個(gè)數(shù)據(jù)元素:

  <intent-filter> 
   <action  android:name="android.intent.action.SEND"/> 
   <category  android:name="android.intent.category.DEFAULT"/>  
    <data  android:mimeGroup="myMimeGroup"/>  
  </intent-filter>  

android:mimeGroup 屬性的值是任意字符串 ID,用于在運(yùn)行時(shí)標(biāo)識(shí) MIME 組摊溶。您可以通過將某個(gè) MIME 組的 ID 傳遞給 PackageManager API 類中的以下新方法爬骤,訪問和更新該 MIME 組的內(nèi)容:

如果您以編程方式將 MIME 類型添加到 MIME 組,其運(yùn)作方式與清單中明確聲明的靜態(tài) MIME 類型完全相同莫换。

注意mimeGroup 字符串是基于每個(gè)軟件包定義的霞玄。在同一軟件包中,您可以在多個(gè) intent 過濾器或組件中使用相同的 mimeGroup 字符串以聲明它們之間共享的 MIME 組拉岁。不同的軟件包不能共享 MIME 組坷剧,但它們可以使用相同的 mimeGroup 字符串,而不相互干擾喊暖。

自動(dòng)填充增強(qiáng)功能

Android 11 改進(jìn)了自動(dòng)填充服務(wù)听隐。

AssistStructure.ViewNode 中的提示標(biāo)識(shí)符

對(duì)自動(dòng)填充服務(wù)來說,根據(jù)視圖的屬性計(jì)算視圖的簽名哈希值通常很有用哄啄。在計(jì)算簽名哈希值時(shí)雅任,視圖提示是一個(gè)非常值得參考的屬性,但提示字符串可能會(huì)隨著手機(jī)的語(yǔ)言區(qū)域而發(fā)生變化咨跌。為了解決此問題沪么,Android 11 使用新的 getHintIdEntry() 方法擴(kuò)展了 AssistStructure.ViewNode,該方法會(huì)返回視圖提示文本的資源標(biāo)識(shí)符锌半。此方法提供一個(gè)與語(yǔ)言區(qū)域無關(guān)的值禽车,可用于計(jì)算簽名哈希值。

提供了數(shù)據(jù)集的事件

為了幫助自動(dòng)填充服務(wù)提高建議內(nèi)容的質(zhì)量刊殉,Android 11 提供了一種方法以識(shí)別自動(dòng)填充服務(wù)提供了數(shù)據(jù)集但用戶未選擇任何數(shù)據(jù)集的情況殉摔。在 Android 11 中,FillEventHistory 會(huì)報(bào)告一種新的 TYPE_DATASETS_SHOWN 事件類型记焊。每當(dāng)自動(dòng)填充服務(wù)向用戶提供一個(gè)或多個(gè)數(shù)據(jù)集時(shí)逸月,FillEventHistory 就會(huì)記錄此類型的事件。自動(dòng)填充服務(wù)可以將這些事件與現(xiàn)有的 TYPE_DATASET_SELECTED 事件結(jié)合使用來確定用戶是否選擇了任何提供的自動(dòng)填充選項(xiàng)遍膜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碗硬,一起剝皮案震驚了整個(gè)濱河市瓤湘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恩尾,老刑警劉巖弛说,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異翰意,居然都是意外死亡木人,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門冀偶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來醒第,“玉大人,你說我怎么就攤上這事蔫磨√约ィ” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵堤如,是天一觀的道長(zhǎng)蒲列。 經(jīng)常有香客問我,道長(zhǎng)搀罢,這世上最難降的妖魔是什么蝗岖? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮榔至,結(jié)果婚禮上抵赢,老公的妹妹穿的比我還像新娘。我一直安慰自己唧取,他們只是感情好铅鲤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枫弟,像睡著了一般邢享。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淡诗,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天骇塘,我揣著相機(jī)與錄音,去河邊找鬼韩容。 笑死款违,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的群凶。 我是一名探鬼主播插爹,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼座掘!你這毒婦竟也來了递惋?” 一聲冷哼從身側(cè)響起柔滔,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤溢陪,失蹤者是張志新(化名)和其女友劉穎萍虽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體形真,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杉编,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咆霜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邓馒。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛾坯,靈堂內(nèi)的尸體忽然破棺而出光酣,到底是詐尸還是另有隱情,我是刑警寧澤脉课,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布救军,位于F島的核電站,受9級(jí)特大地震影響倘零,放射性物質(zhì)發(fā)生泄漏唱遭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一呈驶、第九天 我趴在偏房一處隱蔽的房頂上張望拷泽。 院中可真熱鬧,春花似錦袖瞻、人聲如沸司致。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脂矫。三九已至,卻和暖如春砌庄,著一層夾襖步出監(jiān)牢的瞬間羹唠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工娄昆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佩微,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓萌焰,卻偏偏與公主長(zhǎng)得像哺眯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扒俯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359