Android 4.4 API

API 級別:19

Android 4.4 (KITKAT) 是 Android 平台的最新版本,可為使用者和應用程式開發人員提供新功能。本文件將介紹最知名的新 API。

應用程式開發人員應盡快從 SDK Manager 下載 Android 4.4 系統映像檔和 SDK 平台。如果您沒有搭載 Android 4.4 的裝置可以測試應用程式,請使用 Android 4.4 系統映像檔在 Android Emulator 上測試應用程式。然後針對 Android 4.4 平台建構應用程式,以開始使用最新的 API。

更新目標 API 級別

為了針對搭載 Android 4.4 的裝置進一步最佳化應用程式,建議您將 targetSdkVersion 設為 "19",將其安裝在 Android 4.4 系統映像檔上,然後進行測試,再以這項變更發布更新。

您可以在 Android 4.4 版中使用 API,同時支援舊版,方法是在執行 minSdkVersion 不支援的 API 之前,為程式碼新增用於檢查系統 API 級別的條件,以檢查系統 API 級別。如要進一步瞭解如何維持回溯相容性,請參閱「支援不同的平台版本」。

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

重要行為變更

如果您先前已發布 Android 應用程式,請注意 Android 4.4 中的變更可能會影響您的應用程式。

如果應用程式從外部儲存空間讀取資料...

除非應用程式具備 READ_EXTERNAL_STORAGE 權限,否則應用程式在執行 Android 4.4 版本時無法讀取外部儲存空間中的共用檔案。也就是說,getExternalStoragePublicDirectory() 所傳回目錄中的檔案,必須取得相關權限就無法再存取。不過,如果只需要存取 getExternalFilesDir() 提供的應用程式專屬目錄,則不需要 READ_EXTERNAL_STORAGE 權限。

如果您的應用程式使用 WebView...

在 Android 4.4 上執行時,應用程式的運作方式可能有所不同,尤其是當您將應用程式的 targetSdkVersion 更新為 19 以上版本時。

WebView 類別的基礎程式碼和相關 API 已升級,現在以 Chromium 原始碼的新型快照為基礎。這可帶來各種效能改善、支援新的 HTML5 功能,並支援對 WebView 內容進行遠端偵錯。這項升級的範圍代表如果應用程式使用 WebView,則在某些情況下可能會受到影響。雖然系統記錄了已知的行為變更,且大部分只有在您將應用程式的 targetSdkVersion 更新為「19」以上時才會影響應用程式。不過,新的 WebView 會在目標 API 級別 18 以下的應用程式中運作,因此可提供部分舊版功能,但您的應用程式可能還是會依附於舊版 WebView 的不明行為。

因此,如果您現有的應用程式使用 WebView,請務必盡快針對 Android 4.4 進行測試,並參閱「遷移至 Android 4.4 版中的 WebView」一文,瞭解將 targetSdkVersion 更新至 19 以上版本後,應用程式可能會有哪些影響。

如果您的應用程式使用 AlarmManager...

如果您將應用程式的 targetSdkVersion 設為「19」以上,透過 set()setRepeating() 建立的鬧鐘將不精確。

為了提升電力效率,Android 現在會將所有應用程式在合理時間相近的時間發出的鬧鐘全部批次處理,讓系統喚醒裝置一次,而非多次控制每個鬧鐘。

如果鬧鐘並未與特定時鐘時間建立關聯,但您仍需在特定時間範圍內 (例如下午 2 點到 4 點之間) 叫用鬧鐘,可以使用新的 setWindow() 方法,可接受鬧鐘的「最早」時間,以及系統應叫用鬧鐘的最早「期間」。

如果鬧鐘必須固定在特定的時鐘時間 (例如日曆活動提醒),你可以使用新的 setExact() 方法。

這個不明確的批次行為只會套用至更新的應用程式。如果您已將 targetSdkVersion 設為「18」以下,鬧鐘在搭載 Android 4.4 版本的情況下,其運作方式會與先前版本相同。

如果您的應用程式使用 ContentResolver 同步處理資料...

如果您將應用程式的 targetSdkVersion 設為「19」以上,建立 addPeriodicSync() 的同步作業時,系統會在大約 4% 的預設彈性間隔內執行同步作業。舉例來說,如果輪詢頻率為 24 小時,則同步處理作業可能會在每天大約 1 小時期間內執行,而不是每天都在同一時間進行。

