Android 4.0 API

API 級別14

Android 4.0 (ICE_CREAM_SANDWICH) 是主要平台版本,可為使用者和應用程式開發人員新增多項新功能。除了下文說明的所有新功能和 API 以外,Android 4.0 也是重要的平台版本,因為 Android 4.0 可為較小的螢幕提供大量的 API 和 Holographic 主題。應用程式開發人員現在擁有單一平台和整合式 API 架構,可讓您透過單一 APK 開發及發布應用程式,在執行相同 Android 4.0 (API 級別 14) 或以上版本時,為手機、平板電腦和其他裝置提供最佳使用者體驗。

對開發人員來說,Android 4.0 平台可做為 Android SDK 的可下載元件使用。可下載的平台包含 Android 程式庫和系統映像檔,以及一組模擬器外觀等。如要開始針對 Android 4.0 開發或測試,請使用 Android SDK Manager 將平台下載至您的 SDK。

API 總覽

下列各節針對 Android 4.0 的新 API 提供技術總覽。

聯絡人供應程式中的 Social API

ContactsContract 提供者定義的 Contact API 已經過擴充,可支援新的社交導向功能,例如裝置擁有者的個人個人資料,以及使用者邀請個別聯絡人加入裝置上所安裝的社群網路。

使用者個人資料

Android 現在包含代表裝置擁有者的個人設定檔,如 ContactsContract.Profile 資料表所定義。保留使用者身分的社交應用程式可以在 ContactsContract.Profile 中建立新的 ContactsContract.RawContacts 項目,以納入使用者個人資料的資料。也就是說,代表裝置使用者的原始聯絡人並不屬於 ContactsContract.RawContacts URI 定義的傳統原始聯絡人資料表,而您必須在 CONTENT_RAW_CONTACTS_URI 的資料表中新增設定檔原始聯絡人。這個表格中的原始聯絡人接著會匯總為使用者可看見的「我」個人資料。

如要為設定檔新增原始聯絡人,您必須具備 android.Manifest.permission#WRITE_PROFILE 權限。同樣地,如要讀取設定檔表格,您必須要求 android.Manifest.permission#READ_PROFILE 權限。不過,即使將資料提供給設定檔,大多數應用程式都不需要讀取使用者個人資料。讀取使用者個人資料是一項機密權限,您應預期使用者對於提出要求的應用程式感到困惑。

邀請意願

INVITE_CONTACT 意圖動作可讓應用程式叫用動作,指出使用者想將聯絡人新增到社群網路。接收應用程式後,應用程式就會使用該應用程式邀請指定的聯絡人加入該社交網路。大多數應用程式都會在這項作業的傳送端持續進行。舉例來說,當使用者針對聯絡人詳細資料中列出的特定社交應用程式選取「新增連線」時,內建的「使用者」應用程式就會叫用邀請意圖。

如要讓應用程式顯示在「新增連線」清單中,應用程式必須提供同步轉換介面,才能同步處理社群網路中的聯絡人資訊。然後,您必須在應用程式的同步設定檔中新增 inviteContactActivity 屬性,在傳送邀請意圖時系統應啟動的活動完整名稱,向系統指出應用程式回應 INVITE_CONTACT 意圖。然後,啟動的活動可以從意圖的資料中擷取聯絡人的 URI,然後執行必要工作,邀請該聯絡人加入網路,或將使用者新增至使用者的連線。

大型相片

Android 現在支援聯絡人的高解析度相片功能。現在,當您將相片推送至聯絡人記錄時,系統會處理相片並同時處理到 96x96 的縮圖 (如之前一樣) 和儲存在新檔案相片儲存區中的 256x256 「顯示相片」(系統選擇的確切尺寸在日後可能不同)。如要在聯絡人中新增大型相片,您可以在資料列的一般 PHOTO 欄中放置一張大型相片,讓系統處理到適當的縮圖並顯示相片記錄。

聯絡使用情形意見回饋

新的 ContactsContract.DataUsageFeedback API 可讓您追蹤使用者使用特定方式聯絡他人的頻率,例如使用者使用每個電話號碼或電子郵件地址的頻率。這些資訊有助於改善每個與每位聯絡人相關的聯絡方式排名,並為個別使用者提供更好的聯絡方式。

日曆供應商

新的 Calendar API 可讓您讀取、新增、修改及刪除日曆供應商中儲存的日曆、活動、參與者、提醒和快訊。

許多應用程式和小工具都能使用這些 API 讀取及修改日曆活動。不過,其中一個最有效的用途是同步轉換介面,會將使用者的日曆從其他日曆服務與日曆供應商同步處理,藉此提供所有使用者活動的統一位置。舉例來說,Google 日曆活動會透過 Google 日曆同步轉接程式與日曆供應器同步處理,讓 Android 內建的「日曆」應用程式得以檢視這些活動。

日曆提供者中日曆和活動相關資訊的資料模型是由 CalendarContract 定義。所有使用者的日曆資料都會儲存在多個資料表,由 CalendarContract 的各種子類別定義:

  • CalendarContract.Calendars 資料表會保留日曆專屬的資訊。這個資料表中的每一列都包含單一日曆的詳細資料,例如名稱、顏色和同步處理資訊等。
  • CalendarContract.Events 資料表含有事件專屬資訊。這個資料表中的每一列都包含單一事件的資訊,例如活動名稱、地點、開始時間、結束時間等等。該事件可以發生一次,或重複發生。參與者、提醒和擴充屬性會儲存在不同資料表中,並使用事件的 _ID 將這些屬性與事件建立連結。
  • CalendarContract.Instances 資料表保存事件發生的開始和結束時間。這個表格中的每一列都代表一次發生了一次。針對一次性事件,系統需要一對一將執行個體對應至事件。針對週期性活動,系統會自動產生多個資料列,以便對應到該事件的多次發生情況。
  • CalendarContract.Attendees 資料表包含活動參與者或邀請對象資訊。每一列都代表活動的一位邀請對象。用途是指定訪客的類型,以及使用者對事件的回應。
  • CalendarContract.Reminders 資料表會保留快訊/通知資料。每一列都代表特定事件的單一快訊。一個活動可以設定多個提醒。每個事件的提醒次數可在 MAX_REMINDERS 中指定,而此項目是由擁有特定日曆的同步轉換器所設定。提醒的時間是以活動前的分鐘數指定,並指定鬧鐘方法,例如使用快訊、電子郵件或簡訊來提醒使用者。
  • CalendarContract.ExtendedProperties 資料表會保留同步轉換介面使用的不透明資料欄位。提供者不會對這個資料表中的項目執行任何操作,但會在相關事件刪除時將其刪除。

如要透過日曆提供者存取使用者的日曆資料,應用程式必須要求 READ_CALENDAR 權限 (具有讀取權限) 和 WRITE_CALENDAR (寫入權限)。

事件意圖

如果您只要將活動新增至使用者的日曆,則可以使用 ACTION_INSERT 意圖搭配 Events.CONTENT_URI 定義的資料,以便在日曆應用程式中啟動建立新活動的活動。使用該意圖不需要任何權限,但您可以使用下列額外項目指定事件詳細資料:

語音留言提供者

