功能與 API 總覽

Android 11 為開發人員推出了強大的新功能和 API。以下各節可協助您瞭解應用程式功能,並開始使用相關的 API。

如需新增、修改及移除 API 的詳細清單,請參閱 API 差異比較表。如要進一步瞭解新的 API,請參閱 Android API 參考資料 - 新的 API 會醒目顯示,以利於查看。此外,如要瞭解平台變更可能對應用程式造成的影響,請務必查看指定 Android R 的應用程式所有應用程式的 Android 11 行為變更,以及隱私權變更

全新使用體驗

裝置控制項

Android 11 包含新的 ControlsProviderService API,可用於公開已連結外部裝置的控制項。這些控制項會顯示在 Android 電源選單的「Device controls」中。詳情請參閱「控制外部裝置」。

媒體控制

Android 11 更新了媒體控制項的顯示方式。媒體控制選項會顯示在快速設定附近。多個應用程式的工作階段會整理成滑動式輪轉介面,其中包括手機本機播放的串流、遠端串流 (例如在外部裝置或投放工作階段偵測到的串流),以及先前播放的續用工作階段 (按照上次播放順序排列)。

使用者可以透過輪轉介面重新啟動先前的會話,而無須啟動應用程式。播放開始後,使用者可以以一般方式操作媒體控制項。

詳情請參閱「媒體控制項」。

螢幕

更完善地支援瀑布式廣告串聯

Android 11 提供多個 API 來支援瀑布式螢幕,也就是環繞裝置邊緣的螢幕。這類螢幕會視為含有螢幕凹口的螢幕變化版本。現有的 DisplayCutout.getSafeInset…() 方法現在會傳回安全內嵌,以避免出現瀑布區域和裁剪區域。如要在瀑布區域中算繪應用程式內容,請按照下列步驟操作:

轉軸角度感應器和折疊式裝置

在 Android 11 中,如果裝置採用轉軸式螢幕設定,應用程式可透過 TYPE_HINGE_ANGLE 提供新的感應器,以及可監控轉軸角度並以度數為單位提供裝置兩個主要元件之間測量值的新 SensorEvent,來判斷轉軸角度。您可以使用這些原始測量資料,在使用者操作裝置時執行精細的動畫。

請參閱「摺疊式裝置」。

對話

對話功能改善

Android 11 改善了對話的處理方式。對話是指兩人以上使用者之間的即時雙向通訊。這些對話會獲得特別的優先顯示,使用者也能透過多種新方式與對話互動。

如要進一步瞭解對話和應用程式如何支援對話,請參閱「人物和對話」。

即時通訊泡泡

開發人員現在可以使用對話框,在系統中顯示對話內容。Bubbles 是 Android 10 中的實驗功能,必須透過開發人員選項啟用;在 Android 11 中,這項操作已不再必要。

如果應用程式指定 Android 11 (API 級別 30) 以上版本,除非通知符合新的對話規定,否則不會以對話框形式顯示。具體來說,通知必須與捷徑建立關聯。

在 Android 11 以下版本,如要讓通知以對話框形式顯示,則必須明確指定通知設為一律在文件 UI 模式下啟動。從 Android 11 開始,您不必再明確設定這項設定;如果通知已顯示,平台會自動將通知設為一律以文件 UI 模式啟動。

我們改善了許多氣泡效能,使用者在啟用和停用各個應用程式中的氣泡時,也能享有更彈性的操作方式。對於實作實驗功能的開發人員而言,Android 11 中的 API 也有一些變更:

5G 視覺指標

如要瞭解如何在使用者的裝置上顯示 5G 指標,請參閱「告知使用者何時使用 5G」。

隱私權

Android 11 推出大量變更和限制,以強化使用者隱私。詳情請參閱隱私權頁面。

安全性

生物特徵辨識驗證更新

為協助您控管應用程式資料的安全性等級,Android 11 針對生物特徵驗證功能進行了多項改善。這些變更也會顯示在 Jetpack Biometric 程式庫中。

驗證類型

Android 11 推出 BiometricManager.Authenticators 介面,可用於宣告應用程式支援的驗證類型

判斷使用哪種驗證類型

使用者驗證完畢後,您可以透過呼叫 getAuthenticationType(),檢查使用者是使用裝置憑證還是生物特徵辨識憑證完成驗證。

針對單次使用驗證金鑰的其他支援