如要自行指定同步處理作業的彈性間隔,請開始使用新的 requestSync() 方法。詳情請參閱下方「同步轉換介面」一節。

這項彈性間隔行為僅適用於更新的應用程式。如果您將 targetSdkVersion 設為「18」以下,在 Android 4.4 上執行時,現有的同步要求仍會照常運作。

列印架構

Android 現在提供完整的架構,可讓使用者透過 Wi-Fi、藍牙或其他服務連線的印表機來列印任何文件。系統會針對要列印文件的應用程式,以及將列印工作提供給印表機的服務處理之間的交易。android.print 架構提供指定列印文件所需的所有 API,並傳送給系統進行列印。特定列印工作實際需要的 API 取決於您的內容。

列印一般內容

如要將 UI 內容列印為文件,您必須先建立 PrintDocumentAdapter 的子類別。在這個類別中,您必須實作幾個回呼方法,包括 onLayout(),以便根據提供的列印屬性建立版面配置,以及使用 onWrite() 將可列印內容序列化為 ParcelFileDescriptor

你必須傳送 PDF 檔案,才能將內容寫入 ParcelFileDescriptor。新的 PdfDocument API 提供來自 getCanvas()Canvas,可用於繪製可列印的內容,讓您輕鬆完成這項操作。然後使用 writeTo() 方法將 PdfDocument 寫入 ParcelFileDescriptor

PrintDocumentAdapter 定義實作後,您可以使用 PrintManager 方法 print(),以使用者的要求執行列印工作,該方法使用 PrintDocumentAdapter 做為引數之一。

列印圖片

如果您只想列印相片或其他點陣圖,支援資料庫中的輔助 API 就會自動完成所有工作。您只需建立新的 PrintHelper 執行個體,並使用 setScaleMode() 設定縮放模式,然後將 Bitmap 傳遞至 printBitmap()。就是這麼簡單!程式庫會處理與系統的所有其他互動,將點陣圖傳遞給印表機。

建築列印服務

印表機 OEM 可以使用 android.printservice 架構,為 Android 裝置的印表機提供互通性。如果以 APK 的形式建立及發布列印服務,使用者便可在裝置上安裝。列印服務應用程式主要是以無頭服務的形式運作,只要將 PrintService 類別設為子類別,即可接收系統的列印工作,並使用適當的通訊協定將工作傳送到印表機。

如要進一步瞭解如何列印應用程式內容,請參閱「列印內容」。

簡訊服務供應商

Telephony 內容供應者 (「簡訊供應商」) 可讓應用程式在裝置上讀取及寫入簡訊和多媒體訊息。當中包括已接收的簡訊和多媒體訊息、草稿、已傳送、待處理等等的表格。

從 Android 4.4 開始,系統設定可讓使用者選取「預設簡訊應用程式」。選取這個選項後,就只有預設的訊息應用程式可以寫入簡訊服務供應商,而且只有在使用者收到多媒體訊息時,只有預設的簡訊應用程式會收到 SMS_DELIVER_ACTION 廣播或 WAP_PUSH_DELIVER_ACTION 廣播訊息。預設的訊息應用程式負責在接收或傳送新訊息時,將詳細資料寫入簡訊提供者。

其他未選取預設訊息應用程式的應用程式只能讀取簡訊供應程式,但也可能在收到新訊息時藉由監聽 SMS_RECEIVED_ACTION 廣播通知。廣播這類訊息屬於不可取消的廣播,可能會傳送到多個應用程式。這項廣播訊息適用於未選取做為預設簡訊應用程式但需要讀取特殊收到訊息的應用程式,例如執行電話號碼驗證。

如需更多資訊,請參閱這篇文章,瞭解如何為簡訊應用程式做好準備。

無線與連線

主機卡片模擬

Android 應用程式現在可以模擬採用 APDU 交換資料的 ISO14443-4 (ISO-DEP) NFC 卡片 (如 ISO7816-4 所指定)。如此一來,搭載 Android 4.4 的 NFC 裝置就能同時模擬多張 NFC 卡片,並允許 NFC 感應式刷卡機或其他 NFC 讀卡機根據應用程式 ID (AID),透過合適的 NFC 卡片進行交易。