新的語音信箱供應商可讓應用程式在裝置上新增語音留言,以便在單一視覺呈現中呈現所有使用者的語音留言。舉例來說,使用者可能會有多個語音留言來源,例如手機服務供應商提供的一個來源,而另一個來自 VoIP 或其他語音服務的語音服務。這些應用程式可以使用語音信箱供應商 API,將語音留言新增到裝置。接著,內建的「電話」應用程式會透過統合式簡報向使用者展示所有語音留言。雖然系統的「電話」應用程式是唯一可以讀取所有語音留言的應用程式,但每個提供語音留言的應用程式都能讀取已新增至系統的語音留言 (但無法讀取其他服務的語音留言)。

由於 API 目前不允許第三方應用程式讀取系統中的所有語音留言,因此只有可使用語音信箱 API 的第三方應用程式,只有提供語音留言給使用者。

VoicemailContract 類別會定義語音信箱 Provder 的內容供應器。VoicemailContract.VoicemailsVoicemailContract.Status 子類別提供了資料表,其中可插入裝置儲存空間的語音留言資料。如需語音信箱供應商應用程式的範例,請參閱語音信箱供應商示範

多媒體

Android 4.0 針對與相片、影片和音樂等媒體互動的應用程式新增數個新的 API。

媒體效果

新的媒體效果架構可讓您為圖片和影片套用不同的視覺效果。舉例來說,圖片效果可讓您輕鬆修正紅眼、將圖像轉換為灰階、調整亮度、調整飽和度、旋轉圖片、套用魚眼效果等等。系統會對 GPU 執行所有效果處理作業,藉此獲得最大效能。

為了達到最佳效能,效果會直接套用至 OpenGL 紋理,因此您的應用程式必須具備有效的 OpenGL 結構定義,才能使用效果 API。您套用效果的紋理可能來自點陣圖、影片或甚至相機。不過,紋理必須符合下列限制:

  1. 這些圖片必須繫結至 GL_TEXTURE_2D 紋理圖片
  2. 至少須包含一個 mipmap 層級

Effect 物件會定義可套用至圖片頁框的單一媒體效果。建立 Effect 的基本工作流程如下:

  1. 從 OpenGL ES 2.0 內容呼叫 EffectContext.createWithCurrentGlContext()
  2. 使用傳回的 EffectContext 呼叫 EffectContext.getFactory(),以傳回 EffectFactory 的例項。
  3. 呼叫 createEffect(),透過 @link android.media.effect.EffectFactory} 傳遞效果名稱,例如 EFFECT_FISHEYEEFFECT_VIGNETTE

如要調整效果的參數,請呼叫 setParameter() 並傳遞參數名稱和參數值。每種效果類型可接受不同的參數,這些參數都會以效果名稱記錄。舉例來說,EFFECT_FISHEYE 有一個適用於失真的 scale 參數。

如要為紋理套用效果,請在 Effect 上呼叫 apply(),然後傳入輸入紋理、寬度和高度,以及輸出紋理。輸入紋理必須繫結至 GL_TEXTURE_2D 紋理圖片 (通常透過呼叫 glTexImage2D() 函式來完成)。您可以提供多個 mipmap 層級。如果輸出紋理未與紋理圖片繫結,則該效果會自動受到 GL_TEXTURE_2D 的影響,且具有一個 mipmap 層級 (0),其大小會與輸入內容相同。

保證支援 EffectFactory 中列出的所有效果。 不過,並非所有裝置都支援外部程式庫提供的某些額外特效,因此您必須先呼叫 isEffectSupported(),確認外部程式庫是否支援來自外部程式庫的所需效果。

遙控器用戶端

新的 RemoteControlClient 可讓媒體播放器透過遠端控制用戶端 (例如裝置螢幕鎖定畫面) 啟用播放控制項。此外,媒體播放器也可以公開目前用於遙控器顯示的媒體相關資訊,例如曲目資訊和專輯封面。

如要為媒體播放器啟用遠端控制用戶端,請將 RemoteControlClient 與其建構函式執行個體化,並向其傳遞廣播 ACTION_MEDIA_BUTTONPendingIntent。意圖也必須在應用程式內宣告負責處理 ACTION_MEDIA_BUTTON 事件的明確 BroadcastReceiver 元件。

如要宣告播放器可以處理的媒體控制項輸入來源,您必須在 RemoteControlClient 上呼叫 setTransportControlFlags(),並傳遞一組 FLAG_KEY_MEDIA_* 旗標,例如 FLAG_KEY_MEDIA_PREVIOUSFLAG_KEY_MEDIA_NEXT

接著,您必須將其傳遞至 MediaManager.registerRemoteControlClient() 來註冊 RemoteControlClient。註冊完成後,當您透過遙控器按下某個按鈕時,您在將 RemoteControlClient 執行個體化時宣告的廣播接收器會收到 ACTION_MEDIA_BUTTON 事件。您收到的意圖中包含已按下媒體鍵的 KeyEvent,您可以使用 getParcelableExtra(Intent.EXTRA_KEY_EVENT) 從意圖中擷取該意圖。

如要顯示遙控器上媒體播放內容的資訊,請呼叫 editMetaData(),並將中繼資料新增至傳回的 RemoteControlClient.MetadataEditor。您可以為媒體圖片提供點陣圖、經過時間等數值資訊,以及曲目標題等文字資訊。如要瞭解可用的金鑰,請參閱 MediaMetadataRetriever 中的 METADATA_KEY_* 標記。

如需實作範例,請參閱隨機音樂播放器,該播放器提供相容性邏輯,以便在 Android 4.0 裝置上啟用遠端控制用戶端,同時繼續支援裝置至 Android 2.1 版。

媒體播放器

  • 現在需要「INTERNET」權限,才能從 MediaPlayer 串流線上媒體。如果您使用 MediaPlayer 播放網際網路的內容,請務必將 INTERNET 權限新增至資訊清單,否則媒體播放功能從 Android 4.0 版本開始將無法運作。
  • setSurface() 可讓您定義 Surface 做為影片接收器的行為。
  • setDataSource() 可讓您透過要求傳送額外的 HTTP 標頭,對於 HTTP(S) 即時串流而言,此功能相當實用
  • HTTP(S) 直播現在會根據 HTTP Cookie 進行所有要求

媒體類型

Android 4.0 支援下列項目:

  • HTTP/HTTPS 即時串流通訊協定第 3 版
  • ADTS 原始 AAC 音訊編碼
  • WEBP 圖片
  • Matroska 影片

詳情請參閱「支援的媒體格式」一節。

相機

Camera 類別現在提供用於偵測臉孔及控制對焦和測光區域的 API。

臉部偵測

相機應用程式現在可以透過 Android 的臉部偵測 API 提升手機功能,除了偵測拍攝主體的臉孔外,還能偵測特定臉部特徵,例如眼睛和嘴巴。

如要在相機應用程式中偵測臉孔,您必須呼叫 setFaceDetectionListener() 來註冊 Camera.FaceDetectionListener。接著,您可以啟動相機介面,並呼叫 startFaceDetection() 開始偵測臉孔。

當系統在相機場景中偵測到一或多個臉孔時,會在 Camera.FaceDetectionListener 實作中呼叫 onFaceDetection() 回呼,包括 Camera.Face 物件陣列。

Camera.Face 類別的例項會提供偵測到的臉孔各種相關資訊,包括:

  • Rect,用於指定相對於攝影機目前的視野的臉部邊界
  • 介於 1 到 100 之間的整數,表示系統對該物件為人類臉孔的信心程度
  • 追蹤多個臉孔的專屬 ID
  • 多個表示眼睛和嘴巴位置的 Point 物件

注意:部分裝置可能不支援臉部偵測功能,因此請務必呼叫 getMaxNumDetectedFaces() 進行檢查,並確保傳回值大於零。此外,部分裝置可能不支援眼睛和嘴巴的身分識別,在此情況下,Camera.Face 物件中的這些欄位為空值。