Android 11 進一步支援使用按使用付費的金鑰進行驗證

已淘汰的方法

Android 11 已淘汰下列方法:

  • setDeviceCredentialAllowed() 方法。
  • setUserAuthenticationValidityDurationSeconds() 方法。
  • 不接受引數的 canAuthenticate() 超載版本。

安全共用大型資料集

在某些情況下 (例如涉及機器學習或媒體播放),您的應用程式可能會與其他應用程式使用相同的大型資料集。在先前版本的 Android 中,您的應用程式和其他應用程式都需要下載相同資料集的個別副本。

為減少網路和磁碟上的資料備援,Android 11 允許使用共用資料 blob,在裝置上快取這些大型資料集。如要進一步瞭解如何共用資料集,請參閱共用大型資料集的深度指南

在 OTA 重新啟動後,不使用使用者憑證執行檔案型加密

裝置完成 OTA 更新並重新啟動後,放置在憑證保護儲存空間中的憑證加密金鑰 (CE) 即可立即用於檔案型加密 (FBE) 作業。也就是說,在 OTA 更新後,應用程式可在使用者輸入 PIN 碼、圖案或密碼之前,恢復需要 CE 金鑰的作業。

效能與品質

無線偵錯

Android 11 支援透過 Android Debug Bridge (ADB),從工作站以無線方式部署應用程式並進行偵錯。舉例來說,您可以將可進行偵錯的應用程式部署至多部遠端裝置,不僅不必實際透過 USB 連接裝置,也不用處理常見的 USB 連線問題 (例如安裝驅動程式)。詳情請參閱「在硬體裝置上執行應用程式」。

ADB 漸進式 APK 安裝

即使只對應用程式略微變更,在裝置上安裝大型 (2 GB 以上) APK 可能需要很長的時間。即使只有小幅變更應用程式,ADB (Android Debug Bridge) 漸進式 APK 安裝的 APK 也會安裝足夠的 APK 來啟動應用程式,同時在背景串流剩餘資料,進而加快這項程序。如果裝置支援這項功能,且您已安裝最新的 SDK Platform-Toolsadb install 就會自動使用這項功能。如果不支援,系統會默默使用預設安裝方法。

使用下列 adb 指令即可使用這項功能。如果裝置不支援漸進式安裝,指令就會失敗,並顯示詳細說明。

adb install --incremental

在執行 ADB 增量 APK 安裝作業之前,您必須簽署 APK,並建立 APK Signature Scheme v4 檔案。如要使用這項功能,請務必將 v4 簽署檔案放在 APK 旁邊。

使用原生記憶體配置器偵測錯誤

GWP-ASan 是一種原生記憶體配置器功能,可協助找出釋放後使用和堆積緩衝區溢位錯誤。您可以全域啟用這項功能,也可以為應用程式的特定子程序啟用。如需更多資訊,請參閱 GWP-ASan 指南

Neural Networks API 1.3

Android 11 擴充並改善了 Neural Networks API (NNAPI)

新作業

NNAPI 1.3 推出了新的運算元類型 TENSOR_QUANT8_ASYMM_SIGNED,以支援 TensorFlow Lite 的新量化配置

此外,NNAPI 1.3 還推出了下列新運算:

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

全新機器學習控制選項

NNAPI 1.3 推出新的控制選項,協助機器學習順暢運作:

NDK Thermal API

當裝置過熱時,裝置可能會對 CPU 和/或 GPU 進行節流措施,進而以非預期方式影響應用程式。如果應用程式或遊戲使用複雜的圖形、大量運算或持續的網路活動,就更有可能引發問題。

使用 Android 11 中的 NDK Thermal API 監控裝置的溫度變化,然後採取相應措施,以維持較低的耗電量和裝置溫度。這個 API 與 Java Thermal API 類似,可用來接收任何熱力狀態變更的通知,或直接輪詢目前狀態。

文字和輸入

改善 IME 轉換效果

Android 11 推出新的 API,可改善輸入法編輯器 (IME) 的轉換效果,例如螢幕鍵盤。這些 API 可讓您更輕鬆地調整應用程式內容,以便與 IME 的顯示和消失狀態同步,以及與狀態列和導覽列等其他元素同步。

