Android 6.0 API

Android 6.0 (M) 為使用者和應用程式開發人員提供新功能。本文將介紹最值得注意的 API。

立即開發

如要開始為 Android 6.0 建構應用程式,您必須先取得 Android SDK。然後使用 SDK Manager 下載 Android 6.0 SDK 平台和系統映像檔。

更新目標 API 級別

如要進一步針對搭載 Android 的裝置最佳化應用程式,請將 targetSdkVersion 設為 "23",在 Android 系統映像檔上安裝應用程式並進行測試,然後發布更新後的應用程式。

您可以在程式碼中加入條件,先檢查系統 API 級別,再執行 minSdkVersion 不支援的 API,這樣就能使用 Android API,同時支援舊版。如要進一步瞭解如何維持回溯相容性,請參閱「支援不同平台版本」。

如要進一步瞭解 API 級別的運作方式,請參閱「什麼是 API 級別?」

指紋驗證

這個版本提供新的 API,可讓您在支援的裝置上使用指紋掃描驗證使用者身分。請搭配 Android Keystore 系統使用這些 API。

如要透過指紋掃描驗證使用者,請取得新的 FingerprintManager 類別例項,並呼叫 authenticate() 方法。應用程式必須在具備指紋感應器的相容裝置上執行。您必須在應用程式中實作指紋驗證流程的使用者介面,並在 UI 中使用標準 Android 指紋圖示。Android 指紋圖示 (c_fp_40px.png) 包含在生物辨識驗證範例中。如果您開發多個使用指紋驗證的應用程式,請注意,每個應用程式都必須獨立驗證使用者的指紋。

如要在應用程式中使用這項功能,請先在資訊清單中新增 USE_FINGERPRINT 權限。

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />
手機顯示指紋驗證功能

如要查看指紋驗證的應用程式實作方式,請參閱「生物特徵辨識驗證範例」。如要瞭解如何搭配使用這些驗證 API 與其他 Android API,請觀看「 指紋和付款 API」影片。

如要測試這項功能,請按照下列步驟操作:

  1. 如果尚未安裝,請安裝 Android SDK 工具 修訂版本 24.3。
  2. 在模擬器中註冊新指紋,方法是依序前往「設定」>「安全性」>「指紋」,然後按照註冊指示操作。
  3. 使用模擬器,透過下列指令模擬指紋觸控事件。使用相同指令,在鎖定螢幕或應用程式中模擬指紋觸控事件。
    adb -e emu finger touch <finger_id>
    

    在 Windows 上,您可能需要先執行 telnet 127.0.0.1 <emulator-id>,再執行 finger touch <finger_id>。

確認憑證

應用程式可根據使用者上次解鎖裝置的時間,驗證使用者身分。這項功能可讓使用者不必記住其他應用程式專屬密碼,您也不必實作自己的驗證使用者介面。應用程式應搭配公開或私密金鑰實作項目,使用這項功能進行使用者驗證。

如要設定逾時時間長度,讓使用者成功通過驗證後,在逾時時間內可重複使用同一金鑰,請在設定 KeyGenerator 或 KeyPairGenerator 時呼叫新的 setUserAuthenticationValidityDurationSeconds() 方法。

請避免過度顯示重新驗證對話方塊,應用程式應先嘗試使用加密物件,如果逾時,請使用 createConfirmDeviceCredentialIntent() 方法在應用程式中重新驗證使用者。

應用程式連結

這個版本提供更強大的應用程式連結功能,進一步提升 Android 的意圖系統。這項功能可讓您將應用程式與自己擁有的網域建立關聯。根據這項關聯,平台可以判斷要使用哪個預設應用程式處理特定網頁連結,並略過提示使用者選取應用程式的步驟。如要瞭解如何導入這項功能,請參閱「處理應用程式連結」。

自動備份應用程式

系統現在會自動為應用程式執行完整資料備份和還原作業。應用程式必須指定 Android 6.0 (API 級別 23),才能啟用這項行為,您不需要新增任何額外程式碼。如果使用者刪除 Google 帳戶,備份資料也會一併刪除。如要瞭解這項功能的運作方式,以及如何設定要備份的檔案系統內容,請參閱「設定應用程式的自動備份功能」。

直接分享

手機底部顯示直接分享功能

這個版本提供 API,讓使用者能直覺且快速地分享內容。您現在可以定義直接分享目標,在應用程式中啟動特定活動。這些直接分享目標會透過「分享」選單向使用者顯示。這項功能可讓使用者在其他應用程式中,將內容分享給聯絡人等目標。舉例來說,直接分享目標可能會在另一個社群網路應用程式中啟動活動,讓使用者直接將內容分享給該應用程式中的特定好友或社群。