專注和測光區域

相機應用程式現在可以控制相機用於對焦的區域,以及計量白平衡和自動曝光的功能。這兩項功能都使用新的 Camera.Area 類別,指定相機目前檢視畫面應聚焦或計量付費的區域。Camera.Area 類別的例項會使用 Rect 和面積權重來定義區域的邊界,以整數表示該區域相對於其他區域的重要性等級。

設定焦點區域或計量區域之前,請先分別呼叫 getMaxNumFocusAreas()getMaxNumMeteringAreas()。如果傳回零,則表示裝置不支援對應的功能。

如要指定要使用的焦點或計量區域,只要呼叫 setFocusAreas()setMeteringAreas() 即可。每次都會接受 Camera.Area 物件的 List,用於表示要考慮聚焦或計量的區域。舉例來說,您可以實作一個功能,讓使用者輕觸預覽畫面區域來設定焦點區域,接著將其轉譯為 Camera.Area 物件,並要求相機聚焦在場景的該區域。該區域的焦點或曝光度也會隨著場景中的場景變化而不斷更新。

持續自動對焦相片

你現在可以在拍照時啟用持續自動對焦 (CAF)。如要在相機應用程式中啟用 CAF,請將 FOCUS_MODE_CONTINUOUS_PICTURE 傳遞至 setFocusMode()。準備好拍照時,請呼叫 autoFocus()Camera.AutoFocusCallback 會立即收到回呼,指出是否已完成聚焦。如要在收到回呼後恢復 CAF,您必須呼叫 cancelAutoFocus()

注意:使用 API 級別 9 中新增的 FOCUS_MODE_CONTINUOUS_VIDEO 擷取影片時,也支援連續自動對焦。

其他相機功能

攝影機廣播意圖

  • Camera.ACTION_NEW_PICTURE:表示使用者已拍攝新相片。拍照後,內建的相機應用程式會叫用這個廣播,第三方相機應用程式也應在拍照後播送這個意圖。
  • Camera.ACTION_NEW_VIDEO:這表示使用者已擷取新影片。內建的相機應用程式會在錄製影片後叫用這個廣播,第三方相機應用程式也應在拍攝影片後播送這個意圖。

Android Beam (透過 NFC 進行 NDEF 推送)

Android Beam 是一項新的 NFC 功能,可讓您將 NDEF 訊息從一部裝置傳送至另一部裝置 (這項程序又稱為「NDEF 推送」)。如果有兩部支援 Android Beam 的 Android 裝置,在裝置背面 (約 4 公分) 距離很近,就會啟動資料移轉程序。NDEF 訊息內的資料可能包含要在裝置之間共用的任何資料。舉例來說,「使用者」應用程式會共用聯絡人、YouTube 分享影片,而瀏覽器則透過 Android Beam 分享網址。

如要使用 Android Beam 在裝置之間傳輸資料,您必須建立 NdefMessage,其中包含您要在活動於前景執行時分享的資訊。接著,您必須透過下列其中一種方式將 NdefMessage 傳遞至系統:

在系統成功將 NDEF 訊息傳送到其他裝置後,如果想執行特定程式碼,可以實作 NfcAdapter.OnNdefPushCompleteCallback,並使用 setNdefPushCompleteCallback() 進行設定。然後在訊息傳送後呼叫 onNdefPushComplete()

在接收裝置上,系統會分派 NDEF 推送訊息,做法與一般 NFC 標記類似。系統會使用 ACTION_NDEF_DISCOVERED 動作叫用意圖,以根據 NdefMessage 中第一個 NdefRecord 所設定的網址或 MIME 類型設定活動。針對要回應的活動,您可以針對應用程式重視的網址或 MIME 類型宣告意圖篩選器。如要進一步瞭解標記調度工具,請參閱 NFC 開發人員指南。

如果您想讓 NdefMessage 帶入 URI,現在可以使用便利的方法 createUri,根據字串或 Uri 物件建構新的 NdefRecord。如果 URI 是您希望應用程式在 Android Beam 事件期間一併接收的特殊格式,則應使用相同的 URI 配置為活動建立意圖篩選器,以便接收收到的 NDEF 訊息。

您也應該使用 NdefMessage 傳遞「Android 應用程式記錄」,以確保應用程式會處理傳入的 NDEF 訊息,即使其他應用程式篩選相同的意圖動作也一樣。如要建立 Android 應用程式記錄,請呼叫 createApplicationRecord(),並將應用程式的套件名稱傳遞給該記錄。其他裝置收到含有應用程式記錄的 NDEF 訊息,且多個應用程式包含處理指定意圖的活動時,系統一律會根據相符的應用程式記錄,將訊息傳送至應用程式中的活動。如果目標裝置目前未安裝您的應用程式,系統會使用 Android 應用程式記錄啟動 Google Play,並將使用者導向該應用程式以便安裝。

如果您的應用程式未使用 NFC API 執行 NDEF 推送訊息,則 Android 會提供預設行為:當應用程式在某部裝置的前景於前景運作,而另一部 Android 裝置叫用 Android Beam 時,則另一部裝置會收到 NDEF 訊息,其中含有用來識別應用程式的 Android 應用程式記錄。如果接收裝置已安裝該應用程式,系統會啟動該應用程式;如果沒有安裝,Google Play 會開啟並將使用者導向您的應用程式,以便進行安裝。

如要進一步瞭解 Android Beam 和其他 NFC 功能,請參閱「NFC 基本概念」開發人員指南。如需使用 Android Beam 的程式碼範例,請參閱 Android Beam 試用版

Wi-Fi P2P

Android 現在支援在 Android 裝置和其他裝置類型之間進行 Wi-Fi 點對點 (P2P) 連線 (根據 Wi-Fi 聯盟的 Wi-Fi DirectTM 認證計畫) 不需要無線基地台或網際網路連線。Android 架構提供一組 Wi-Fi P2P API,可讓您在每部裝置都支援 Wi-Fi P2P 時探索並連線至其他裝置,然後採用比藍牙連線更長的快速連線進行快速連線。

新套件 android.net.wifi.p2p 包含透過 Wi-Fi 執行點對點連線的所有 API。您需要使用的主要類別為 WifiP2pManager,如要取得,請呼叫 getSystemService(WIFI_P2P_SERVICE)WifiP2pManager 中的 API 可讓您:

也需要其他一些介面和類別,例如:

如要使用 Wi-Fi P2P API,應用程式必須要求下列使用者權限:

Android 系統也會在特定 Wi-Fi P2P 事件期間播送多種不同的動作:

如需詳細資訊,請參閱 WifiP2pManager 說明文件。另請參閱 Wi-Fi P2P Demo 範例應用程式。

藍牙健康裝置

Android 現已支援藍牙健康設定檔裝置,因此您可以建立應用程式,透過藍牙與支援藍牙的健康裝置通訊,例如心率監測器、血液計、溫度計和體重計。

與一般耳機和 A2DP 設定檔裝置類似,您必須使用 BluetoothProfile.ServiceListenerHEALTH 設定檔類型呼叫 getProfileProxy(),才能與設定檔 Proxy 物件建立連線。

取得 Health Profile Proxy (BluetoothHealth 物件) 後,您就能連結下列新的藍牙類別,並與配對的健康裝置連線並進行通訊:

想進一步瞭解如何使用藍牙健康設定檔,請參閱 BluetoothHealth 的說明文件。

