Android 6.0 (M) 為使用者和應用程式開發人員提供新功能。本文件將介紹最重要的 API。
立即開發
如要開始建構 Android 6.0 應用程式,您必須先取得 Android SDK。接著,請使用 SDK Manager 下載 Android 6.0 SDK 平台和系統映像檔。
更新目標 API 級別
如要針對執行 Android 的裝置進一步最佳化應用程式,請將 targetSdkVersion
設為 "23"
,在 Android 系統映像檔上安裝應用程式並進行測試,然後發布含有此變更的更新版應用程式。
您可以使用 Android API,同時支援舊版,方法是在程式碼中新增條件,在執行 minSdkVersion
不支援的 API 前,先檢查系統 API 級別。如要進一步瞭解如何維持回溯相容性,請參閱支援不同平台版本。
如要進一步瞭解 API 級別的運作方式,請參閱「什麼是 API 級別?」。
指紋驗證
這個版本提供新的 API,可讓您透過支援裝置上的指紋掃描功能來驗證使用者。請將這些 API 與 Android KeyStore 系統搭配使用。
如要透過指紋掃描驗證使用者,請取得新 FingerprintManager
類別的例項並呼叫 authenticate()
方法。應用程式必須在搭載指紋感應器的相容裝置上執行。您必須在應用程式中實作指紋驗證流程的使用者介面,並在 UI 中使用標準 Android 指紋圖示。生物特徵辨識驗證範例中包含 Android 指紋圖示 (c_fp_40px.png
)。請注意,如果您正在開發多個使用指紋驗證功能的應用程式,請注意每個應用程式都必須分別驗證使用者的指紋。
如要在應用程式中使用這項功能,請先在資訊清單中新增 USE_FINGERPRINT
權限。
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
如要查看指紋驗證的應用程式實作,請參閱生物特徵辨識驗證範例。如要瞭解如何將這些驗證 API 與其他 Android API 搭配使用,請觀看「 指紋和付款 API」影片。
如果您要測試這項功能,請按照下列步驟操作:
- 如果您尚未安裝 Android SDK 工具修訂版本 24.3,請先安裝。
- 請依序前往「Settings」>「Security」>「Fingerprint」,然後按照註冊指示操作,在模擬器中註冊新指紋。
- 請使用模擬器,透過模擬器模擬指紋觸控事件。使用相同的指令,模擬鎖定畫面或應用程式中的指紋觸控事件。
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
這個版本提供使用者透過助理與應用程式互動的全新方式。如要使用這項功能,使用者必須啟用助理,讓其使用目前的內容。啟用後,使用者只要長按「Home」按鈕,即可在任何應用程式中喚出 Google 助理。
應用程式可以設定 FLAG_SECURE
標記,選擇不與 Google 助理分享目前的內容。除了平台將標準資訊傳送給 Google 助理的標準資訊外,應用程式也可使用新的 AssistContent
類別分享其他資訊。
如要為 Google 助理提供應用程式中的其他背景資訊,請按照下列步驟操作:
- 實作
Application.OnProvideAssistDataListener
介面。 - 使用
registerOnProvideAssistDataListener()
註冊此事件監聽器。 - 為了提供活動專屬的背景資訊,請覆寫
onProvideAssistData()
回呼,並視需要覆寫新的onProvideAssistContent()
回呼。
可合併儲存裝置
本次更新後,使用者就可以採用外部儲存裝置 (例如 SD 卡)。如果採用外部儲存裝置,系統就會將該裝置加密及格式化,運作時就像內部儲存空間一樣。這項功能可讓使用者在儲存裝置之間移動應用程式和應用程式的私人資料。移動應用程式時,系統會遵循資訊清單中的 android:installLocation
偏好設定。
如果應用程式存取下列 API 或欄位,請注意,當應用程式在內部和外部儲存裝置之間移動時,這些 API 或欄位會動態變更所傳回的檔案路徑。建構檔案路徑時,強烈建議您一律動態呼叫這些 API。請勿使用硬式編碼檔案路徑,或保留先前建構的完整檔案路徑。
Context
方法:ApplicationInfo
欄位:
如要對這項功能進行偵錯,您可以執行下列指令,啟用透過 USB On-The-Go (OTG) 傳輸線連接至 Android 裝置的 USB 隨身碟:
$ adb shell sm set-force-adoptable true
通知
這個版本會針對通知新增下列 API 變更:
- 新的
INTERRUPTION_FILTER_ALARMS
篩選器層級,對應於新的「僅限鬧鐘」請勿打擾模式。 - 新的
CATEGORY_REMINDER
類別值,用於區分使用者排定的提醒事項與其他事件 (CATEGORY_EVENT
) 和鬧鐘 (CATEGORY_ALARM
)。 - 新增可透過
setSmallIcon()
和setLargeIcon()
方法附加至通知的新Icon
類別。同樣地,addAction()
方法現在接受Icon
物件,而非可繪資源 ID。 - 新的
getActiveNotifications()
方法,可讓應用程式找出目前有效的通知。
支援藍牙觸控筆
這個版本針對使用藍牙觸控筆輸入的使用者,提供更完善的支援。使用者可以將相容的藍牙觸控筆與手機或平板電腦配對及連線。連線時,觸控螢幕的位置資訊會與觸控筆的壓力和按鈕資訊融合,提供比單獨使用觸控螢幕更廣泛的表情動作。應用程式可在活動中註冊 View.OnContextClickListener
和 GestureDetector.OnContextClickListener
物件,藉此監聽觸控筆按鈕的按下動作並執行次要動作。
使用 MotionEvent
方法和常數偵測觸控筆按鈕互動:
- 如果使用者透過應用程式螢幕上的按鈕輕觸觸控筆,
getTooltype()
方法會傳回TOOL_TYPE_STYLUS
。 - 針對指定 Android 6.0 (API 級別 23) 的應用程式,當使用者按下主要觸控筆按鈕時,
getButtonState()
方法會傳回BUTTON_STYLUS_PRIMARY
。如果觸控筆有第二個按鈕,使用者按下該按鈕時,同一個方法會傳回BUTTON_STYLUS_SECONDARY
。如果使用者同時按下兩個按鈕,這個方法會傳回兩個值「或」並一起傳回 (BUTTON_STYLUS_PRIMARY
|BUTTON_STYLUS_SECONDARY
)。 -
如果應用程式指定的平台版本較低,
getButtonState()
方法會傳回BUTTON_SECONDARY
(用於按下主要觸控筆按鈕)、BUTTON_TERTIARY
(用於次要觸控筆按鈕),或同時傳回兩者。
改善藍牙低功耗掃描
如果應用程式會執行藍牙低功耗掃描,請使用新的 setCallbackType()
方法,指定您要讓系統在首次找到回呼時通知回呼,或是在經過很長的時間後才看到回呼 (與 ScanFilter
設定相符)。這個掃描方法比先前平台版本提供的方法更省電。
無線基地台 2.0 版 1 支援
這個版本支援 Nexus 6 和 Nexus 9 裝置的無線基地台 2.0 版規格 1。如要在應用程式中佈建無線基地台 2.0 憑證,請使用 WifiEnterpriseConfig
類別的新方法,例如 setPlmn()
和 setRealm()
。您可以在 WifiConfiguration
物件中設定 FQDN
和 providerFriendlyName
欄位。新的 isPasspointNetwork()
方法會指出偵測到的網路是否代表無線基地台 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 應用程式相容性程式庫中使用這些方法。
音訊功能
這個版本強化了 Android 的音訊處理功能,包括:
- 透過新的
android.media.midi
API 支援 MIDI 通訊協定。使用這些 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
類別將輸入緩衝區流量連結至攝影機重新處理輸入內容。如要取得空緩衝區,請按照下列程式設計模式操作:
- 呼叫
dequeueInputImage()
方法。 - 將資料填入輸入緩衝區。
- 呼叫
queueInputImage()
方法,將緩衝區傳送至相機。
如果您同時使用 ImageWriter
物件和 PRIVATE
圖片,應用程式就無法直接存取圖片資料。請改為呼叫 queueInputImage()
方法,直接將 PRIVATE
圖片傳遞至 ImageWriter
,且不進行任何緩衝區複製作業。
ImageReader
類別現在支援 PRIVATE
格式的圖片串流。這項支援功能可讓應用程式維護 ImageReader
輸出圖片的圓形圖片佇列,選取一或多張圖片,並傳送至 ImageWriter
進行相機重新處理。
Android for Work 功能
此版本包含下列 Android for Work 的新 API:
- 針對公司擁有的單一使用裝置加強控管功能:裝置擁有者現在可以控制下列設定,提升公司擁有的單次使用 (COSU) 裝置管理作業:
- 使用
setKeyguardDisabled()
方法停用或重新啟用鎖定畫面。 - 使用
setStatusBarDisabled()
方法停用或重新啟用狀態列 (包括快速設定、通知,以及啟動 Google 即時資訊的瀏覽向上滑動手勢)。 - 使用
UserManager
常數DISALLOW_SAFE_BOOT
停用或重新啟用安全啟動功能。 - 使用
STAY_ON_WHILE_PLUGGED_IN
常數,避免螢幕在充電時關閉。
- 使用
- 裝置擁有者可透過靜默安裝和解除安裝應用程式:裝置擁有者現在可以使用
PackageInstaller
API 靜默安裝和解除安裝應用程式,不必透過 Google Play for Work。您現在可以透過裝置擁有者佈建裝置,讓裝置在無須使用者互動情況下擷取及安裝應用程式。這項功能可讓您為資訊亭或其他類似裝置啟用一鍵佈建設定,而無須啟用 Google 帳戶。 - 靜默企業憑證存取權: 當應用程式呼叫
choosePrivateKeyAlias()
時,在系統提示使用者選取憑證之前,Profile 或裝置擁有者現在可以呼叫onChoosePrivateKeyAlias()
方法,將別名靜默提供給要求的應用程式。這項功能可讓您在使用者不必互動情況下,授予受管理的應用程式存取憑證的權限。 - 自動接受系統更新。使用
setSystemUpdatePolicy()
設定系統更新政策後,裝置擁有者現在可以自動接受系統更新 (例如資訊站裝置),或延後更新,最多可延遲 30 天,以免使用者自行更新。此外,管理員可以設定每日更新期限,例如當資訊站裝置未使用時。有可用的系統更新時,系統會檢查裝置政策控制器應用程式是否已設定系統更新政策,並據此運作。 -
委派憑證安裝:設定檔或裝置擁有者現在可以授權第三方應用程式呼叫下列
DevicePolicyManager
憑證管理 API: - 追蹤資料使用量。設定檔或裝置擁有者現在可以使用新的
NetworkStatsManager
方法,查詢「設定」>「資料」使用量中的資料用量統計資料。系統會自動授予設定檔擁有者查詢所管理設定檔資料的權限,而裝置擁有者則可存取受管理的主要使用者的使用資料。 - 執行階段權限管理:
設定檔或裝置擁有者可以為使用
setPermissionPolicy()
的所有應用程式的所有執行階段要求設定權限政策,以便在使用者授予權限時發出提示,或自動授予或拒絕權限。如果設定後者政策,使用者就無法修改設定檔或裝置擁有者在「設定」中應用程式權限畫面中所做的選項。 - 設定中的 VPN:現可依序前往「設定」>「更多」>「VPN」,查看 VPN 應用程式。此外,隨附的 VPN 用量通知現在僅適用於該 VPN 的設定方式。對於設定檔擁有者,通知會指出 VPN 是針對受管理的設定檔、個人設定檔,還是兩者皆是而設定。針對裝置擁有者,通知會指出是否已為整部裝置設定 VPN。
- 工作狀態通知:現在只要受管理設定檔中的應用程式在前景有活動,就會顯示狀態列公事包圖示。此外,如果裝置直接解鎖至受管理設定檔中應用程式的活動,系統會顯示浮動通知,通知使用者目前處於工作資料夾中。