如果您要模擬在應用程式中使用這些通訊協定的 NFC 卡,請根據 HostApduService 類別建立服務元件。如果您的應用程式改為使用安全元素進行卡片模擬,則必須根據 OffHostApduService 類別建立服務,該類別不會直接參與交易,但是想要註冊應由安全元素處理的 AID。

詳情請參閱 NFC 卡片模擬指南。

NFC 讀卡機模式

新的 NFC 讀卡模式可讓活動將所有 NFC 活動限制在前景中只讀取活動感興趣的標記類型。透過 enableReaderMode() 即可為活動啟用讀取器模式,提供在偵測到新標記時接收回呼的 NfcAdapter.ReaderCallback 實作。

這項新功能結合主機卡片模擬功能,可讓 Android 在行動付款介面的兩端都運作:一部裝置可做為感應式刷卡機 (執行讀取器模式活動的裝置) 運作,另一部裝置則做為付款用戶端 (模擬 NFC 卡片的裝置)。

紅外線發射器

在含有紅外線 (IR) 發射器的裝置中執行時,您現在可以使用 ConsumerIrManager API 傳輸 IR 訊號。如要取得 ConsumerIrManager 的執行個體,請呼叫 getSystemService(),並以 CONSUMER_IR_SERVICE 做為引數。接著,您就能使用 getCarrierFrequencies() 查詢裝置支援的 IR 頻率,並使用 transmit() 傳遞所需頻率和訊號模式,藉此傳送信號。

請務必先呼叫 hasIrEmitter() 來檢查裝置是否包含紅外線發射器,但如果應用程式僅與具有 IR 發射器的裝置相容,您就應該在 "android.hardware.consumerir" (FEATURE_CONSUMER_IR) 的資訊清單中加入 <uses-feature> 元素。

多媒體

智慧播放

MediaCodec API 現已支援自動調整影片播放,因此能透過 Surface 順暢地在播放期間變更解析度。您可以為解碼器輸入影格提交新的解析度,以及輸出緩衝區的解析度,而不會有明顯的差距。

只要在 MediaFormat 中新增兩個鍵,即可指定應用程式從 KEY_MAX_WIDTHKEY_MAX_HEIGHT 轉碼器所需的最高解析度,藉此啟用自動調整播放功能。將這些內容新增至 MediaFormat 後,請使用 configure()MediaFormat 傳遞至 MediaCodec 例項。

轉碼器能夠流暢地在解析度相同或小於這些值的解析度之間轉換。轉碼器也可以支援大於指定上限的解析度 (只要超出支援的設定檔限制),但轉換為較大的解析度可能會不順暢。

如要在解碼 H.264 影片時變更解析度,請繼續使用 MediaCodec.queueInputBuffer() 將影格排入佇列,但請務必在單一緩衝區中,提供新的序列參數集 (SPS) 和圖片參數集 (PPS) 值與即時解碼器重新整理 (IDR) 頁框。

但是,在嘗試設定轉碼器以自動調整播放功能之前,必須先使用 FEATURE_AdaptivePlayback 呼叫 isFeatureSupported(String),驗證裝置是否支援自動調整播放功能。

注意:自動調整播放功能僅支援特定廠商。某些轉碼器可能需要更多記憶體,才能提供較大的解析度提示。因此,建議您根據要解碼的來源內容,設定相應的解析度上限。

隨選音訊時間戳記

為方便同步處理音訊影片,新的 AudioTimestamp 類別會在 AudioTrack 處理的音訊串流中,提供特定「影格」的時間軸詳細資料。如要取得最新的時間戳記,請將 AudioTimestamp 物件例項化並傳遞至 getTimestamp()。如果時間戳記要求成功,AudioTrack 例項就會填入影格單元中的位置,以及該影格顯示或承諾顯示的預估時間。

您可以使用 AudioTimestamp 中的 nanoTime 值 (單調為單色),找出與 framePosition 最相近的影片影格,以便配合音訊捨棄、複製或插補視訊畫面。此外,您也可以判斷 nanoTime 值與未來影片影格預期時間 (須考量取樣率) 之間的差異時間,藉此預測哪個音訊影格要與影片影格同時顯示。

表面圖片讀取工具

新的 ImageReader API 可讓您在圖像緩衝區轉譯成 Surface 時直接存取。您可以使用靜態方法 newInstance() 取得 ImageReader。然後呼叫 getSurface() 建立新的 Surface,並透過 MediaPlayerMediaCodec 等生產端傳送圖片資料。如要在介面有新圖片時收到通知,請實作 ImageReader.OnImageAvailableListener 介面並向 setOnImageAvailableListener() 註冊。