無障礙功能

Android 4.0 利用全新的觸控探索模式和擴充 API,改善視障使用者的無障礙設計和擴充 API,可以提供更多檢視內容或開發進階無障礙服務的相關資訊。

觸控探索模式

視力受損的使用者現在可以輕觸螢幕,用手指在螢幕上拖曳,聽取內容的語音說明。由於「觸控探索」模式的運作方式與虛擬遊標類似,因此螢幕閱讀器可透過模擬「懸停」事件讀取 android:contentDescriptionsetContentDescription() 提供的資訊,以便螢幕閱讀器識別說明文字,與使用者使用 D-Pad 或軌跡球瀏覽時相同。因此,請考慮為應用程式中的檢視畫面提供說明文字,特別是 ImageButtonEditTextImageView 和其他可能無法自然包含說明文字的小工具。

檢視畫面無障礙功能

如要加強無障礙服務 (例如螢幕閱讀器) 可使用的資訊,您可以在自訂 View 元件中為無障礙功能事件實作新的回呼方法。

請特別注意,sendAccessibilityEvent() 方法的行為在 Android 4.0 中已變更。和先前的 Android 版本相同,當使用者在裝置上啟用無障礙服務且發生點擊或懸停等輸入事件時,系統會通知個別檢視畫面,並呼叫 sendAccessibilityEvent()。先前,sendAccessibilityEvent() 的實作會初始化 AccessibilityEvent,並將其傳送至 AccessibilityManager。新行為涉及一些額外的回呼方法,可讓檢視區塊及其父項為事件新增更多背景資訊:

  1. 叫用時,sendAccessibilityEvent()sendAccessibilityEventUnchecked() 方法會延後為 onInitializeAccessibilityEvent()

    實作 View 的自訂實作可能想要實作 onInitializeAccessibilityEvent(),將其他無障礙資訊附加至 AccessibilityEvent,但也應呼叫上層實作以提供預設資訊,例如標準內容說明、項目索引等等。但是,您不應在此回呼中新增額外的文字內容,因為這會發生這種情況。

  2. 初始化後,如果事件是應填入文字資訊的多種類型之一,檢視畫面就會收到對 dispatchPopulateAccessibilityEvent() 的呼叫,這會遵循 onPopulateAccessibilityEvent() 回呼。

    如果 android:contentDescription 文字遺失或不足,View 的自訂實作通常應實作 onPopulateAccessibilityEvent(),以將額外的文字內容新增至 AccessibilityEvent。如要在 AccessibilityEvent 中新增更多文字說明,請呼叫 getText().add()

  3. 此時,View 會在父項檢視畫面上呼叫 requestSendAccessibilityEvent(),將事件向上傳遞檢視區塊階層。每個父項檢視畫面都可以透過新增 AccessibilityRecord 擴充無障礙功能資訊,直到最終到達根層級檢視畫面,然後使用 sendAccessibilityEvent() 將事件傳送至 AccessibilityManager

除了上述新方法 (在擴充 View 類別時相當實用),您也可以擴充 AccessibilityDelegate 並在檢視畫面上設定 setAccessibilityDelegate(),藉此在任何 View 上攔截這些事件回呼。這麼做時,檢視區塊中的每個無障礙方法都會將呼叫延遲至委派中對應的方法。舉例來說,當檢視區塊收到對 onPopulateAccessibilityEvent() 的呼叫時,該呼叫會傳遞至 View.AccessibilityDelegate 中的相同方法。凡是未由委派處理的方法,都會向右傳回檢視畫面,以便瞭解預設行為。這可讓您僅覆寫任何特定檢視區塊所需的方法,而不必擴充 View 類別。

如果您想維持與 Android 4.0 以下版本的相容性,同時支援新的無障礙 API,可以使用最新版 v4 支援資料庫 (位於 Compatibility Package, r4) 來使用具有回溯相容性設計的一系列公用程式類別。

無障礙服務

開發無障礙服務時,我們已大幅擴充各種無障礙功能事件的相關資訊,為使用者提供更進階的無障礙功能意見回饋。特別是,系統會根據檢視區塊組合產生事件,並提供更完善的背景資訊,並讓無障礙服務能週遊檢視區塊階層,以取得其他檢視區塊資訊,並處理特殊情況。

開發無障礙服務 (例如螢幕閱讀器) 時,您可以按照下列程序存取額外內容資訊及週遊檢視區塊階層:

  1. 從應用程式收到 AccessibilityEvent 後,請呼叫 AccessibilityEvent.getRecord() 來擷取特定的 AccessibilityRecord (可能會有多個記錄附加至該事件)。
  2. 您可以從 AccessibilityEvent 或個別 AccessibilityRecord 呼叫 getSource() 來擷取 AccessibilityNodeInfo 物件。

    AccessibilityNodeInfo 代表視窗內容的單一節點,採用的格式可讓您查詢該節點的無障礙功能資訊。AccessibilityEvent 傳回的 AccessibilityNodeInfo 物件會說明事件來源,AccessibilityRecord 的來源則說明事件來源的前身。

  3. 透過 AccessibilityNodeInfo,您可以查詢相關資訊、呼叫 getParent()getChild() 來掃遍檢視區塊階層,甚至將子項檢視畫面新增至節點。

如要讓應用程式以無障礙服務的形式發布應用程式,必須宣告與 AccessibilityServiceInfo 對應的 XML 設定檔。如要進一步瞭解如何建立無障礙服務,請參閱 AccessibilityServiceSERVICE_META_DATA 的說明,瞭解 XML 設定的相關資訊。

其他無障礙 API

如果您想瞭解裝置的無障礙狀態,AccessibilityManager 提供了一些新的 API,例如:

拼字檢查工具服務

新的拼字檢查工具架構可讓應用程式以與輸入方法架構 (適用於 IME) 類似的方式建立拼字檢查工具。如要建立新的拼字檢查工具,您必須實作擴充 SpellCheckerService 的服務,並擴充 SpellCheckerService.Session 類別,以根據介面回呼方法提供的文字提供拼字建議。在 SpellCheckerService.Session 回呼方法中,您必須將拼字建議傳回為 SuggestionsInfo 物件。

使用拼字檢查工具服務的應用程式,必須宣告服務所需的 BIND_TEXT_SERVICE 權限。服務也必須使用 <action android:name="android.service.textservice.SpellCheckerService" /> 宣告意圖篩選器做為意圖動作,且應包含一個 <meta-data> 元素,用於宣告拼字檢查工具的設定資訊。

請參閱 拼字檢查工具服務範例應用程式,以及 拼字檢查工具用戶端應用程式的程式碼範例。

文字轉語音引擎

Android 的文字轉語音 (TTS) API 已大幅擴充,讓應用程式可以更輕鬆地實作自訂 TTS 引擎;而想要使用 TTS 引擎的應用程式,則可利用一組新的 API 來選取引擎。

使用文字轉語音引擎

在先前的 Android 版本中,您可以使用 TextToSpeech 類別,透過系統提供的 TTS 引擎執行文字轉語音 (TTS) 作業,或使用 setEngineByPackageName() 設定自訂引擎。在 Android 4.0 中,setEngineByPackageName() 方法已經淘汰,您現在可以使用可接受 TTS 引擎套件名稱的新 TextToSpeech 建構函式,指定要使用的引擎。

您也可以使用 getEngines() 查詢可用的 TTS 引擎。這個方法會傳回 TextToSpeech.EngineInfo 物件清單,其中包括引擎的圖示、標籤和套件名稱等中繼資料。