如要在任何 EditText 有焦點時顯示輸入法編輯器,請呼叫 view.getInsetsController().show(Type.ime())。(您可以在與聚焦 EditText 相同的階層中的任何檢視區塊上呼叫這個方法,不必特別在 EditText 上呼叫此方法)。如要隱藏 IME,請呼叫 view.getInsetsController().hide(Type.ime())。您可以呼叫 view.getRootWindowInsets().isVisible(Type.ime()) 來檢查目前是否可見輸入法編輯器。

如要讓應用程式的檢視畫面與 IME 的顯示和隱藏狀態同步,請為檢視畫面設定事件監聽器,方法是將 WindowInsetsAnimation.Callback 提供給 View.setWindowInsetsAnimationCallback()。(您可以在任何檢視畫面上設定這個事件監聽器,不必是 EditText。) IME 會呼叫事件監聽器的 onPrepare() 方法,然後在轉換開始時呼叫 onStart()。然後在轉換過程中的每個階段呼叫 onProgress()。轉換完成後,IME 會呼叫 onEnd()。您可以在轉換過程中的任何時間點,呼叫 WindowInsetsAnimation.getFraction() 來瞭解轉換進度。

如需這些 API 的使用範例,請參閱新的 WindowInsetsAnimation 程式碼範例。

控制 IME 動畫

您也可以控制輸入法編輯器動畫,或是導覽列等其他系統列的動畫。如要這麼做,請先呼叫 setOnApplyWindowInsetsListener(),為視窗內嵌變更設定新的事件監聽器:

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.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.
    WindowInsets.CONSUMED
}

Java

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;
   }
});

如要移動輸入法編輯器或其他系統列,請呼叫控制器的 controlWindowInsetsAnimation() 方法:

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

Java

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 程式庫更新

與 Android 10 的 63 版相比,Android 11 會更新 android.icu 套件來使用 ICU 程式庫 66 版。新版程式庫包含更新的 CLDR 語言代碼資料,以及多項 Android 國際化支援功能的強化功能。

新版程式庫的重大異動包括:

  • 許多格式 API 現在支援可擴充 FormattedValue 的新傳回物件類型。
  • LocaleMatcher API 經過強化,加入了建構工具類別、支援 java.util.Locale 類型,以及提供關於比對結果的其他資料的結果類別。
  • 現已支援 Unicode 13。

媒體

分配 MediaCodec 緩衝區

Android 11 包含新的 MediaCodec API,可讓應用程式在分配輸入和輸出緩衝區時,享有更完善的控管權限。這樣一來,應用程式就能更有效率地管理記憶體。

新課程:
新方法:

此外,MediaCodec.Callback() 中兩種方法的行為已變更:

onInputBufferAvailable()
若應用程式設為使用 Block Model API,則不應透過索引呼叫 MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer(),而是使用 MediaCodec.getQueueRequest 搭配索引,並將 LinearBlock/HardwareBuffer 附加至該運算單元。
onOutputBufferAvailable()
應用程式可利用索引使用 MediaCodec.getOutputFrame() 取得更多資訊和 LinearBlock/HardwareBuffer 緩衝區的 OutputFrame 物件,而非透過索引呼叫 MediaCodec.getOutputBuffer()

MediaCodec 中的低延遲解碼

Android 11 強化了 MediaCodec,可為遊戲和其他即時應用程式提供低延遲解碼功能。您可以將 FEATURE_LowLatency 傳遞至 MediaCodecInfo.CodecCapabilities.isFeatureSupported(),藉此檢查轉碼器是否支援低延遲解碼作業。

如要啟用或停用低延遲解碼功能,請執行下列任一操作:

新的 AAudio 函式 AAudioStream_release()

AAudioStream_close() 函式會同時釋放及關閉音訊串流。這可能會造成危險。如果其他程序在串流關閉後嘗試存取該串流,則該程序會異常終止。

新函式 AAudioStream_release() 會釋出串流,但不會關閉。這麼做可釋出資源,並讓串流維持在已知狀態。物件會持續存在,直到您呼叫 AAudioStream_close() 為止。

MediaParser API

MediaParser 是用於媒體擷取的新低階 API。這項 API 比 MediaExtractor 更具彈性,並提供額外的媒體擷取功能控制項。

從 USB 裝置擷取音訊

如果應用程式沒有 RECORD_AUDIO 權限,並使用 UsbManager 要求直接存取具備音訊擷取功能的 USB 音訊裝置 (例如 USB 耳機),系統會顯示新警示訊息,要求使用者確認授予裝置使用權限。系統會忽略所有「一律使用」選項,因此當應用程式要求存取權時,使用者每次都必須查看警示並授予權限。