現在,當您在 Surface 中繪製內容時,ImageReader.OnImageAvailableListener 會在每個新影格可供使用時呼叫 onImageAvailable(),並提供對應的 ImageReader。您可以呼叫 acquireLatestImage()acquireNextImage(),使用 ImageReader 取得影格的圖片資料做為 Image 物件。

Image 物件可直接存取 ByteBuffer 中圖片的時間戳記、格式、尺寸和像素資料。不過,如要讓 Image 類別解譯圖片,圖片必須根據 ImageFormatPixelFormat 中由常數定義的其中一個類型設定格式。

峰值和 RMS 評估

現在您可以建立新的 Visualizer.MeasurementPeakRms 執行個體,並將其傳送至 getMeasurementPeakRms(),藉此查詢 Visualizer 中目前音訊串流的尖峰和 RMS。呼叫此方法時,指定 Visualizer.MeasurementPeakRms 的峰值和 RMS 會設為最近的測量值。

音量強化工具

LoudnessEnhancerAudioEffect 的新子類別,可讓您提高 MediaPlayerAudioTrack 的音量。搭配上述新的 getMeasurementPeakRms() 方法時,這項功能特別實用,可在其他媒體播放時增加語音音軌的音量。

遙控器

Android 4.0 (API 級別 14) 導入了 RemoteControlClient API,可讓媒體應用程式從遠端用戶端使用媒體控制器事件,例如螢幕鎖定畫面上的媒體控制項。現在你可以透過新的 RemoteController API 建構自己的遙控器,打造創新的應用程式和周邊裝置,以便控管任何與 RemoteControlClient 整合的媒體應用程式播放作業。

如要建構遠端控制器,可以隨心所欲實作使用者介面,但如要將媒體按鈕事件傳送至使用者的媒體應用程式,您必須建立擴充 NotificationListenerService 類別的服務,並實作 RemoteController.OnClientUpdateListener 介面。以 NotificationListenerService 做為基礎非常重要,因為這樣可以提供適當的隱私權限制,而使用者必須在系統安全性設定中,將應用程式設為通知事件監聽器。

NotificationListenerService 類別包含必須實作的抽象方法,但如果您只是在處理媒體控制器事件來處理媒體播放作業時,可以將實作內容留空,改為專注 RemoteController.OnClientUpdateListener 方法。

遠端控制器的評分

Android 4.4 奠基於遠端控制用戶端 (透過 RemoteControlClient 接收媒體控制事件的應用程式) 現有的功能,可讓使用者透過遙控器為目前音軌評分。

新的 Rating 類別會封裝使用者評分的相關資訊。評分是由評分樣式 (RATING_HEARTRATING_THUMB_UP_DOWNRATING_3_STARSRATING_4_STARSRATING_5_STARSRATING_PERCENTAGE) 以及適用於該樣式的評分值所定義。

如何允許使用者透過遙控器為你的曲目評分:

如要在使用者從遠端控制器變更評分時接收回呼,請實作新的 RemoteControlClient.OnMetadataUpdateListener 介面,並將執行個體傳遞至 setMetadataUpdateListener()。使用者變更評分時,RemoteControlClient.OnMetadataUpdateListener 會收到對 onMetadataUpdate() 的呼叫,並將 RATING_KEY_BY_USER 做為鍵,並將 Rating 物件做為值傳遞。

隱藏式輔助字幕

播放 HTTP 直播 (HLS) 影片時,VideoView 現在支援 WebVTT 字幕軌,系統會根據使用者在系統設定中定義的隱藏式輔助字幕偏好設定顯示字幕軌。

您也可以使用 addSubtitleSource() 方法,為 VideoView 提供 WebVTT 字幕軌。這個方法接受包含字幕資料的 InputStream,以及可指定字幕資料格式的 MediaFormat 物件 (您可以使用 createSubtitleFormat() 指定)。系統也會根據使用者的偏好顯示這類字幕。