建構文字轉語音引擎

以前,自訂搜尋引擎需要使用未記錄的原生標頭檔案建構引擎。在 Android 4.0 中,提供一組完整的架構 API,可用於建構 TTS 引擎。

基本設定需要實作回應 INTENT_ACTION_TTS_SERVICE 意圖的 TextToSpeechService。TTS 引擎的主要工作是發生在擴充 TextToSpeechService 的服務 onSynthesizeText() 回呼期間。系統會提供這個方法兩個物件:

  • SynthesisRequest:包含各種資料,包括要合成的文字、語言代碼、語音速率和語音音調。
  • SynthesisCallback:TTS 引擎會將產生的語音資料做為串流音訊傳遞在這個介面。首先,引擎必須呼叫 start() 表示引擎已準備好提供音訊,然後呼叫 audioAvailable(),將音訊資料以位元組緩衝區傳遞。引擎透過緩衝區傳遞所有音訊後,請呼叫 done()

目前架構支援建立 TTS 引擎的真實 API,因此系統不再支援原生程式碼實作。查看有關相容性層的網誌文章,瞭解如何將舊版 TTS 引擎轉換為新架構。

如需使用新 API 的 TTS 引擎範例,請參閱文字轉語音範例應用程式。

網路用量

Android 4.0 可讓使用者清楚瞭解自家應用程式所使用的網路數據量。「設定」應用程式提供多項控制項,讓使用者能設定網路數據用量限制,甚至停用個別應用程式的背景資料使用功能。為了避免使用者在背景中無法使用應用程式資料存取權,建議您制定策略,有效運用數據連線,並根據可用連線類型調整用量。

如果應用程式會執行大量網路交易,您應提供使用者設定,讓使用者能夠控制應用程式的資料習慣,例如應用程式同步處理資料的頻率、是否只在連上 Wi-Fi 時執行上傳/下載作業,以及是否在漫遊時使用資料等。有了這些控制項,使用者就能在接近限制時停用應用程式的資料存取權,因為他們可藉此控制應用程式的資料存取權。如要透過這些設定提供偏好設定活動,則應在資訊清單的宣告中,加入 ACTION_MANAGE_NETWORK_USAGE 動作的意圖篩選器。例如:

<activity android:name="DataPreferences" android:label="@string/title_preferences">
    <intent-filter>
       <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

此意圖篩選器會向系統指示這是控制應用程式數據用量的活動。因此,當使用者透過「設定」應用程式檢查應用程式正在使用的資料量時,可以使用「查看應用程式設定」按鈕啟動偏好設定活動,讓使用者調整應用程式使用的資料量。

另外請注意,getBackgroundDataSetting() 現已淘汰,且一律傳回 true,請改用 getActiveNetworkInfo()。嘗試任何網路交易之前,請務必呼叫 getActiveNetworkInfo() 以取得代表目前網路的 NetworkInfo,並查詢 isConnected() 來檢查裝置是否已連線。接著,您可以檢查其他連線屬性,例如裝置是否正在漫遊或連上 Wi-Fi。

企業

Android 4.0 提供下列功能,進一步擴充企業應用程式的功能。

VPN 服務

新的 VpnService 可讓應用程式建構自己的 VPN (虛擬私人網路),並以 Service 的身分執行。VPN 服務會為具有專屬位址和轉送規則的虛擬網路建立介面,並以檔案描述元執行所有讀取和寫入作業。

如要建立 VPN 服務,請使用 VpnService.Builder,您可以指定網路位址、DNS 伺服器、網路路徑等。完成後,您可以呼叫 establish() 以建立介面,這個介面會傳回 ParcelFileDescriptor

因為 VPN 服務可能會攔截封包,所以會造成安全性影響。因此,如果您實作 VpnService,您的服務就必須要求 BIND_VPN_SERVICE,以確保只有系統能夠繫結至該服務 (只有系統獲得這項權限,應用程式無法要求)。而如要使用 VPN 服務,使用者必須在系統設定中手動啟用。

裝置政策

管理裝置限制的應用程式現在可以使用 setCameraDisabled()USES_POLICY_DISABLE_CAMERA 屬性 (透過政策設定檔中 <disable-camera /> 元素套用) 停用相機。

憑證管理

新的 KeyChain 類別提供的 API 可讓您在系統金鑰存放區中匯入及存取憑證。憑證可簡化安裝用戶端憑證 (用於驗證使用者身分) 和憑證授權單位憑證 (用於驗證伺服器身分) 的流程。網路瀏覽器或電子郵件用戶端等應用程式可以存取已安裝的憑證,進而向伺服器驗證使用者。詳情請參閱 KeyChain 說明文件。

裝置感應器

Android 4.0 新增了兩種感應器類型:

如果裝置同時具有 TYPE_AMBIENT_TEMPERATURETYPE_RELATIVE_HUMIDITY 感應器,您可以使用它們計算露點和絕對濕度。

先前的溫度感應器 TYPE_TEMPERATURE 已淘汰,請改用 TYPE_AMBIENT_TEMPERATURE 感應器。

此外,Android 的三個合成感應器已大幅改善,現在不但延遲時間更短,輸出也更流暢。這些感應器包括重力感應器 (TYPE_GRAVITY)、旋轉向量感應器 (TYPE_ROTATION_VECTOR) 和線性加速感應器 (TYPE_LINEAR_ACCELERATION)。改善的感應器會仰賴陀螺儀感應器來改善輸出內容,因此這類感應器只會顯示在具有陀螺儀的裝置上。

動作列

ActionBar 已更新,可支援多種新行為。最重要的是,在較小的螢幕上執行時,系統會妥善管理動作列的大小和設定,以便在所有螢幕大小上提供最佳使用者體驗。舉例來說,當螢幕較小 (例如手持螢幕方向為直向時),動作列的導覽分頁會顯示在主要動作列正下方的「堆疊列」中。您也可以選擇使用「分割動作列」,在螢幕較窄時將所有操作項目放入畫面底部的獨立列中。

分割動作列

如果動作列包含多個操作項目,並非所有項目都會納入窄版螢幕的動作列,因此系統會在溢位選單中加入更多項目。不過,Android 4.0 可讓您啟用「分割動作列」,讓螢幕底部的獨立長條有更多操作項目。如要啟用分割動作列,請將含有 "splitActionBarWhenNarrow"android:uiOptions 新增至資訊清單檔案中的 <application> 標記或個別 <activity> 標記。啟用後,當螢幕狹窄時,系統會在畫面底部針對所有操作項目新增另一列 (主要動作列不會顯示任何操作項目)。

如果您想使用 ActionBar.Tab API 提供的導覽分頁,但不需要頂端的主要動作列 (只想顯示在頂端),請按照上述說明啟用分割動作列,並呼叫 setDisplayShowHomeEnabled(false) 來停用動作列中的應用程式圖示。主要動作列上沒有任何內容會消失,只留下畫面頂端的導覽分頁,以及畫面底部的操作項目。

動作列樣式

如要將自訂樣式套用至動作列,可以使用新的樣式屬性 backgroundStackedbackgroundSplit,分別將背景可繪項目或顏色套用至堆疊的長條和分割列。您也可以在執行階段使用 setStackedBackgroundDrawable()setSplitBackgroundDrawable() 設定這些樣式。

動作提供者