如要啟用直接分享目標,您必須定義擴充 ChooserTargetService 類別的類別。在資訊清單中宣告服務。在該宣告中,使用 SERVICE_INTERFACE 動作指定 BIND_CHOOSER_TARGET_SERVICE 權限和意圖篩選器。

以下範例說明如何在資訊清單中宣告 ChooserTargetService。

<service android:name=".ChooserTargetService"
        android:label="@string/service_name"
        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

針對要向 ChooserTargetService 公開的每個活動,在應用程式資訊清單中新增含有 "android.service.chooser.chooser_target_service" 名稱的 <meta-data> 元素。

<activity android:name=".MyShareActivity”
        android:label="@string/share_activity_label">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
<meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".ChooserTargetService" />
</activity>

語音互動

本次發布內容提供新的語音互動 API,搭配語音動作,即可在應用程式中打造對話式語音體驗。呼叫 isVoiceInteraction() 方法,判斷語音動作是否觸發活動。如果是,應用程式可以使用 VoiceInteractor 類別向使用者要求語音確認、從選項清單中選取項目等。

大多數語音互動都是由使用者語音動作發起。不過,語音互動活動也可以在沒有使用者輸入內容的情況下啟動。舉例來說,透過語音互動啟動的其他應用程式,也可以傳送啟動語音互動的意圖。如要判斷活動是透過使用者語音查詢啟動,還是透過其他語音互動應用程式啟動,請呼叫 isVoiceInteractionRoot() 方法。如果其他應用程式啟動了您的活動,這個方法會傳回 false。應用程式可能會提示使用者確認是否要執行這項操作。

如要進一步瞭解如何導入語音動作,請參閱語音動作開發人員網站。

Assist API

這個版本提供新方法,讓使用者透過 Google 助理與應用程式互動。如要使用這項功能,使用者必須允許助理使用當前內容。啟用後,使用者只要長按「首頁」按鈕,即可在任何應用程式中啟動 Google 助理。

應用程式可以設定 FLAG_SECURE 旗標,選擇不與 Google 助理分享目前的內容。除了平台傳遞給助理的標準資訊集,應用程式還可使用新的 AssistContent 類別分享額外資訊。

如要為智慧助理提供應用程式的額外背景資訊,請按照下列步驟操作:

  1. 實作 Application.OnProvideAssistDataListener 介面。
  2. 使用 registerOnProvideAssistDataListener() 註冊這個監聽器。
  3. 如要提供活動專屬的脈絡資訊,請覆寫 onProvideAssistData() 回呼,以及 (選擇性) 新的 onProvideAssistContent() 回呼。

可合併儲存空間的裝置

在此版本中,使用者可以採用外部儲存裝置,例如 SD 卡。採用外部儲存裝置會加密並格式化該裝置,使其行為類似於內部儲存空間。這項功能可讓使用者在儲存裝置之間移動應用程式和應用程式的私人資料。移動應用程式時,系統會遵守資訊清單中的 android:installLocation 偏好設定。

如果應用程式存取下列 API 或欄位,請注意,當應用程式在內部和外部儲存裝置之間移動時,這些 API 或欄位傳回的檔案路徑會動態變更。建立檔案路徑時,強烈建議您一律動態呼叫這些 API。請勿使用硬式編碼檔案路徑,也不要保留先前建構的完整檔案路徑。

如要偵錯這項功能,請執行下列指令,啟用透過 USB OTG 傳輸線連線至 Android 裝置的 USB 隨身碟:

$ adb shell sm set-force-adoptable true

通知

這個版本針對通知新增了下列 API 變更:

支援藍牙觸控筆

這個版本改善了藍牙觸控筆的使用者輸入支援功能。使用者可以將相容的藍牙觸控筆與手機或平板電腦配對及連線。連線後,觸控螢幕的位置資訊會與觸控筆的壓力及按鈕資訊融合,提供比單獨使用觸控螢幕更廣泛的表現範圍。應用程式可以監聽觸控筆按鈕按下動作,並透過在活動中註冊 View.OnContextClickListener 和 GestureDetector.OnContextClickListener 物件,執行次要動作。

使用 MotionEvent 方法和常數偵測觸控筆按鈕互動:

提升藍牙低功耗掃描功能

如果應用程式會執行藍牙低功耗掃描,請使用新的 setCallbackType() 方法指定您希望系統在首次找到或長時間後看到符合設定 ScanFilter 的廣告封包時,通知回呼。這種掃描方式比舊版平台提供的掃描方式更省電。

支援 Hotspot 2.0 第 1 版