如果不是使用 VideoView 顯示影片內容,則應盡可能讓字幕重疊廣告符合使用者的隱藏式輔助字幕偏好設定。全新的 CaptioningManager API 可讓您查詢使用者的隱藏式輔助字幕偏好設定,包括 CaptioningManager.CaptionStyle 定義的樣式,例如字體和顏色。如果使用者在影片開始後調整部分偏好設定,建議您註冊 CaptioningManager.CaptioningChangeListener 的執行個體以監聽偏好設定變更,以便在任何偏好設定發生變更時接收回呼,然後視需要更新字幕。

動畫與圖形

場景和轉場效果

新的 android.transition 架構提供的 API 可促進使用者介面不同狀態之間的動畫效果。重要功能可讓您定義使用者介面的不重複狀態,也就是「場景」,方法是為每種功能建立不同的版面配置。如果想在兩個場景之間建立動畫效果,請執行「轉場」,這會計算必要的動畫,從目前的場景變更版面配置到下一個場景。

如要在兩個場景之間進行轉換,您通常需要執行下列操作:

  1. 指定 ViewGroup,其中包含您要變更的 UI 元件。
  2. 指定可以代表變更結果 (下一個場景) 的版面配置。
  3. 指定應為版面配置變更建立動畫的轉場類型。
  4. 執行轉換作業。

您可以使用 Scene 物件完成步驟 1 和 2。Scene 包含中繼資料,說明執行轉換所需的版面配置屬性,包括場景的上層檢視畫面和場景的版面配置。您可以使用類別建構函式或靜態方法 getSceneForLayout() 建立 Scene

接著,您必須使用 TransitionManager 完成步驟 3 和 4。其中一種方法是將 Scene 傳遞至靜態方法 go()。這樣做會在目前的版面配置中尋找場景的父項檢視畫面,並在子項檢視畫面上執行轉換,直到達到 Scene 所定義的版面配置。

此外,您完全不需要建立 Scene 物件,但可以呼叫 beginDelayedTransition(),並指定包含您要變更的檢視畫面的 ViewGroup。接著新增、移除或重新設定目標檢視畫面。系統視需要設計變更內容後,就會開始轉換所有受影響的檢視畫面,以動畫顯示所有受影響的檢視畫面。

如要進一步控管,您可以使用專案 res/transition/ 目錄中的 XML 檔案,定義預先定義的場景之間應進行的轉場效果。在 <transitionManager> 元素中,指定一或多個 <transition> 標記,分別指定場景 (版面配置檔案的參照),以及進入和/或離開該場景時要套用的轉換效果。然後使用 inflateTransitionManager() 加載這組轉場效果。使用傳回的 TransitionManager,使用 transitionTo() 執行每個轉換,並傳遞其中一個 <transition> 標記代表的 Scene。您也可以使用 TransitionManager API,以程式輔助方式定義多組轉場效果。

指定轉場效果時,您可以使用 Transition 子類別定義的多種預先定義類型,例如 FadeChangeBounds。如未指定轉場類型,系統預設會使用 AutoTransition,藉此視需要自動淡出、移動和調整檢視畫面的大小。此外,您可以擴充這些類別以執行所需的動畫,藉此建立自訂轉場效果。自訂轉場效果可追蹤您想要的任何屬性變更,並根據這些變更建立您想要的任何動畫。舉例來說,您可以提供 Transition 的子類別,用於監聽檢視畫面的「旋轉」屬性變更,然後為任何變更建立動畫。

詳情請參閱 TransitionManager 說明文件。

暫停動畫器

Animator API 現在可讓您使用 pause()resume() 方法暫停及繼續進行中的動畫。

如要追蹤動畫狀態,您可以實作 Animator.AnimatorPauseListener 介面,在動畫暫停及恢復時提供回呼:pause()resume()。然後使用 addPauseListener() 將事件監聽器新增至 Animator 物件。

或者,您也可以建立 AnimatorListenerAdapter 抽象類別的子類別,該類別現在包含 Animator.AnimatorPauseListener 定義的暫停和重新啟用回呼的空白實作。

可重複使用的點陣圖

您現在可以在 BitmapFactory 中重複使用任何可變動的點陣圖,即使新的點陣圖大小不同也無妨,前提是已解碼的點陣圖產生的位元組數量 (可從 getByteCount() 取得) 小於或等於重複使用的點陣圖分配位元組數 (可從 getAllocationByteCount() 取得)。詳情請參閱 inBitmap