新的 ActionProvider 類別可讓您為動作項目建立專屬處理常式。動作提供者可以定義動作檢視畫面、預設動作行為,以及針對每個相關聯的操作項目加入子選單。如要建立具有動態行為的操作項目 (例如變數動作檢視畫面、預設動作或子選單),建議您擴充 ActionProvider 是不錯的解決方案,以建立可重複使用的元件,而不是處理片段或活動中的不同的操作項目轉換作業。

舉例來說,ShareActionProviderActionProvider 的擴充功能,可執行動作列中的「分享」動作。與其使用叫用 ACTION_SEND 意圖的傳統操作項目,您可以使用這個動作供應器,透過下拉式清單顯示處理 ACTION_SEND 意圖的應用程式下拉式清單。當使用者選取要用於動作的應用程式時,ShareActionProvider 會記住該選項並在動作檢視畫面中提供,以便快速存取該應用程式。

如要為操作項目宣告動作供應程式,請在活動選項選單的 <item> 元素中加入 android:actionProviderClass 屬性,並將動作提供者的類別名稱做為值。例如:

<item android:id="@+id/menu_share"
      android:title="Share"
      android:showAsAction="ifRoom"
      android:actionProviderClass="android.widget.ShareActionProvider" />

在活動的 onCreateOptionsMenu() 回呼方法中,從選單項目擷取動作提供者的例項,然後設定意圖:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options, menu)
    val shareActionProvider = menu.findItem(R.id.menu_share)?.actionProvider as? ShareActionProvider
    // Set the share intent of the share action provider.
    shareActionProvider?.setShareIntent(createShareIntent())
    ...
    return super.onCreateOptionsMenu(menu)
}

Java

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    ShareActionProvider shareActionProvider =
          (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
    // Set the share intent of the share action provider.
    shareActionProvider.setShareIntent(createShareIntent());
    ...
    return super.onCreateOptionsMenu(menu);
}

如需使用 ShareActionProvider 的範例,請參閱 ApiDemos 中的 ActionBarShareActionProviderActivity

可收合動作檢視畫面

提供動作檢視畫面的操作項目,現在可以在動作檢視畫面狀態和傳統操作項目狀態之間切換。先前在做為動作檢視畫面使用時,只有 SearchView 支援收合,但您現在可以為任何操作項目新增動作檢視畫面,並在展開狀態 (顯示動作檢視畫面) 和收合狀態之間切換 (顯示操作項目)。

如要宣告包含動作檢視畫面的操作項目可收合,請在選單 XML 檔案的 <item> 元素的 android:showAsAction 屬性中加入 “collapseActionView" 標記。

如要在動作檢視畫面在展開和收合之間切換時接收回呼,請呼叫 setOnActionExpandListener(),使用個別的 MenuItem 註冊 MenuItem.OnActionExpandListener 的執行個體。一般而言,您應在 onCreateOptionsMenu() 回呼期間執行此操作。

如要控制可收合動作檢視畫面,您可以在個別的 MenuItem 上呼叫 collapseActionView()expandActionView()

建立自訂動作檢視畫面時,您也可以實作新的 CollapsibleActionView 介面,以便在檢視畫面展開及收合時接收回呼。

動作列的其他 API

  • setHomeButtonEnabled() 可讓您指定圖示/標誌的行為是否做為前往首頁的按鈕,或「向上」(傳遞「true」,讓其行為可設為按鈕)。
  • setIcon()setLogo() 可讓您定義執行階段的動作列圖示或標誌。
  • Fragment.setMenuVisibility() 可讓您啟用或停用片段宣告的選項選單項目的顯示設定。如果片段已新增至活動,但不會顯示,因此應該隱藏選單項目。
  • FragmentManager.invalidateOptionsMenu() 可讓您在片段生命週期的不同狀態中,使活動選項選單失效,其中使用 Activity 的對等方法可能無法使用。

使用者介面和檢視畫面

Android 4.0 導入多種新的檢視畫面和其他 UI 元件。

GridLayout

GridLayout 是新的檢視區塊群組,可將子檢視畫面置於矩形方格中。與 TableLayout 不同的是,GridLayout 採用平面階層,不會使用中繼檢視畫面 (例如資料表列) 來提供結構。子項改為指定應佔用的資料列和資料欄 (儲存格可橫跨多個資料列和/或資料欄),且根據預設,會依序排列在格線的資料列與資料欄中。GridLayout 方向可決定依序排列的子項是水平或垂直配置。如要指定子項之間的空間,可以使用新 Space 檢視畫面的執行個體,或是在子項上設定相關邊界參數。

如需使用 GridLayout 的範例,請參閱 ApiDemos

TextureView

TextureView 是新的檢視畫面,可讓您顯示內容串流,例如影片或 OpenGL 場景。雖然與 SurfaceView 類似,但 TextureView 的獨特之處在於其運作方式與一般檢視畫面類似,而非建立獨立視窗,因此您可以將其視為任何其他 View 物件。舉例來說,您可以套用轉換、使用 ViewPropertyAnimator 建立動畫效果,或使用 setAlpha() 調整其不透明度。

請注意,TextureView 只能在硬體加速視窗中運作。

詳情請參閱 TextureView 說明文件。

切換小工具

新的 Switch 小工具是雙狀態切換鈕,使用者可以拖曳至其中一側或另一側 (或直接輕觸),藉此在兩種狀態之間切換。

您可以使用 android:textOnandroid:textOff 屬性,指定開啟和關閉設定時,在切換按鈕上顯示的文字。android:text 屬性也可讓您在切換按鈕旁放置標籤。

如需使用切換按鈕的範例,請參閱「switches.xml」版面配置檔案和各自的切換鈕 活動。

Android 3.0 導入了 PopupMenu,可在您指定的錨點 (通常是在所選項目的位置) 建立簡短內容選單。Android 4.0 將 PopupMenu 擴充為兩個實用功能:

偏好設定

新的 TwoStatePreference 抽象類別會以提供兩個狀態選項選項的偏好設定為基礎。新的 SwitchPreferenceTwoStatePreference 的擴充功能,可在偏好設定檢視畫面中提供 Switch 小工具,讓使用者不必開啟其他偏好設定畫面或對話方塊,即可開啟或關閉設定。舉例來說,「設定」應用程式會使用 SwitchPreference 進行 Wi-Fi 和藍牙設定。

系統主題