為了避免這個行為,應用程式應該要求 RECORD_AUDIO 權限。

同時存取麥克風

Android 11 為 AudioRecordMediaRecorderAAudioStream API 新增方法。無論所選用途為何,這些方法都能啟用及停用同時擷取功能。請參閱「分享音訊輸入內容」。

輸出端切換器

Android 11 會針對使用 Cast 和 mediarouter API 的應用程式實作新行為。

除了從應用程式中存取投放選項,系統媒體播放器也會顯示切換選項。這樣一來,當使用者在不同裝置間切換時,就能在變更觀看和聆聽情境時,提供流暢的使用體驗,例如在廚房中觀看影片,而不是在手機上觀看,或是在家中或車內聆聽音訊。請參閱輸出切換器

連線能力

Wi-Fi Passpoint 強化功能

如要瞭解 Android 11 中新增的 Passpoint 功能,請參閱「Passpoint」。

擴充 Wi-Fi Suggestion API

Android 11 擴充了 Wi-Fi Suggestion API,可提升應用程式的網路管理功能,包括:

  • 連線管理應用程式可透過允許中斷連線要求來管理自己的網路。
  • Passpoint 網路已整合至 Suggestion API,可向使用者推薦。
  • Analytics API 可讓您取得網路品質的相關資訊。

CallScreeningService 更新

從 Android 11 開始,CallScreeningService 可要求取得來電的 STIR/SHAKEN 驗證狀態 (反面) 相關資訊。這項資訊會在來電的呼叫詳細資料中提供。

如果 CallScreeningService 持有 READ_CONTACTS 權限,當使用者聯絡人中的號碼有來電或撥出電話時,應用程式就會收到通知。

詳情請參閱「避免假冒來電顯示」。

Open Mobile API 更新

如要瞭解 Android 11 以上版本的 OMAPI 支援情況,請參閱「Open Mobile API reader 支援」。

效能良好的 VPN

指定 API 級別 30 以上版本的應用程式,或在 API 級別 29 以上版本啟動的裝置上執行的應用程式,都可以將 IKEv2/IPsec 套用至使用者設定的 VPN 和應用程式 VPN。

VPN 會在作業系統上原生執行,簡化在應用程式中建立 IKEv2/IPsec VPN 連線所需的程式碼。

個別程序網路存取權控管

如要瞭解如何針對個別程序啟用網路存取權,請參閱「管理網路用量」。

允許使用相同 FQDN 的多個已安裝的 Passpoint 設定

從 Android 11 開始,您可以使用 PasspointConfiguration.getUniqueId() 取得 PasspointConfiguration 物件的專屬 ID,讓應用程式使用者能夠安裝具有相同完整網域名稱 (FQDN) 的多個設定檔。

如果電信業者在網路上部署了多個行動裝置國家/地區代碼 (MCC) 和行動網路識別碼 (MNC) 組合,但只有一個 FQDN,這項功能就很實用。在 Android 11 以上版本中,使用者可安裝多個設定檔,且這些設定檔的 FQDN 與網路相同,當使用者安裝含有 MCC 或 MNC 的 SIM 卡時,這些設定檔會與 Home 供應商的網路相符。

支援 GNSS 天線

Android 11 導入了 GnssAntennaInfo 類別,可讓應用程式充分運用全球導航衛星系統 (GNSS) 可提供的公分準確定位。

詳情請參閱天線校正資訊指南。

圖形

NDK 圖片解碼器

NDK ImageDecoder API 提供標準 API,可讓 Android C/C++ 應用程式直接將圖片解碼。應用程式開發人員不再需要使用架構 API (透過 JNI) 或內含第三方圖片解碼程式庫。詳情請參閱圖片解碼器開發人員指南

畫面更新率 API

Android 11 提供 API,可讓應用程式向系統告知其預期的幀率,以便在支援多種更新率的裝置上減少抖動。如要進一步瞭解如何使用此 API,請參閱影格速率指南

要求並檢查低延遲支援

某些外接螢幕和電視等螢幕可執行圖像後製處理。這種後續處理可以改善圖形,但可能會增加延遲。支援 HDMI 2.1 的新型螢幕具有自動低延遲模式 (ALLM,也稱為遊戲模式),可關閉後續處理功能,盡量減少延遲時間。如要進一步瞭解 ALLM,請參閱 HDMI 2.1 規格