新的 Bitmap API 允許在 BitmapFactory 外部重複使用類似的設定 (用於手動產生點陣圖或自訂解碼邏輯)。您現在可以使用 setHeight()setWidth() 方法設定點陣圖的尺寸,並使用 setConfig() 指定新的 Bitmap.Config,而不會影響基礎點陣圖配置。reconfigure() 方法也能夠輕鬆地將這些變更與單一呼叫結合。

不過,請勿重新設定檢視系統目前使用的點陣圖,因為基礎像素緩衝區無法以可預測的方式重新對應。

使用者內容

儲存空間存取架構

在先前的 Android 版本中,如果您希望應用程式從其他應用程式擷取特定類型的檔案,則必須透過 ACTION_GET_CONTENT 動作叫用意圖。此動作仍然是要求檔案要匯入至應用程式中的適當方式。不過,Android 4.4 導入了 ACTION_OPEN_DOCUMENT 動作,可讓使用者選取特定類型的檔案,並授予應用程式長期讀取權限 (可能擁有寫入權限),而不必將檔案匯入應用程式。

如果您開發的應用程式 (例如雲端儲存服務) 提供檔案儲存空間服務,可以實作內容供應器做為新 DocumentsProvider 類別的子類別,以參與此整合的 UI,挑選檔案。DocumentsProvider 的子類別必須包含可接受 PROVIDER_INTERFACE 動作 ("android.content.action.DOCUMENTS_PROVIDER") 的意圖篩選器。接著,您必須在 DocumentsProvider 中實作四種抽象方法:

queryRoots()
這項作業必須傳回 Cursor,並使用 DocumentsContract.Root 中定義的資料欄來說明文件儲存空間的所有根目錄。
queryChildDocuments()
這必須傳回 Cursor 來說明指定目錄中的所有檔案,並使用 DocumentsContract.Document 中定義的資料欄。
queryDocument()
這必須傳回使用 DocumentsContract.Document 中定義的資料欄來說明指定檔案的 Cursor
openDocument()
這項操作必須傳回代表指定檔案的 ParcelFileDescriptor。使用者選取檔案後,只要用戶端應用程式透過呼叫 openFileDescriptor() 要求存取權限,系統就會呼叫此方法。

詳情請參閱儲存空間存取架構指南。

外部儲存空間存取權

您現在可以在次要外部儲存媒體上讀取及寫入應用程式專屬檔案,例如當裝置同時提供模擬儲存空間和 SD 卡時。新方法 getExternalFilesDirs() 的運作方式與現有的 getExternalFilesDir() 方法相同,但會傳回 File 物件的陣列。在讀取或寫入此方法傳回的任何路徑前,請將 File 物件傳遞至新的 getStorageState() 方法,確認儲存空間目前是否可用。

其他存取應用程式專屬快取目錄和 OBB 目錄的方法,現在也具有可存取次要儲存空間裝置的對應版本:getExternalCacheDirs()getObbDirs()

傳回的 File 陣列中的第一個項目會視為裝置的主要外部儲存空間,這與現有方法 (例如 getExternalFilesDir()) 傳回的 File 相同。

注意:從 Android 4.4 開始,如果您只需要使用上述方法存取應用程式的特定區域,這個平台不再需要應用程式取得 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE。不過,存取外部儲存空間 (由 getExternalStoragePublicDirectory() 提供) 的共用區域時,必須具備權限。

同步轉換介面

ContentResolver 中的新 requestSync() 方法簡化了為 ContentProvider 定義同步要求的程序,方法是將要求封裝到新的 SyncRequest 物件中,您可以使用 SyncRequest.Builder 建立這些物件。SyncRequest 中的屬性提供與現有的 ContentProvider 同步呼叫相同的功能,但新增了啟用 setDisallowMetered() 的功能,讓您指定在網路計量付費時應捨棄同步處理作業。

使用者輸入內容

全新感應器類型

新的 TYPE_GEOMAGNETIC_ROTATION_VECTOR 感應器可根據磁力儀提供旋轉向量資料,在無法使用陀螺儀時,或在手機睡眠期間與批次感應器事件搭配使用時,可代替 TYPE_ROTATION_VECTOR 感應器的替代方案。這個感應器需要的電量比 TYPE_ROTATION_VECTOR 更少,但可能容易產生吵雜的事件資料,而且在使用者外出時最有效。

Android 現在也支援硬體內建的步數感應器:

