功能與 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 安裝

即使只對應用程式進行小幅變更,在裝置上安裝大型 APK (2 GB 以上) 可能需要很長的時間。ADB (Android Debug Bridge) 漸進式 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 有焦點時顯示 IME,請呼叫 view.getInsetsController().show(Type.ime())。(您可以在與聚焦 EditText 相同階層的任何檢視畫面上呼叫此方法,不必特別在 EditText 上呼叫)。如要隱藏 IME,請呼叫 view.getInsetsController().hide(Type.ime())。您可以呼叫 view.getRootWindowInsets().isVisible(Type.ime()),檢查 IME 目前是否可見。

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

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

控制 IME 動畫

您也可以控制 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 11 會更新 android.icu 套件,以便使用 ICU 程式庫 的 66 版,而非 Android 10 的 63 版。新版程式庫包含更新的 CLDR 語言代碼資料,以及多項 Android 國際化支援功能的強化功能。

新版程式庫的顯著變更包括:

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

媒體

分配 MediaCodec 緩衝區

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

新課程:
新方法:

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

onInputBufferAvailable()
如果應用程式已設定為使用 Block Model API,則應使用 MediaCodec.getQueueRequest 和索引,而非使用 MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer(),並將 LinearBlock/HardwareBuffer 附加至插槽。
onOutputBufferAvailable()
應用程式可以使用 MediaCodec.getOutputFrame() 和索引,而非使用 MediaCodec.getOutputBuffer() 和索引,以便取得包含更多資訊和 LinearBlock/HardwareBuffer 緩衝區的 OutputFrame 物件。

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 為使用投放和 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 驗證狀態 (verstat) 的資訊。這項資訊會做為通話詳情的一部分提供,適用於來電。

如果 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 卡時的網路相符。

支援 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 等工具分析應用程式時,這項功能就特別重要。如要剖析應用程式,請在應用程式資訊清單檔案中加入下列中繼資料元素,而非讓應用程式可進行偵錯:

<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() 方法。如果系統接受資料分享要求,應用程式就會收到只寫檔案描述元,以便與內容擷取服務分享。