視窗可以要求使用自動低延遲模式 (如有)。ALLM 特別適合用於遊戲和視訊會議等應用程式,因為在這些應用程式中,低延遲比盡可能提供最佳圖像更為重要。

如要開啟或關閉最小化後製處理功能,請呼叫 Window.setPreferMinimalPostProcessing(),或將視窗的 preferMinimalPostProcessing 屬性設為 true。並非所有螢幕都支援最少的後續處理作業;如要確認特定螢幕是否支援這類功能,請呼叫新方法 Display.isMinimalPostProcessingSupported()

高效的圖形偵錯圖層注入

應用程式現在可以將外部圖形圖層 (GLESVulkan) 載入至原生應用程式程式碼,以便提供與可偵錯應用程式相同的功能,但不會產生效能負擔。使用 GAPID 等工具分析應用程式時,這項功能就特別重要。如要剖析應用程式,請在應用程式資訊清單檔案中加入下列 meta-data 元素,而不要將應用程式設為可進行偵錯:

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

圖片和相機

在主動拍攝期間關閉通知音效和震動

從 Android 11 開始,在使用相機時,應用程式只能使用 setCameraAudioRestriction() 關閉震動、聲音和震動,或關閉所有聲音和震動。

更豐富的 Android Emulator 相機支援功能

如要瞭解模擬器從 Android 11 開始進一步支援相機,請參閱「相機支援」。

支援同時使用多部攝影機

Android 11 新增了針對一次使用多個相機 (包括前置和後置鏡頭) 的查詢支援的 API。

如要檢查應用程式執行裝置是否支援,請使用下列方法:

更完善地支援含有多個影格 HEIF 圖片

從 Android 11 開始,如果您呼叫 ImageDecoder.decodeDrawable() 並傳遞包含影格序列 (例如動畫或連拍相片) 的 HEIF 圖片,這個方法會傳回包含整個圖片序列的 AnimatedImageDrawable。在較舊的 Android 版本中,該方法只會傳回單一影格的 BitmapDrawable

如果 HEIF 圖形包含多個不按順序排列的影格,您可以呼叫 MediaMetadataRetriever.getImageAtIndex() 來擷取個別影格。

無障礙設定

無障礙服務開發人員的最新消息

如果您建立自訂無障礙服務,可以在 Android 11 中使用下列功能:

  • 無障礙服務的使用者說明現在除了純文字之外,還允許使用 HTML 和圖片。這種靈活性可讓您更輕鬆地向使用者解釋服務的功能,以及如何協助他們。
  • 如要使用 UI 元素狀態的說明,且其語意比 contentDescription 更有意義,請呼叫 getStateDescription() 方法。
  • 如需要求觸控事件略過系統的觸控探索工具,請呼叫 setTouchExplorationPassthroughRegion()。同樣地,如要要求手勢略過系統的手勢偵測器,請呼叫 setGestureDetectionPassthroughRegion()
  • 您可以要求 IME 動作 (例如「Enter」和「next」),以及未啟用 FLAG_SECURE 旗標的視窗螢幕截圖。

其他功能

應用程式程序結束原因

Android 11 導入了 ActivityManager.getHistoricalProcessExitReasons() 方法,可回報近期終止程序的原因。應用程式可使用這個方法收集當機診斷資訊,例如程序終止是否是因為 ANR、記憶體問題或其他原因。此外,您也可以使用新的 setProcessStateSummary() 方法儲存自訂狀態資訊,以利日後分析。

getHistoricalProcessExitReasons() 方法會傳回 ApplicationExitInfo 類別的例項,其中包含與應用程式程序終止相關的資訊。您可以在這個類別的例項上呼叫 getReason(),藉此判斷應用程式程序遭到終止的原因。舉例來說,如果傳回值為 REASON_CRASH,表示應用程式發生未處理的例外狀況。如果應用程式需要確保退出事件的唯一性,可以保留應用程式專屬的 ID,例如根據 getTimestamp() 方法的時間戳記計算的雜湊值。

其他資源

如需更多資訊,請參閱 Medium 上的文章,瞭解如何使用 Android 11 的新工具,讓應用程式更具隱私性和穩定性

資源載入器