TYPE_STEP_DETECTOR
這個感應器會在使用者每次踏出一步時觸發事件。在每個使用者步驟中,此感應器會傳送值為 1.0 的事件,以及指出步驟發生時間的時間戳記。
TYPE_STEP_COUNTER
這個感應器也會在每個偵測到步驟時觸發事件,但會提供自應用程式首次登錄此感應器後的累計步數。

請注意,這兩個步驟感應器提供的結果不一定相同。相較於 TYPE_STEP_DETECTOR 事件,TYPE_STEP_COUNTER 事件的延遲時間較長,這是因為 TYPE_STEP_COUNTER 演算法會執行更多處理程序來排除偽陽性。因此,TYPE_STEP_COUNTER 傳送事件的速度可能較慢,但其結果應該會更準確。

這兩個步驟感應器都不會影響硬體 (Nexus 5 是第一部支援這種裝置的裝置),因此請務必使用 FEATURE_SENSOR_STEP_DETECTORFEATURE_SENSOR_STEP_COUNTER 常數,檢查 hasSystemFeature() 是否可用。

批次感應器事件

為了更妥善管理裝置電源,SensorManager API 現在可讓您指定要讓系統將批次感應器事件傳送給應用程式的頻率。這不會減少應用程式在特定期間內的實際感應器事件數量,而是會降低系統透過感應器更新呼叫 SensorEventListener 的頻率。也就是說,系統不會在事件發生時立即傳送每個事件給應用程式,而是儲存一段時間內的所有事件,然後將這些事件一次傳送至您的應用程式。

為了提供批次功能,SensorManager 類別會加入兩個新版 registerListener() 方法,讓您指定「報表延遲時間上限」。這個新參數可指定 SensorEventListener 允許 SensorEventListener 容許傳送新感應器事件的最長延遲時間。舉例來說,如果您指定的批次延遲時間為一分鐘,則系統會連續呼叫 onSensorChanged() 方法一次 (針對每個批次事件一次傳送一次),以每隔一分鐘傳送一組近期的批次事件。感應器事件的延遲時間絕不會超過您最大報表延遲時間值,但如果其他應用程式要求同一個感應器的延遲時間縮短,則感應器事件延遲的時間可能會較快。

但請注意,感應器會根據報表延遲時間,為應用程式傳送批次事件,只有在 CPU 處於喚醒狀態時。雖然支援批次處理的硬體感應器會在 CPU 處於休眠狀態時持續收集感應器事件,但不會喚醒 CPU 來傳送批次事件給應用程式。當感應器的記憶體用盡時,感應器會開始捨棄最舊的事件,以儲存最新的事件。為避免遺失事件,可以在感應器填滿記憶體前喚醒裝置,然後呼叫 flush() 擷取最新一批事件。如要預估記憶體即將用盡且需要清理的時間,請呼叫 getFifoMaxEventCount() 取得可儲存的感應器事件數量上限,並將該數字除以應用程式希望每個事件的指定頻率。使用該計算功能,使用 AlarmManager 設定喚醒鬧鐘,以叫用 Service (實作 SensorEventListener) 清除感應器。

注意:並非所有裝置都支援批次感應器事件,因為這項功能需要硬體感應器支援。不過,從 Android 4.4 版本開始,建議您一律使用新的 registerListener() 方法,因為如果裝置不支援批次,系統就會輕而忽略批次延遲引數,並即時傳送感應器事件。

控制器身分

Android 現在會使用一組專屬整數來識別各個已連結的控制器,您可以使用 getControllerNumber() 進行查詢,方便您將每個控制器與遊戲中的不同玩家建立關聯。由於控制器連線中斷、連線或重新設定,每個控制器的數值可能會改變。因此,您應註冊 InputManager.InputDeviceListener 的執行個體,以追蹤與每個輸入裝置對應的控制器編號。然後在發生變更時,為每個 InputDevice 呼叫 getControllerNumber()

現在,已連結的裝置也會提供 getProductId()getVendorId() 提供的產品和供應商 ID。如果您需要根據裝置的可用索引鍵修改按鍵對應,可以查詢裝置,確認 hasKeys(int...) 是否提供特定按鍵。

使用者介面

沉浸式全螢幕模式