凡是以 Android 4.0 為目標版本的應用程式 (透過將 targetSdkVersionminSdkVersion 設為 “14" 以上版本) 的預設主題,現在為「裝置預設」主題:Theme.DeviceDefault。這可能是深色的 Holo 主題,或特定裝置所定義的其他深色主題。

在執行同一版本的 Android 時,我們保證 Theme.Holo 主題系列不會在不同裝置間變更。如果您將任何 Theme.Holo 主題明確套用至活動,可以放心,這些主題不會在同一平台版本的不同裝置上變更字元。

如果希望應用程式能融入整體裝置主題 (例如不同的原始設備製造商 (OEM) 為系統提供不同的預設主題),應明確套用 Theme.DeviceDefault 系列的主題。

選項選單按鈕

從 Android 4.0 開始,您會發現手機不再需要選單硬體按鈕。不過,如果現有的應用程式提供選項選單,且預期會有「選單」按鈕,就不需要擔心這個問題。為確保現有應用程式能繼續正常運作,系統會針對專為舊版 Android 設計的應用程式提供畫面上的選單按鈕。

為獲得最佳使用者體驗,新版和更新後的應用程式應改用 ActionBar 提供選單項目存取權,並將 targetSdkVersion 設為 "14",以運用最新的架構預設行為。

系統 UI 瀏覽權限控制項

自 Android 問世以來,系統已管理一項 UI 元件 (稱為狀態列),該元件位於手機頂端,可傳送電信業者訊號、時間、通知等資訊。Android 3.0 版新增了平板電腦裝置的系統列,位於畫面底部提供系統導覽控制項 (首頁、返回等),也提供狀態列傳統提供的元素介面。在 Android 4.0 中,系統會提供一種稱為導覽列的新型系統 UI。您可能會將導覽列視為手機專用系統列的重新調整版本,也就是為沒有硬體產品導覽系統的裝置提供導覽控制項,但會排除系統列的通知 UI 和設定控制項。因此,提供導覽列的裝置也會在頂端顯示狀態列。

在這一天,您可以使用 FLAG_FULLSCREEN 標記隱藏手機的狀態列。在 Android 4.0 中,控制系統列瀏覽權限的 API 已更新,以更準確地反映系統列和導覽列的行為:

  • SYSTEM_UI_FLAG_LOW_PROFILE 旗標會取代 STATUS_BAR_HIDDEN 旗標。設定後,這個標記會為系統列或導覽列啟用「低設定檔」模式。導覽按鈕會變暗,系統列中的其他元素也會隱藏。啟用此功能有助於打造更身歷其境的遊戲,而不會因系統導覽按鈕而分心。
  • SYSTEM_UI_FLAG_VISIBLE 旗標會取代 STATUS_BAR_VISIBLE 旗標,要求顯示系統列或導覽列。
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION 是一個新旗標,可完全要求隱藏導覽列。請注意,這僅適用於某些手機使用的導覽列 (「不會」在平板電腦上隱藏系統列)。系統收到使用者輸入內容後,導覽列就會立即返回查看。因此,此模式主要適用於影片播放,或者需要整個螢幕,但不需要使用者輸入內容的情況。

您可以在活動的任何檢視畫面上呼叫 setSystemUiVisibility(),為系統列和導覽列設定每個標記。只要視窗具有輸入焦點,視窗管理員會合併視窗中所有檢視畫面的所有標記 (OR 結合在一起) 並將其套用至系統 UI。當視窗失去輸入焦點 (使用者離開應用程式,或顯示對話方塊) 時,標記就會失效。同樣地,如果您從檢視區塊階層中移除這些檢視畫面,標記就不再適用。

如要同步處理活動中與系統 UI 瀏覽權限變更的其他事件 (例如在系統 UI 隱藏時隱藏動作列或其他 UI 控制項),建議您註冊 View.OnSystemUiVisibilityChangeListener,以便在系統列或導覽列的瀏覽權限變更時接收通知。

如需不同系統 UI 選項的示範,請參閱 OverscanActivity 類別。

輸入架構

Android 4.0 開始支援遊標懸停事件,以及新的觸控筆和滑鼠按鈕事件。

懸停事件

View 類別現在支援「懸停」事件,透過使用指標裝置 (例如滑鼠或其他驅動螢幕遊標的裝置) 提供更豐富的互動功能。

如要在檢視畫面中接收懸停事件,請實作 View.OnHoverListener,並向 setOnHoverListener() 註冊。在檢視畫面中發生懸停事件時,事件監聽器會收到對 onHover() 的呼叫,提供接收該事件的 View,以及說明所發生的懸停事件類型的 MotionEvent。懸停事件可以是下列其中一種:

如果 View.OnHoverListener 會處理懸停事件,則應從 onHover() 傳回 true。如果事件監聽器傳回 false,則懸停事件會照常分派給父項檢視畫面。

如果應用程式使用會根據目前狀態變更外觀的按鈕或其他小工具,您現在可以在狀態清單可繪項目中使用 android:state_hovered 屬性,即可在遊標懸停在檢視畫面上時提供不同的背景可繪項目。

如需新的懸停事件示範,請參閱 ApiDemos 中的 Hover 類別。

觸控筆和滑鼠按鈕事件

Android 現在提供從觸控筆輸入裝置接收輸入內容的 API,例如數位化平板電腦週邊裝置或支援觸控筆的觸控螢幕。

觸控筆輸入的運作方式與觸控或滑鼠輸入類似,當觸控筆與數位化工具接觸時,應用程式會收到觸控事件,就如同使用手指輕觸螢幕時一樣。當觸控筆懸停在數位化工具上方時,應用程式會收到懸停事件,就像在沒有按下任何按鈕的情況下,滑鼠遊標在螢幕上移動時一樣。

應用程式可以使用 getToolType() 查詢 MotionEvent 中與每個指標相關聯的「工具類型」,藉此區分手指、滑鼠、觸控筆和橡皮擦的輸入內容。目前定義的工具類型為:TOOL_TYPE_UNKNOWNTOOL_TYPE_FINGERTOOL_TYPE_MOUSETOOL_TYPE_STYLUSTOOL_TYPE_ERASER。透過查詢該工具類型,您的應用程式可以選擇處理觸控筆輸入,以與手指或滑鼠輸入不同的方式處理。

應用程式也可以使用 getButtonState() 查詢 MotionEvent 的「按鈕狀態」,查詢所按下的滑鼠或觸控筆按鈕。目前定義的按鈕狀態包括:BUTTON_PRIMARYBUTTON_SECONDARYBUTTON_TERTIARYBUTTON_BACKBUTTON_FORWARD。為方便起見,返回和向前滑鼠按鈕會自動對應至 KEYCODE_BACKKEYCODE_FORWARD 鍵。您的應用程式可處理這些按鍵,支援滑鼠返回和向前導覽的滑鼠按鈕。

除了精確測量聯絡人的位置和壓力外,某些觸控筆輸入裝置還會回報觸控筆提示與數位工具、觸控筆傾斜角度和觸控筆方向角度之間的距離。應用程式可以使用搭配軸碼 AXIS_DISTANCEAXIS_TILTAXIS_ORIENTATIONgetAxisValue() 查詢這項資訊。

如需工具類型、按鈕狀態和新軸程式碼的示範,請參閱 ApiDemos 中的 TouchPaint 類別。

屬性

新的 Property 類別可讓您快速、有效率地指定任何物件的屬性,讓呼叫端對目標物件進行一般設定/取得值。它還支援傳遞欄位/方法參照的功能,並且可讓程式碼設定/取得屬性值,不必瞭解欄位/方法的詳細資訊。

舉例來說,如果您想在物件 foo 上設定 bar 欄位的值,就可以使用以下方法:

Kotlin

foo.bar = value

Java

foo.bar = value;

如要為基礎私人欄位 bar 呼叫 setter,請先完成這項操作:

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

不過,如果您想傳遞 foo 例項,同時讓其他程式碼設定 bar 值,那麼在 Android 4.0 之前就沒有方法可以這麼做。

使用 Property 類別,您可以在 Foo 類別上宣告 Property 物件 BAR,以便在 Foo 類別的執行個體 foo 上設定欄位,如下所示:

Kotlin

BAR.set(foo, value)

Java

BAR.set(foo, value);

View 類別現在會利用 Property 類別來設定各種欄位,例如在 Android 3.0 中新增的轉換屬性 (ROTATIONROTATION_XTRANSLATION_X 等)。

ObjectAnimator 類別也會使用 Property 類別,因此您可以使用 Property 建立 ObjectAnimator,比起字串式的方法,速度更快、更有效率且類型安全。

硬體加速

從 Android 4.0 開始,如果應用程式已將 targetSdkVersionminSdkVersion 設為 “14" 或以上版本,則所有視窗的硬體加速功能都會預設為啟用。硬體加速通常可以讓動畫更流暢、捲動更順暢,以及整體效能和回應使用者互動情形。

如有需要,您可以使用個別 <activity> 元素或 <application> 元素的 hardwareAccelerated 屬性,手動停用硬體加速。您也可以呼叫 setLayerType(LAYER_TYPE_SOFTWARE),停用個別檢視畫面的硬體加速。

如要進一步瞭解硬體加速 (包括不支援的繪圖作業清單),請參閱「硬體加速」說明文件。

JNI 變更

在先前的 Android 版本中,JNI 本機參照並非間接處理,Android 使用直接指標。只要垃圾收集器未移動物件,這並非問題,但應該可以寫入錯誤程式碼,因此應該正常運作。在 Android 4.0 中,系統會使用間接參照來偵測這些錯誤。

JNI 本機參照的細節說明,請參閱「JNI 提示」的「當地和全球參考資料」。在 Android 4.0 中,系統已強化 CheckJNI 以偵測這些錯誤。請瀏覽 Android 開發人員網誌,瞭解即將推出的 JNI 參考資料常見錯誤和修正方法。

這項 JNI 實作中的變更只會影響以 Android 4.0 為目標版本的應用程式,也就是將 targetSdkVersionminSdkVersion 設為 “14" 以上版本。如果將這些屬性設為任何較低的值,則 JNI 本機參照的行為與先前版本相同。

WebKit

  • WebKit 已更新至 534.30 版
  • 支援 WebView 和內建瀏覽器中的 Indic 字型 (梵文字母、孟加拉文和泰米爾文,包括合併字符所需的複雜字元支援)
  • WebView 和內建瀏覽器支援衣索比亞、喬治亞文和亞美尼亞文字型
  • 支援 WebDriver,您就能更輕鬆地測試使用 WebView 的應用程式

Android 瀏覽器

瀏覽器應用程式新增了下列功能以支援網頁應用程式:

權限

以下是新權限:

裝置功能

以下是新的裝置功能:

如要進一步瞭解 Android 4.0 (API 級別 14) 中的所有 API 變更,請參閱 API 差異報告

舊版 API

除了上述所有功能以外,Android 4.0 也自然支援先前版本中的所有 API。由於 Android 3.x 平台僅適用於大螢幕裝置,因此如果您主要是針對手機進行開發,可能不會知道這些近期版本中新增到 Android 的所有 API。

以下提供一些您可能錯過的最值得注意的 API,這些 API 現在也可在手機上使用:

Android 3.0 版
  • Fragment:這個架構元件可讓您將不同的活動元素分離成獨立模組,用於定義自己的 UI 和生命週期。請參閱「片段」開發人員指南。
  • ActionBar:取代活動視窗頂端的傳統標題列。其中包括應用程式標誌,且為選單項目提供新介面。請參閱動作列開發人員指南。
  • Loader:這個架構元件有助於與 UI 元件整合非同步資料載入,在不封鎖主執行緒的情況下動態載入資料。請參閱「載入器」開發人員指南。
  • 系統剪貼簿:應用程式可以將資料 (除了文字以外的) 複製及貼到整個系統的剪貼簿。剪輯的資料可以是純文字、URI 或意圖。請參閱複製及貼上開發人員指南。
  • 拖曳:在檢視區塊架構中建構的一組 API,有助於拖曳作業。請參閱「拖曳」開發人員指南。
  • 全新的彈性動畫架構可讓您為任何物件的任意屬性 (檢視畫面、可繪項目、片段、物件或其他物件) 建立動畫,並定義持續時間、內插、重複等動畫元素。新架構讓 Android 中的動畫變得更簡單。請參閱「屬性動畫」開發人員指南。
  • RenderScript 圖形和運算引擎:RenderScript 提供在原生層級提供高效能 3D 圖形轉譯和 Compute API,方便您在 C (C99 標準) 中編寫;可呈現您預期來自原生環境的效能類型,同時保有各種 CPU 和 GPU 的可攜式。請參閱 RenderScript 開發人員指南。
  • 硬體加速 2D 圖形:您現在可以在資訊清單元素的 <application> 元素或個別 <activity> 元素中設定 {android:hardwareAccelerated="true"},為應用程式啟用 OpenGL 轉譯器。如此一來,動畫效果會更流暢、捲動更順暢,並且能改善使用者互動的整體效能和回應能力。

    注意:如果您將應用程式的 minSdkVersiontargetSdkVersion 設為 "14" 以上,系統預設會啟用硬體加速。

  • 還有許多其他功能。詳情請參閱 Android 3.0 平台附註。
Android 3.1 版
  • USB API:透過功能強大的新 API,將連接的周邊裝置與 Android 應用程式整合。這些 API 是以內建於平台的 USB 堆疊和服務為基礎,包括支援 USB 主機和裝置互動。請參閱 USB 主機和配件開發人員指南。
  • MTP/PTP API:應用程式可以直接與已連接的攝影機和其他 PTP 裝置互動,以便在裝置附加或移除裝置時接收通知、管理這類裝置上的檔案和儲存空間,以及將檔案和中繼資料傳輸至裝置或與其中繼資料互傳。MTP API 會導入 MTP (媒體傳輸通訊協定) 規格的 PTP (相片傳輸通訊協定)。請參閱 android.mtp 說明文件。
  • RTP API:Android 會在內建的 RTP (即時傳輸通訊協定) 堆疊中提供 API,應用程式可用來管理隨選或互動式資料串流。特別是,提供 VOIP、推送通話、會議和音訊串流的應用程式,可以使用這個 API 透過任何可用網路啟動工作階段,以及傳送或接收資料串流。請參閱 android.net.rtp 說明文件。
  • 支援搖桿和其他一般動作輸入。
  • 如需其他新 API,請參閱 Android 3.1 平台附註。
Android 3.2
  • 新的畫面支援 API,可讓您進一步掌控應用程式在不同螢幕大小上的顯示方式。API 會擴充現有的螢幕支援模型,根據密度獨立像素單位 (例如 600dp 或 720dp 的寬度) 進一步指定特定螢幕大小範圍,而非依據其通用的螢幕大小 (例如大或特大尺寸)。舉例來說,這在區分 5 吋裝置和 7 吋裝置 (傳統上都會歸類為「大螢幕」) 的裝置時,這一點非常重要。請參閱網誌文章「 New Tools for Managing Screen Sizes」(管理螢幕大小的新工具)。
  • <uses-feature> 宣告新的常數,可宣告橫向或直向螢幕方向需求。
  • 裝置的「螢幕大小」設定現在會在螢幕方向變更期間變更。如果應用程式指定的 API 級別為 13 以上,如要同時處理 "orientation" 設定變更,則必須處理 "screenSize" 設定變更。詳情請參閱 android:configChanges 相關說明。
  • 如要瞭解其他新 API,請參閱 Android 3.2 平台附註。

API 級別

Android 4.0 API 會指派一個儲存在系統本身中的整數 ID (14)。這個 ID 稱為「API 級別」,可讓系統在安裝應用程式前,正確判斷應用程式是否與系統相容。

如要在應用程式中使用 Android 4.0 中導入的 API,您必須針對支援 API 級別 14 或更高級別的 Android 平台編譯應用程式。視您的需求而定,您可能也需要在 <uses-sdk> 元素中加入 android:minSdkVersion="14" 屬性。

詳情請參閱「什麼是 API 級別?」一節。