Android 11 導入了新的 API,可讓應用程式以動態方式擴充資源的搜尋和載入方式。新的 API 類別 ResourcesLoaderResourcesProvider 主要負責提供新功能。這兩者結合後,可提供額外資源和資產,或修改現有資源和資產的值。

ResourcesLoader 物件是容器,可將 ResourcesProvider 物件提供給應用程式的 Resources 例項。反過,ResourcesProvider 物件會提供從 APK 和資源資料表載入資源資料的方法。

這個 API 的主要用途之一,就是載入自訂素材資源。您可以使用 loadFromDirectory() 建立 ResourcesProvider,將檔案型資源和資產的解析度重新導向,讓系統搜尋特定目錄,而非應用程式 APK。您可以透過 AssetManager API 類別的 open() 系列方法存取這些資產,就像在 APK 中綁定的資產一樣。

APK 簽署配置 v4

Android 11 新增了對 APK Signature Scheme v4 的支援。這項配置會在另一個檔案 (apk-name.apk.idsig) 中產生新類型的簽名,但其他方面與 v2 和 v3 相似。不會對 APK 進行任何變更。此配置可支援 ADB 漸進式 APK 安裝作業,可加快 APK 安裝速度。

動態意圖篩選器

如要接收意圖,應用程式必須在編譯時宣告可接收的資料類型,方法是在應用程式資訊清單中定義意圖篩選器。在 Android 10 以下版本中,應用程式無法在執行階段變更意圖篩選器。這對虛擬化應用程式 (例如虛擬機器和遠端桌面) 而言是個問題,因為這些應用程式無法確切得知使用者會在其中安裝哪些軟體。

Android 11 推出 MIME 群組,這是一種新的資訊清單元素,可讓應用程式在意圖篩選器中宣告動態的 MIME 類型集合,並在執行階段以程式輔助方式修改該集合。如要使用 MIME 群組,請在應用程式資訊清單中加入資料元素,並使用新的 android:mimeGroup 屬性:

<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,可在執行階段識別 MIME 群組。您可以將 MIME 群組的 ID 傳遞至 PackageManager API 類別中的下列新方法,藉此存取及更新 MIME 群組的內容:

當您以程式輔助方式將 MIME 類型新增至 MIME 群組時,其運作方式與在資訊清單中明確宣告的靜態 MIME 類型完全相同。

自動填入強化功能

Android 11 推出了自動填入服務改善項目。

AssistStructure.ViewNode 中的提示 ID

自動填入服務通常會根據檢視畫面的屬性,為檢視畫面計算簽名雜湊。檢視提示是計算簽名雜湊時特別適合納入的屬性,但提示字串可能會因手機的語言代碼而異。為解決這個問題,Android 11 會使用新的 getHintIdEntry() 方法展開 AssistStructure.ViewNode,傳回檢視區塊提示文字的資源 ID。這個方法會提供不依地區設定的值,可用於計算簽名雜湊。

資料集顯示事件

為協助自動填入服務改善建議內容,Android 11 提供了一種方法,辨識自動填入服務顯示資料集,但使用者未選取任何資料集的情況。在 Android 11 中,FillEventHistory 會回報新的 TYPE_DATASETS_SHOWN 事件類型。FillEventHistory 會在自動填入服務向使用者顯示一或多個資料集時,記錄這類事件。自動填入服務可使用這些事件,並搭配現有的 TYPE_DATASET_SELECTED 事件,判斷使用者是否選取任何提供的自動填入選項。

輸入法編輯器整合

鍵盤和其他 IME 現可在建議列或類似介面中以內嵌方式顯示自動填入建議,而非在下拉式選單中顯示。為保護密碼和信用卡號碼等機密資訊,系統會向使用者顯示建議內容,但在使用者選取某個建議之前,IME 不會知道該內容。如要瞭解 IME 和密碼管理工具如何支援這項功能,請參閱「將自動填入功能整合到鍵盤」。

與內容擷取服務共用資料

自 Android 11 起,應用程式可與裝置的內容擷取服務分享資料。這項功能可讓裝置更輕鬆地提供情境相關資訊,例如顯示使用者環境中目前播放的歌曲名稱。

如要將應用程式資料提供給內容擷取服務,請在 ContentCaptureManager 的例項上呼叫 shareData() 方法。如果系統接受資料分享要求,應用程式就會收到只寫檔案描述元,以便與內容擷取服務分享。