為了向應用程式提供填滿整個螢幕的版面配置,setSystemUiVisibility() 的新 SYSTEM_UI_FLAG_IMMERSIVE 標記 (與 SYSTEM_UI_FLAG_HIDE_NAVIGATION 合併時) 會啟用新的沉浸式全螢幕模式。啟用沉浸式全螢幕模式後,您的活動會繼續接收所有觸控事件。使用者可以沿著系統列通常顯示的區域,向內滑動,即可看到系統列。這會清除 SYSTEM_UI_FLAG_HIDE_NAVIGATION 旗標 (如果套用的話,則為 SYSTEM_UI_FLAG_FULLSCREEN 旗標),以便持續顯示系統資訊列。不過,如果您希望系統資訊列稍後再次隱藏,可以改用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY 標記。

半透明系統資訊列

您現在可以使用新主題 Theme.Holo.NoActionBar.TranslucentDecorTheme.Holo.Light.NoActionBar.TranslucentDecor,讓系統資訊列部分透明。啟用半透明的系統資訊列後,版面配置就會填滿系統列後方的區域,因此您必須為版面配置中不應被系統列覆蓋的部分啟用 fitsSystemWindows

如要建立自訂主題,請將其中一個主題設為父項主題,或是在主題中加入 windowTranslucentNavigationwindowTranslucentStatus 樣式屬性。

加強型通知監聽器

Android 4.3 新增了 NotificationListenerService API,可讓應用程式接收系統發布的新通知相關資訊。在 Android 4.4 中,通知監聽器可擷取通知的額外中繼資料,以及通知動作的完整詳細資料:

新的 Notification.extras 欄位包含 Bundle,用於傳送通知建構工具的額外中繼資料,例如 EXTRA_TITLEEXTRA_PICTURE。新的 Notification.Action 類別定義附加至通知的動作的特性,您可以從新的 actions 欄位擷取該動作。

RTL 版面配置的可繪項目鏡像

在先前的 Android 版本中,如果應用程式包含的圖片應從右至左的版面配置反轉水平方向,就必須將鏡像圖片納入 drawables-ldrtl/ 資源目錄中。現在,只要啟用可繪製資源上的 autoMirrored 屬性或呼叫 setAutoMirrored(),系統就會自動為您建立鏡像圖片。啟用後,當版面配置方向為從右到左時,Drawable 會自動鏡像。

無障礙功能

透過將新的 accessibilityLiveRegion 屬性新增至 XML 版面配置或呼叫 setAccessibilityLiveRegion()View 類別現在可讓您為使用者介面的部分宣告「即時區域」。舉例來說,如果登入畫面的文字欄位顯示「密碼不正確」通知,則應標示為有效地區,讓螢幕閱讀器在變更時回覆訊息。

提供無障礙服務的應用程式現在也能使用新的 API,透過 AccessibilityNodeInfo.CollectionInfoAccessibilityNodeInfo.CollectionItemInfo 提供檢視集合相關資訊 (例如清單或格狀檢視) 來強化自身功能。

應用程式權限

應用程式必須使用 <uses-permission> 標記要求以下新權限,才能使用特定新的 API:

INSTALL_SHORTCUT
允許應用程式在啟動器中安裝捷徑
UNINSTALL_SHORTCUT
允許應用程式在啟動器中解除安裝捷徑
TRANSMIT_IR
允許應用程式使用裝置的紅外線發射器 (如果有的話)

注意:從 Android 4.4 開始,如果想使用 getExternalFilesDir() 等方法存取外部儲存空間的應用程式專屬區域,平台不再需要取得 WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE。不過,如果您要存取 getExternalStoragePublicDirectory() 提供的外部儲存空間共用區域,還是需要這項權限。

裝置功能

您可以使用 <uses-feature> 標記宣告下列新裝置功能,以宣告應用程式需求,並啟用 Google Play 篩選功能,或在執行階段檢查這項功能:

FEATURE_CONSUMER_IR
本裝置可以與消費者 IR 裝置通訊。
FEATURE_DEVICE_ADMIN
可透過裝置管理員強制執行裝置政策。
FEATURE_NFC_HOST_CARD_EMULATION
裝置支援主機型 NFC 卡模擬。
FEATURE_SENSOR_STEP_COUNTER
裝置包含硬體步驟計數器。
FEATURE_SENSOR_STEP_DETECTOR
裝置內有一個硬體步數偵測工具。

如需 Android 4.4 中所有 API 變更的詳細檢視畫面,請參閱 API 差異報告