這個版本在 Nexus 6 和 Nexus 9 裝置上新增支援 Hotspot 2.0 Release 1 規格。如要在應用程式中佈建 Hotspot 2.0 憑證,請使用 WifiEnterpriseConfig 類別的新方法,例如 setPlmn() 和 setRealm()。在 WifiConfiguration 物件中,您可以設定 FQDN 和 providerFriendlyName 欄位。新的 isPasspointNetwork() 方法會指出偵測到的網路是否為 Hotspot 2.0 存取點。

4K 顯示模式

現在,應用程式可要求平台在相容的硬體上將螢幕解析度升級至 4K 算繪。如要查詢目前的實體解析度,請使用新的 Display.Mode API。如果 UI 是以較低的邏輯解析度繪製,並放大至較大的實體解析度,請注意 getPhysicalWidth() 方法傳回的實體解析度可能與 getSize() 回報的邏輯解析度不同。

您可以在應用程式執行時,設定應用程式視窗的 preferredDisplayModeId 屬性,要求系統變更實體解析度。如果想切換至 4K 螢幕解析度,這項功能就非常實用。在 4K 顯示模式下,UI 仍會以原始解析度 (例如 1080p) 算繪,並放大至 4K,但 SurfaceView 物件可能會以原生解析度顯示內容。

可設定主題的 ColorStateList

搭載 Android 6.0 (API 級別 23) 的裝置現在支援 ColorStateList 中的主題屬性。Resources.getColorStateList() 和 Resources.getColor() 方法已淘汰。如果您呼叫這些 API,請改為呼叫新的 Context.getColorStateList() 或 Context.getColor() 方法。這些方法也可透過 ContextCompat 在 v4 appcompat 程式庫中使用。

音訊功能

這個版本改善了 Android 的音訊處理功能,包括:

  • 支援 MIDI 通訊協定,並提供新的 android.media.midi API。使用這些 API 傳送及接收 MIDI 事件。
  • 新的 AudioRecord.Builder 和 AudioTrack.Builder 類別,分別用於建立數位音訊擷取和播放物件,以及設定音訊來源和接收器屬性,以覆寫系統預設值。
  • 用於關聯音訊和輸入裝置的 API 勾點。如果應用程式允許使用者透過連線至 Android TV 的遊戲控制器或遙控器發起語音搜尋,這項功能就特別實用。使用者開始搜尋時,系統會叫用新的 onSearchRequested() 回呼。如要判斷使用者的輸入裝置是否內建麥克風,請從該回呼擷取 InputDevice 物件,然後呼叫新的 hasMicrophone() 方法。
  • 新的 getDevices() 方法,可讓您擷取目前連線至系統的所有音訊裝置清單。如果希望系統在音訊裝置連線或中斷連線時通知應用程式,也可以註冊 AudioDeviceCallback 物件。

影片功能

這個版本為影片處理 API 新增多項功能,包括:

  • 新的 MediaSync 類別,可協助應用程式同步算繪音訊和影片串流。音訊緩衝區會以非封鎖方式提交,並透過回呼傳回。此外,這項功能也支援動態播放速率。
  • 新的 EVENT_SESSION_RECLAIMED 事件,表示資源管理工具已回收應用程式開啟的會期。如果應用程式使用 DRM 工作階段,您應處理這項事件,並確保不會使用回收的工作階段。
  • 新的 ERROR_RECLAIMED 錯誤碼,表示資源管理工具已回收編解碼器使用的媒體資源。發生這項例外狀況時,編解碼器必須釋出,因為已進入終端狀態。
  • 新的 getMaxSupportedInstances() 介面,可取得支援的並行轉碼器執行個體數量上限提示。
  • 使用新的 setPlaybackParams() 方法設定媒體播放速率,即可快速或慢動作播放媒體。系統也會自動配合影片,延長或加快音訊播放速度。

相機功能

這個版本包含下列新 API,可存取相機的手電筒,以及對圖片進行相機後續處理:

手電筒 API

如果攝影機裝置有閃光燈單元,您可以呼叫 setTorchMode() 方法,開啟或關閉閃光燈單元的火炬模式,不必開啟攝影機裝置。應用程式不具備閃光燈或相機裝置的專屬擁有權。如果攝影機裝置無法使用,或是有其他攝影機資源維持手電筒開啟狀態,手電筒模式就會關閉並無法使用。其他應用程式也可以呼叫 setTorchMode() 關閉手電筒模式。關閉最後一個開啟手電筒模式的應用程式時,手電筒模式就會關閉。

呼叫 registerTorchCallback() 方法,即可註冊回呼,以便在手電筒模式狀態變更時收到通知。首次註冊回呼時,系統會立即呼叫回呼,並提供所有目前已知相機裝置的閃光燈模式狀態。如果手電筒模式成功開啟或關閉,系統會呼叫 onTorchModeChanged() 方法。

Reprocessing API

Camera2 API 擴充功能支援 YUV 和私有不透明格式的圖片重新處理。如要判斷是否可使用這些重新處理功能,請呼叫 getCameraCharacteristics() 並檢查 REPROCESS_MAX_CAPTURE_STALL 鍵。如果裝置支援重新處理,您可以呼叫 createReprocessableCaptureSession() 建立可重新處理的相機擷取工作階段,並建立輸入緩衝區重新處理的要求。

使用 ImageWriter 類別將輸入緩衝區流程連結至攝影機重新處理輸入內容。如要取得空白緩衝區,請按照下列程式設計模型操作:

  1. 呼叫 dequeueInputImage() 方法。
  2. 將資料填入輸入緩衝區。
  3. 呼叫 queueInputImage() 方法,將緩衝區傳送至攝影機。

如果您同時使用 ImageWriter 物件和 PRIVATE 圖片,應用程式就無法直接存取圖片資料。請改為直接將 PRIVATE 圖片傳遞至 ImageWriter,方法是呼叫 queueInputImage() 方法,且不複製任何緩衝區。

ImageReader 類別現在支援 PRIVATE 格式的圖片串流。這項支援可讓應用程式維護 ImageReader 輸出圖片的循環圖片佇列、選取一或多張圖片,並傳送至 ImageWriter 進行相機重新處理。

Android for Work 功能

這個版本包含下列 Android for Work 新 API:

  • 加強控管公司擁有的單一用途裝置:裝置擁有者現在可以控管下列設定,進一步管理公司擁有的單一用途 (COSU) 裝置:
  • 裝置擁有者可無聲安裝及解除安裝應用程式:裝置擁有者現在可使用 PackageInstaller API 無聲安裝及解除安裝應用程式,不需透過 Google Play for Work。您現在可以透過裝置擁有者佈建裝置,系統會自動擷取並安裝應用程式,使用者無須進行任何操作。這項功能可讓您一鍵佈建資訊站或其他類似裝置,不必啟用 Google 帳戶。
  • 企業憑證無聲存取: 當應用程式呼叫 choosePrivateKeyAlias() 時,在系統提示使用者選取憑證之前,設定檔或裝置擁有者現在可以呼叫 onChoosePrivateKeyAlias() 方法,以無聲方式將別名提供給要求存取的應用程式。這項功能可讓您授予受管理應用程式憑證存取權,使用者無需進行任何操作。
  • 自動接受系統更新。透過設定系統更新政策 (使用 setSystemUpdatePolicy()>),裝置擁有者現在可以自動接受系統更新 (例如資訊站裝置),或延後更新,並防止使用者在最多 30 天內更新。此外,管理員可以設定每日更新時間範圍,例如在資訊站裝置未使用的時段。如果有可用的系統更新,系統會檢查裝置政策控制器應用程式是否已設定系統更新政策,並據此採取行動。
  • 委派憑證安裝作業:設定檔或裝置擁有者現在可以授權第三方應用程式呼叫下列DevicePolicyManager憑證管理 API:
  • 手機顯示 Android for Work 中的工作狀態通知功能
  • 數據用量追蹤。現在,設定檔或裝置擁有者可以使用新的 NetworkStatsManager 方法,查詢「設定」>「數據用量」中顯示的數據用量統計資料。系統會自動授予設定檔擁有者權限,查詢所管理設定檔的資料,裝置擁有者則可存取受管理主要使用者的使用資料。
  • 執行階段權限管理:

    設定檔或裝置擁有者可以為使用 setPermissionPolicy() 的所有應用程式,設定所有執行階段要求的權限政策,提示使用者授予權限,或自動授予/拒絕權限。如果設定後者,使用者就無法在「設定」的應用程式權限畫面中,修改設定檔或裝置擁有者所做的選擇。

  • 「設定」中的 VPN:現在可以依序前往「設定」>「更多」>「VPN」,查看 VPN 應用程式。此外,VPN 使用通知現在會根據 VPN 的設定方式顯示。如果是設定檔擁有者,通知會說明 VPN 是為受管理設定檔、個人資料夾或兩者設定。如果是裝置擁有者,通知會視 VPN 是否已為整部裝置設定而有所不同。
  • 工作狀態通知:如果受管理設定檔中的應用程式在前台有活動,狀態列現在會顯示公事包圖示。此外,如果裝置直接解鎖至受管理設定檔中的應用程式活動,系統會顯示浮動式訊息,通知使用者目前位於工作資料夾中。