API 級別: 14
Android 4.0 (ICE_CREAM_SANDWICH
)
是主要的平台版本,為使用者及應用程式添加多項新功能
開發人員。除了下方所述的所有新功能和 API 之外,Android 4.0 也是另一項重要任務
之所以發布平台版本,是因為 Android 3.x 提供各式各樣的 API 和 Holographic 主題
小螢幕裝置應用程式開發人員現在擁有單一平台和整合式 API 架構
可讓您使用提供
無論是手機、平板電腦等裝置,
Android: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
意圖動作可讓應用程式叫用動作,指出使用者想要將聯絡人加入社群網路。應用程式
接收應用程式會使用這個視窗邀請指定聯絡人
社群網路。大多數應用程式都會處於這項作業的接收端。舉例來說,
使用者選取「新增連線」時,內建「使用者」應用程式會叫用邀請意圖的
使用者聯絡人詳細資料中列出的社交應用程式。
如要讓應用程式顯示在「新增連線」清單中,應用程式必須提供同步處理適配器,以便同步處理社群網路中的聯絡資訊。接著,您必須向系統指出
應用程式會透過下列方式回應 INVITE_CONTACT
意圖
在應用程式的同步處理設定檔中加入 inviteContactActivity
屬性,並使用
系統傳送邀請意圖時,應啟動的活動完整名稱。
啟動的活動隨後可從意圖資料中擷取相關聯絡人的 URI,並執行必要作業,邀請該聯絡人加入網路,或將該聯絡人加入使用者的連線。
大型相片
Android 應用程式現可支援聯絡人的高解析度相片。現在,當你將相片推送到
聯絡記錄後,系統會同時處理 96x96 的縮圖 (如先前所述) 和
256x256「顯示相片」儲存在新的檔案式相片商店中 (確切的儲存尺寸
日後可能會有差異)。您可以在聯絡人中加入大型相片,
相片位於PHOTO
然後由系統將此處理成適當的縮圖並顯示相片
。
聯絡人使用意見回饋
新的 ContactsContract.DataUsageFeedback
API 可用於追蹤
使用者透過特定方式聯絡他人的頻率,例如他們使用聯繫的頻率
每個電話號碼或電子郵件地址。這項資訊有助於改善與每位使用者相關聯的每種聯絡方式排名,並提供更適當的聯絡建議。
日曆供應程式
全新 Calendar API 可讓您讀取、新增、修改及刪除日曆、活動、參與者 提醒和快訊,相關資訊儲存在日曆供應程式中。
各種應用程式和小工具都可以使用這些 API 讀取及修改日曆活動。不過,其中最吸引人的用途之一,就是同步轉接程式,可將使用者的日曆從其他日曆服務同步到日曆供應器,為使用者的所有活動提供統一的位置。舉例來說,Google 日曆活動會透過 Google 日曆同步轉接器與日曆供應器同步,讓您可以透過 Android 內建的日曆應用程式查看這些活動。
Google 日曆供應商中日曆與活動相關資訊的資料模型為
由 CalendarContract
定義。所有使用者的日曆資料都會儲存在由 CalendarContract
的各種子類別定義的多個資料表中:
CalendarContract.Calendars
資料表會保留特定日曆的資訊。這個資料表的每個資料列都包含單一行事曆的詳細資料,例如名稱、顏色、同步處理資訊等。CalendarContract.Events
資料表包含事件專屬資訊。 這個表格中的每一列都包含單一事件的資訊,例如活動標題、地點、開始時間、結束時間等等。活動可能會發生一次或週期性 以便重複使用參與者、提醒和擴充屬性會儲存在個別的資料表中,並使用活動的_ID
與活動建立連結。CalendarContract.Instances
表格會保留事件發生的開始和結束時間。這個表格中的每一列都代表單一事件。一次性活動 執行個體與事件會具有一對一的對應關係。如果是週期性活動,多個資料列 自動產生相應於該事件的多次發生。CalendarContract.Attendees
資料表會儲存活動參與者或嘉賓的資訊。每一列都代表活動的單一嘉賓。它會指定 的人是對事件的回應。- 「
CalendarContract.Reminders
」表格會保留快訊/通知資料。 每一列都代表一次事件的一則快訊。一個活動可以有多個提醒。開啟 每個活動的提醒是在MAX_REMINDERS
中指定,由同步轉換介面設定, 為指定日曆的擁有者。系統會根據活動提醒的分鐘數指定提醒時間 排程並指定鬧鐘方式,例如使用快訊、電子郵件或 SMS 設定提醒 使用者。 CalendarContract.ExtendedProperties
資料表包含不透明資料欄位 才能使用同步處理功能提供者不對這個表格中的項目採取行動,除非要刪除資料表 刪除。
如要透過日曆提供者存取使用者的日曆資料,應用程式必須要求 READ_CALENDAR
權限 (讀取存取權) 和 WRITE_CALENDAR
(寫入存取權)。
事件意圖
如果您只想將活動新增至使用者的日曆,可以使用 ACTION_INSERT
意圖,搭配 Events.CONTENT_URI
定義的資料,在日曆應用程式中啟動活動,以便建立新的活動。使用意圖不需要任何權限,您可以使用下列額外項目指定事件詳細資料:
Events.TITLE
:事件名稱CalendarContract.EXTRA_EVENT_BEGIN_TIME
:事件開始時間,以紀元後的毫秒為單位CalendarContract.EXTRA_EVENT_END_TIME
:事件 從 Epoch 紀元時間起算的結束時間 (以毫秒為單位)Events.EVENT_LOCATION
: 活動地點Events.DESCRIPTION
:事件 說明Intent.EXTRA_EMAIL
:這類對象的電子郵件地址 邀請Events.RRULE
:事件的重複規則Events.ACCESS_LEVEL
:活動是私人活動還是公開活動Events.AVAILABILITY
:這項活動的時間範圍是否允許同時安排其他活動
語音留言提供者
新的語音信箱供應器可讓應用程式將語音留言新增至裝置,以便在單一視覺呈現方式中顯示使用者的所有語音留言。舉例來說,使用者可能會有多個語音信箱來源,例如手機服務供應商提供的語音信箱,以及 VoIP 或其他替代語音服務提供的語音信箱。這些應用程式可以使用 Voicemail Provider API,為裝置新增語音留言。 內建的「電話」應用程式會將所有語音留言以整合簡報呈現給使用者。 雖然系統的電話應用程式是唯一可讀取所有語音留言的應用程式,但每個提供語音留言的應用程式都能讀取其已新增至系統的語音留言 (但無法讀取其他服務的語音留言)。
由於 API 目前不允許第三方應用程式讀取來自 系統,只有具備語音信箱的第三方應用程式才應該使用語音信箱 API 要提供給使用者
VoicemailContract
類別會定義
語音信箱供應商。子類別 VoicemailContract.Voicemails
和 VoicemailContract.Status
提供資料表,應用程式可在其中插入語音信箱資料,以便儲存在裝置上。如需語音留言供應商應用程式的範例,請參閱
語音信箱供應商
示範
多媒體
Android 4.0 為與相片、影片和音樂等媒體互動的應用程式新增了幾個 API。
媒體效果
你可以使用新的媒體特效架構,為圖片加上各種視覺效果 影片。舉例來說,圖片效果 可讓您輕鬆修復紅眼、將圖片轉成灰階 調整亮度、調整飽和度、旋轉圖片、套用魚眼效果等。系統會在 GPU 上執行所有效果處理作業,以獲得最佳效能。
為達到最佳效能,效果會直接套用至 OpenGL 材質圖片,因此應用程式必須具備有效的 OpenGL 內容,才能使用效果 API。您套用特效的紋理可以來自位圖、影片,甚至是相機。不過,紋理必須符合以下限制:
- 這些範圍必須繫結至
GL_TEXTURE_2D
紋理圖片 - 當中必須包含至少一個 mipmap 層級
Effect
物件定義可套用的單一媒體特效
產生圖片建立 Effect
的基本工作流程如下:
- 從 OpenGL ES 2.0 情境呼叫
EffectContext.createWithCurrentGlContext()
。 - 請使用傳回的
EffectContext
呼叫EffectContext.getFactory()
,以傳回例項 (共EffectFactory
個)。 - 呼叫
createEffect()
,並向其傳遞 來自 @link android.media.effect.EffectFactory} 的效果名稱,例如EFFECT_FISHEYE
或EFFECT_VIGNETTE
。
您可以呼叫 setParameter()
並傳遞參數名稱和參數值,藉此調整效果的參數。每種效果都接受
不同參數,一起記錄為「效果名稱」舉例來說,EFFECT_FISHEYE
有一個參數適用於scale
扭曲失真
如要對紋理套用效果,請在紋理上呼叫 apply()
Effect
並傳入輸入紋理、寬度和高度,以及輸出內容
生成的圖片輸入紋理必須繫結至 GL_TEXTURE_2D
紋理圖片 (通常是透過呼叫 glTexImage2D()
函式完成)。您可以提供多個 mipmap 層級。如果輸出紋理未繫結至紋理圖片,效果會自動將其繫結為 GL_TEXTURE_2D
,並使用一個 mipmap 層級 (0),其大小會與輸入內容相同。
我們保證支援EffectFactory
中列出的所有效果。
不過,並非所有裝置都支援外部程式庫提供的某些額外效果,因此您必須先檢查呼叫 isEffectSupported()
時,外部程式庫是否支援所需效果。
遙控器用戶端
新的 RemoteControlClient
可讓媒體播放器啟用遠端控制用戶端 (例如裝置螢幕鎖定畫面) 的播放控制項。媒體播放器也可以公開目前播放媒體的資訊,以便在遙控器上顯示,例如曲目資訊和專輯封面。
如要為媒體播放器啟用遠端控制用戶端,請將 RemoteControlClient
及其建構函式執行個體化,然後向此函式傳遞廣播 ACTION_MEDIA_BUTTON
的 PendingIntent
。意圖也必須在應用程式中宣告明確的 BroadcastReceiver
元件,以便處理 ACTION_MEDIA_BUTTON
事件。
如要宣告播放器可處理的媒體控制項輸入項目,您必須在您的遊戲上呼叫 setTransportControlFlags()
RemoteControlClient
,傳遞一組 FLAG_KEY_MEDIA_*
旗標,例如
FLAG_KEY_MEDIA_PREVIOUS
和FLAG_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()
來啟動攝影機介面,並開始偵測臉孔。
當系統在相機場景中偵測到一或多個臉孔時,就會呼叫您回呼中的 onFaceDetection()
回呼,
實作 Camera.FaceDetectionListener
,包括
Camera.Face
物件。
Camera.Face
類別的執行個體會提供
所偵測到的臉孔,包括:
注意:臉部偵測功能可能不支援某些類型的手機
因此,請務必呼叫 getMaxNumDetectedFaces()
以確認裝置是否退回
大於零的值此外,某些裝置可能無法辨識眼睛和嘴巴
在這種情況下,Camera.Face
物件中的這些欄位會是空值。
對焦和測光區域
相機應用程式現在可以控制相機對焦與測光區域
餘額
具備自動曝光功能這兩項功能都會使用新的 Camera.Area
類別來指定
攝影機目前檢視畫面的聚焦區域或計量付費範圍。Camera.Area
類別的例項會使用 Rect
定義區域的邊界,並使用整數定義區域的重量,代表該區域相對於其他考量區域的重要性。
設定焦點區域或計量區域前,請先分別呼叫 getMaxNumFocusAreas()
或 getMaxNumMeteringAreas()
。如果這些函式傳回 0,
裝置不支援對應的功能。
如要指定要使用的聚焦或計量區域,只要呼叫 setFocusAreas()
或 setMeteringAreas()
即可。每個取樣都會取得 Camera.Area
物件的 List
,用於指出應考慮對焦或測光的區域。舉例來說,您可以實作一項功能,讓使用者輕觸預覽畫面中的某個區域,藉此設定焦點區域,然後將該區域轉譯為 Camera.Area
物件,並要求相機將焦點放在該場景區域。當該區域的場景變更時,該區域的焦點或曝光值會持續更新。
持續自動對焦相片
你現在可以在拍照時啟用連續自動對焦 (CAF)。如要在
相機應用程式,請傳遞 FOCUS_MODE_CONTINUOUS_PICTURE
至 setFocusMode()
。準備拍攝時
相片,呼叫 autoFocus()
。您的 Camera.AutoFocusCallback
會立即收到回呼,指出是否已取得焦點。如要在收到回呼後恢復 CAF,您必須呼叫 cancelAutoFocus()
。
注意:拍照時也支援連續自動對焦
影片,使用 FOCUS_MODE_CONTINUOUS_VIDEO
,也就是
已在 API 級別 9 中新增。
其他相機功能
- 錄影時,您現在可以呼叫
takePicture()
來儲存相片,而不會中斷錄影工作階段。使用註解之前 請呼叫isVideoSnapshotSupported()
確認硬體 但 AI 會支援該執行緒。 - 你現在可以使用
setAutoExposureLock()
和setAutoWhiteBalanceLock()
鎖定自動曝光和白平衡功能, 這些屬性就不會變更 - 現在可以在相機預覽執行期間呼叫
setDisplayOrientation()
。您之前可以將其命名為 ,但您現在可以隨時變更方向。
攝影機廣播意圖
Camera.ACTION_NEW_PICTURE
:表示使用者已拍攝新相片。內建的相機應用程式會在拍攝相片後叫用這項廣播,第三方相機應用程式在拍攝相片後也應廣播這項意圖。Camera.ACTION_NEW_VIDEO
: 表示使用者已拍攝新影片。內建的「相機」應用程式會叫用這個 API 但第三方相機應用程式也應在影片錄製後播送 拍攝影片後
Android Beam (使用 NFC 的 NDEF 推送)
Android Beam 是全新的 NFC 功能,可讓您在裝置之間傳送 NDEF 訊息 (這項程序也稱為「NDEF 推送」)。當兩部支援 Android Beam 的 Android 裝置靠近 (約 4 公分),通常是背面相碰時,就會啟動資料傳輸。NDEF 訊息中的資料可以包含任何你想分享的資料 能在裝置間切換舉例來說,People 應用程式會分享聯絡人、YouTube 會分享影片,而瀏覽器會使用 Android Beam 分享網址。
如要使用 Android Beam 在裝置之間傳輸資料,您需要建立 NdefMessage
,其中包含活動當下要分享的資訊
前景接著,您必須透過下列其中一種方式,將 NdefMessage
傳遞至系統:
- 定義一個
NdefMessage
,以便在活動中推送:隨時呼叫
setNdefPushMessage()
即可設定 你要傳送的訊息。舉例來說,您可以呼叫此方法,並在活動的onCreate()
期間傳遞NdefMessage
方法。此後,當活動期間透過其他裝置啟用 Android Beam 時, 前景,系統會傳送NdefMessage
到另一部裝置。 - 定義
NdefMessage
,以便在 Android Beam 啟動時推送:實作
NfcAdapter.CreateNdefMessageCallback
,其中createNdefMessage()
方法的實作項目會傳回您要傳送的NdefMessage
。然後將NfcAdapter.CreateNdefMessageCallback
實作傳遞至setNdefPushMessageCallback()
。在此情況下,當您的活動處於上線狀態時,在其他裝置上啟用 Android Beam 時 前景,系統會呼叫
createNdefMessage()
以擷取 要傳送的NdefMessage
。如此一來,您可以定義NdefMessage
,以便在 Android Beam 啟動後僅提供,以便在內容中使用 訊息可能會在活動進行期間不斷變化。
如果您想在系統成功將 NDEF 訊息傳送至其他裝置後執行特定程式碼,可以實作 NfcAdapter.OnNdefPushCompleteCallback
,並使用 setNdefPushCompleteCallback()
進行設定。系統會在訊息傳送後呼叫 onNdefPushComplete()
。
在接收裝置上,系統會分派 NDEF Push 訊息與一般 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 Beam 透過另一部 Android 裝置叫用時,另一部裝置會收到 NDEF 訊息,其中包含可識別應用程式的 Android 應用程式記錄。如果接收裝置已安裝應用程式,系統會啟動該應用程式;如果未安裝,系統會開啟 Google Play,並引導使用者前往安裝應用程式。
如要進一步瞭解 Android Beam 和其他 NFC 功能,請參閱「NFC 基礎知識」開發人員指南。如需使用 Android Beam 的程式碼範例,請參閱 Android Beam 示範。
Wi-Fi P2P
Android 現已支援 Android 裝置與其他裝置類型 (符合 Wi-Fi Alliance 的 Wi-Fi Direct™ 認證計畫) 之間的 Wi-Fi 點對點 (P2P) 連線,無須透過無線基地台或網際網路連線。Android 架構提供一組 Wi-Fi P2P API,可讓您在每部裝置都支援 Wi-Fi P2P 的情況下,探索及連線至其他裝置,然後透過快速連線進行通訊,且距離遠遠超過藍牙連線。
新的套件 android.net.wifi.p2p
包含所有用於執行 Wi-Fi 點對點連線的 API。您需要處理的主要類別是 WifiP2pManager
,只要呼叫 getSystemService(WIFI_P2P_SERVICE)
即可取得。WifiP2pManager
中的 API 可讓您:
- 呼叫
initialize()
來啟動應用程式,以便建立 P2P 連線 - 撥打
discoverPeers()
探索附近的裝置 - 呼叫
connect()
即可建立 P2P 連線 - 其他
您也需要使用其他幾個介面和類別,例如:
WifiP2pManager.ActionListener
介面可讓您接收 當作業成功或失敗時,例如探索對等點或連線至對等點時回呼。WifiP2pManager.PeerListListener
介面可讓您接收 找到的同類應用程式/服務資訊回呼提供WifiP2pDeviceList
,您可從中擷取範圍內的每部裝置WifiP2pDevice
物件,並取得以下資訊: 裝置名稱、位址、裝置類型、裝置支援的 WPS 設定等等。WifiP2pManager.GroupInfoListener
介面可讓您接收 P2P 群組相關資訊。回呼會提供WifiP2pGroup
物件,該物件會提供群組資訊,例如擁有者、網路名稱和密碼短語。WifiP2pManager.ConnectionInfoListener
介面可讓您 接收目前連線的相關資訊。回呼提供WifiP2pInfo
物件,其中包含群組是否已 成員身分和擁有者
如要使用 Wi-Fi P2P API,應用程式必須要求下列使用者權限:
ACCESS_WIFI_STATE
CHANGE_WIFI_STATE
INTERNET
(雖然應用程式在技術上不會連上網際網路,但使用標準 Java 套接字與 Wi-Fi P2P 同端通訊需要網際網路權限)。
Android 系統也會在特定 Wi-Fi P2P 事件期間廣播多種不同的動作:
WIFI_P2P_CONNECTION_CHANGED_ACTION
:P2P 連線狀態已變更。這會包含具有WifiP2pInfo
物件的EXTRA_WIFI_P2P_INFO
,以及包含NetworkInfo
的EXTRA_NETWORK_INFO
物件。WIFI_P2P_STATE_CHANGED_ACTION
:P2P 狀態已從啟用變更為停用。包含EXTRA_WIFI_STATE
和WIFI_P2P_STATE_DISABLED
或WIFI_P2P_STATE_ENABLED
WIFI_P2P_PEERS_CHANGED_ACTION
:已變更對等裝置清單。WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
:詳細資料 這部裝置已變更。
詳情請參閱 WifiP2pManager
說明文件。其他
請查看
Wi-Fi P2P 示範
範例應用程式。
藍牙健康裝置
Android 現已支援藍牙健康設定檔裝置,因此您可以建立應用程式,透過藍牙與支援藍牙的健康裝置 (例如心率監測器、血糖機、溫度計和體重計) 通訊。
與一般耳機和 A2DP 設定檔裝置類似,必須使用 BluetoothProfile.ServiceListener
和 HEALTH
設定檔類型呼叫 getProfileProxy()
,才能與設定檔建立連線
Proxy 物件
取得健康設定檔 Proxy (BluetoothHealth
物件) 後,連線至已配對的健康裝置並與其通訊時,會涉及下列新的藍牙類別:
BluetoothHealthCallback
:您必須擴充這個類別並實作 回呼方法,用於接收應用程式註冊狀態變更的更新,以及 藍牙頻道狀態。BluetoothHealthAppConfiguration
:在呼叫BluetoothHealthCallback
期間,您會收到該物件的例項, 提供可用藍牙健康裝置的設定資訊,您必須使用該裝置 執行各種作業,例如透過BluetoothHealth
API 啟動和終止連線。
如要進一步瞭解如何使用藍牙健康設定檔,請參閱 BluetoothHealth
的說明文件。
無障礙設定
Android 4.0 為視障使用者提供更豐富的無障礙體驗 和擴充 API 開發進階無障礙服務
「輕觸探索」模式
視障人士現在可透過輕觸及拖曳手指的方式,
畫面,聆聽內容的語音說明。由於探索式觸控模式的運作方式類似於虛擬游標,因此螢幕閱讀器可透過與使用者使用方向鍵或軌跡球瀏覽時相同的方式,識別描述性文字,也就是在模擬的「懸停」事件上讀取 android:contentDescription
和 setContentDescription()
提供的資訊。因此,請記得為應用程式中的檢視畫面提供說明文字,尤其是 ImageButton
、EditText
、ImageView
和其他可能不含說明文字的小工具。
View 無障礙功能
如要強化無障礙服務 (例如螢幕閱讀器) 可用的資訊,您可以在自訂 View
元件中,為無障礙功能事件實作新的回呼方法。
請先注意,Android 4.0 已變更 sendAccessibilityEvent()
方法的行為。與先前版本的 Android 相同,當使用者在裝置上啟用無障礙服務,且發生點擊或懸停等輸入事件時,系統會透過呼叫 sendAccessibilityEvent()
通知相應檢視畫面。先前,
sendAccessibilityEvent()
的實作會
初始化 AccessibilityEvent
並傳送至 AccessibilityManager
。新行為涉及一些額外的回呼方法,可讓檢視區塊及其父項為事件新增更多背景資訊:
- 叫用時,
sendAccessibilityEvent()
和sendAccessibilityEventUnchecked()
方法會延後 至onInitializeAccessibilityEvent()
。View
的自訂實作可能想要導入onInitializeAccessibilityEvent()
,以便: 將其他無障礙資訊附加至AccessibilityEvent
,但也應呼叫上層實作項目, 提供標準內容說明、項目索引等預設資訊。 不過,請勿在此回呼中加入其他文字內容, 下一步。 - 初始化後,如果事件是其中一種類型,應填入文字
資訊,檢視區塊接著會收到對
dispatchPopulateAccessibilityEvent()
的呼叫, 遵從onPopulateAccessibilityEvent()
回呼。View
的自訂實作通常應實作onPopulateAccessibilityEvent()
以新增其他 將文字內容傳送到AccessibilityEvent
(如果缺少android:contentDescription
文字,或是 不足。如要為AccessibilityEvent
新增更多文字說明,請呼叫getText()
。add()
。 - 此時,
View
會在父項檢視區塊上呼叫requestSendAccessibilityEvent()
,將事件傳遞至檢視區塊階層。接著,每個上層檢視區塊都有機會透過新增AccessibilityRecord
來擴充無障礙功能資訊,直到最終到達根檢視區塊為止,該區塊會透過sendAccessibilityEvent()
將事件傳送至AccessibilityManager
。
除了上述可用於擴充 View
類別的新方法之外,您也可以擴充 AccessibilityDelegate
,並使用 setAccessibilityDelegate()
在檢視畫面上設定,藉此攔截任何 View
上的這些事件回呼。進行這項操作時,檢視畫面中的每個無障礙方法都會將呼叫延後至以下項目中相對應的方法:
委派內容。舉例來說,當檢視區塊收到對 onPopulateAccessibilityEvent()
的呼叫時,就會傳遞給
使用 View.AccessibilityDelegate
建立相同方法任何未由
代表預設行為會將委派項目傳回檢視畫面。這樣一來,您就能只覆寫任何指定檢視畫面所需的方法,而無須擴充 View
類別。
如要維持與 Android 4.0 以下版本的相容性,同時支援 全新的無障礙功能 API 可透過最新版的 v4 支援 程式庫 (位於 Compatibility Package, r4) 使用一組公用程式類別,以回溯相容的方式提供新的無障礙功能 API 設計。
無障礙服務
如果您開發無障礙服務,請提供各種無障礙事件的相關資訊 目前已大幅擴充系統,為使用者提供更進階的無障礙意見回饋。具體來說,事件會根據檢視區塊組合產生,提供更完善的背景資訊,並允許無障礙服務遍歷檢視區塊階層,取得其他檢視資訊並處理特殊情況。
如果您要開發無障礙服務 (例如螢幕閱讀器),可以 並請按照以下程序,執行額外的內容資訊及掃遍檢視區塊階層:
- 收到應用程式傳送的
AccessibilityEvent
後,請呼叫AccessibilityEvent.getRecord()
來擷取特定AccessibilityRecord
(事件可能會附加多個記錄)。 - 在
AccessibilityEvent
或個別AccessibilityRecord
中,您可以呼叫getSource()
來擷取AccessibilityNodeInfo
物件。AccessibilityNodeInfo
代表視窗內容的單一節點,格式可讓您查詢該節點的無障礙資訊。從AccessibilityEvent
傳回的AccessibilityNodeInfo
物件會描述事件來源,而AccessibilityRecord
的來源會描述事件來源的前身。 - 使用
AccessibilityNodeInfo
即可查詢資訊 則可呼叫getParent()
或getChild()
來掃遍檢視畫面 甚至是在節點中加入子檢視畫面
為了讓您的應用程式以無障礙服務的形式發布到系統,
必須宣告與 AccessibilityServiceInfo
對應的 XML 設定檔。如要進一步瞭解如何建立
無障礙服務,請參閱 AccessibilityService
和 SERVICE_META_DATA
以瞭解 XML 設定的相關資訊。
其他無障礙功能 API
如要瞭解裝置的無障礙狀態,AccessibilityManager
有一些新的 API,例如:
AccessibilityManager.AccessibilityStateChangeListener
是一種介面,可讓您在啟用無障礙功能的情況下, 已停用。getEnabledAccessibilityServiceList()
會提供目前已啟用的無障礙服務相關資訊。isTouchExplorationEnabled()
分享 會顯示是否啟用觸控探索模式。
拼字檢查服務
新的拼字檢查器架構可讓應用程式以類似輸入法架構 (適用於 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()
方法已淘汰,您現在可以使用新的 TextToSpeech
建構函式指定要使用的引擎,該函式可接受 TTS 引擎的套件名稱。
您也可以使用 getEngines()
查詢可用的 TTS 引擎。這個方法會傳回 TextToSpeech.EngineInfo
物件清單,其中包含引擎的圖示、標籤和套件名稱等中繼資料。
建構文字轉語音引擎
先前,自訂引擎必須使用未記錄的本機標頭檔案建構引擎。在 Android 4.0 中,您可以使用完整的架構 API 來建構 TTS 引擎。
基本設定需要實作 TextToSpeechService
回應 INTENT_ACTION_TTS_SERVICE
意圖。TTS 引擎的主要工作會在擴充 TextToSpeechService
的服務中,於 onSynthesizeText()
回呼期間發生。系統會為此方法提供兩個物件:
SynthesisRequest
:這項資料包含各種資料,包括要合成的文字、語言代碼、語速和語調。SynthesisCallback
:這是 TTS 引擎的介面 並以串流音訊的形式傳送結果語音資料。首先,引擎必須呼叫start()
,表示引擎已準備好提供音訊,然後呼叫audioAvailable()
,將位元組緩衝區中的音訊資料傳遞給它。引擎將所有音訊傳送至緩衝區後,請呼叫done()
。
由於架構現在支援用於建立 TTS 引擎的真實 API,因此已移除原生程式碼實作的支援。請查看有關相容性層的網誌文章,瞭解如何將舊版 TTS 引擎轉換為新架構。
如需使用新 API 的 TTS 引擎範例,請參閱 Text To Speech Engine 範例應用程式。
網路使用率
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。
Enterprise
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_TEMPERATURE
:一種溫度感應器, 室溫 (室溫),以攝氏度為單位。TYPE_RELATIVE_HUMIDITY
:濕度感應器,可提供環境 (房間) 相對濕度百分比。
如果裝置同時具備 TYPE_AMBIENT_TEMPERATURE
和 TYPE_RELATIVE_HUMIDITY
感應器,你可以用來計算露點
以及絕對濕度
舊版溫度感應器 TYPE_TEMPERATURE
已淘汰。應使用 TYPE_AMBIENT_TEMPERATURE
感應器
。
此外,Android 的三個綜合感應器也大幅改善,現在的延遲時間更短,輸出也更流暢。這些感應器包括重力感應器 (TYPE_GRAVITY
)、旋轉向量感應器 (TYPE_ROTATION_VECTOR
) 和線性加速度感應器 (TYPE_LINEAR_ACCELERATION
)。改良版感應器會使用陀螺儀感應器改善輸出結果,因此只有搭載陀螺儀的裝置才會顯示這些感應器。
動作列
ActionBar
已更新,以便支援多項新行為。大多數
重要的是,在容器中執行時,系統會妥善管理動作列的大小和設定
能在不同大小的螢幕上提供最佳使用者體驗。例如:
當螢幕較窄 (例如手機方向為直向) 時,動作列的
導覽分頁會顯示在「堆疊列」中顯示在主要動作列正下方你可以
可使用「分割動作列」所有待辦事項都放在底部獨立列中
顯示在畫面上
分割動作列
如果動作列內含多個操作項目,有些操作項目可能不會全部納入
螢幕較窄,因此系統會在溢位選單中放置更多格式。不過,Android 4.0 允許您啟用「分割動作列」,讓更多動作項目顯示在畫面底部的獨立列中。如要啟用分割動作列,請在資訊清單檔案的 <application>
標記或個別 <activity>
標記中,新增 android:uiOptions
和 "splitActionBarWhenNarrow"
。啟用後,系統會在畫面狹窄時,在畫面底部為所有動作項目新增一列 (主要動作列中不會顯示任何動作項目)。
如要使用 ActionBar.Tab
API 提供的導覽分頁,
但不需要在頂端顯示主要動作列 (如果您只想在頂端顯示分頁),然後啟用
按照上述方式控制分割動作列,並呼叫 setDisplayShowHomeEnabled(false)
以停用
應用程式圖示。主操作列中沒有任何項目時,就會消失,只剩下頂端的導覽分頁和畫面底部的操作項目。
動作列樣式
如要將自訂樣式套用至動作列,您可以使用新的樣式屬性 backgroundStacked
和 backgroundSplit
套用背景
堆疊長條圖和分割列的可繪項目或顏色。您也可以使用 setStackedBackgroundDrawable()
和 setSplitBackgroundDrawable()
在執行階段設定這些樣式。
動作提供者
新的 ActionProvider
類別可讓您建立
待辦事項動作供應程式可定義動作檢視畫面、預設動作行為和子選單
。當您要建立
動態行為 (例如變數動作檢視畫面、預設動作或子選單) 是擴充 ActionProvider
的理想解決方案,目的是建立可重複使用的元件
在片段或活動中處理各種操作項目轉換。
舉例來說,ShareActionProvider
是 ActionProvider
的擴充功能,可在動作列中提供「分享」動作。您可以使用這個動作提供者,呈現動作檢視畫面,其中包含處理 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
檢視畫面的例項,或是在子項上設定相關邊界參數,來指定子項之間的間距。
請參閱 ApiDemos
以取得使用 GridLayout
的範例。
TextureView
TextureView
是全新的檢視畫面,可用來顯示內容串流,例如
視為影片或 OpenGL 場景雖然與 SurfaceView
類似,但 TextureView
的獨特之處在於其行為與一般檢視畫面類似,而非建立
獨立視窗,因此您可以將其視為任何其他 View
物件。舉例來說,您可以套用轉換、使用 ViewPropertyAnimator
製作動畫,或使用 setAlpha()
調整不透明度。
請注意,TextureView
只能在硬體加速視窗中運作。
詳情請參閱 TextureView
說明文件。
切換小工具
新的 Switch
小工具是雙狀態切換鈕,可讓使用者拖曳至任一狀態
另一種狀態 (或者輕觸) 便可在兩個狀態之間切換。
您可以使用 android:textOn
和 android:textOff
屬性來指定文字
。android:text
屬性還可讓您在切換按鈕旁邊放置標籤。
如需使用切換鈕的範例,請參閱 switches.xml 版面配置檔案和相應的 Switches 活動。
彈出式選單
Android 3.0 導入了 PopupMenu
,可建立彈出的簡易內容選單
放在您指定的錨點 (通常位於所選項目的點)。Android 4.0 擴充套件
PopupMenu
具有一些實用功能:
- 您現在可以使用
inflate()
,輕鬆加載 XML 選單資源中的彈出式選單內容,並傳遞選單資源 ID。 - 現在,您還可以建立
PopupMenu.OnDismissListener
,用來接收 。
偏好設定
新的 TwoStatePreference
抽象類別可做為偏好設定的基礎,提供兩種狀態的選項。新的 SwitchPreference
是 TwoStatePreference
的擴充功能,可在偏好設定檢視畫面中提供 Switch
小工具,讓使用者不必開啟額外的偏好設定畫面或對話方塊,即可開啟或關閉設定。舉例來說,設定應用程式會使用 SwitchPreference
來設定 Wi-Fi 和藍牙。
系統主題
所有指定 Android 4.0 應用程式的預設主題 (透過設定 targetSdkVersion
或
minSdkVersion
變更為
“14"
以上版本) 此時已是
「裝置預設值」主題:Theme.DeviceDefault
。可能是
深色 Holo 主題或由特定裝置定義的其他深色主題。
Theme.Holo
主題系列保證不會變更
執行同一版本的 Android 時,將應用程式保持在最佳狀態如果您明確將任何 Theme.Holo
主題套用至活動,請放心,這些主題不會在相同平台版本的不同裝置上變更字元。
如果您希望應用程式與整體裝置主題融為一體 (例如使用不同的原始設備製造商 (OEM) 時)
為系統提供不同的預設主題),您必須明確套用 Theme.DeviceDefault
系列的主題。
選項選單按鈕
從 Android 4.0 開始,您會發現手機不再需要「選單」硬體按鈕。但是,如果現有的應用程式提供選項選單,且預期會出現 選單按鈕。為確保現有應用程式可繼續正常運作,系統會為舊版 Android 應用程式提供螢幕上的「選單」按鈕。
為提供最佳使用者體驗,全新和更新後的應用程式應改用 ActionBar
來提供選單項目的存取權,並將 targetSdkVersion
設為
"14"
,以利用最新的架構預設行為。
系統 UI 顯示設定的控制項
自 Android 初期以來,系統就管理著一個稱為狀態列的 UI 元件,該元件位於手機頂端,用於顯示電信業者訊號、時間、通知等資訊。Android 3.0 為平板電腦裝置新增了系統資訊列,位於螢幕底部,提供系統導覽控制項 (Home、返回等),以及傳統上由狀態列提供的元素介面。於 在 Android 4.0 版本中,系統提供了稱為導覽列的新型系統 UI。您可以將導覽列視為專為手機設計的系統列重新調整版本,為沒有用於瀏覽系統的硬體對應項目的裝置提供導覽控制項,但會省略系統列的通知 UI 和設定控制項。因此,提供導覽的裝置 此外,頂端也會顯示狀態列
不過,在這之前,您可以使用 FLAG_FULLSCREEN
標記隱藏手機的狀態列。在 Android 4.0 中
系統資訊列的顯示設定已更新,能更準確地反映系統資訊列的行為
和導覽列:
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
,以便在系統列或導覽列的顯示設定變更時收到通知。
請參閱 OverscanActivity 類別。
輸入架構
Android 4.0 開始支援遊標懸停事件,以及新的觸控筆和滑鼠按鈕事件。
懸停事件
View
類別現在支援「懸停」事件,可透過使用指標裝置 (例如滑鼠或其他驅動螢幕上游標的裝置) 提供更豐富的互動體驗。
如要在檢視區塊上接收懸停事件,請實作 View.OnHoverListener
,並使用 setOnHoverListener()
註冊。懸停時
事件發生時,事件監聽器會收到對 onHover()
的呼叫,並提供 View
收到事件,以及用於描述懸停事件類型的 MotionEvent
。懸停事件可以是下列任一種:
如果 View.OnHoverListener
處理懸停事件,應從 onHover()
傳回 true。如果您的
事件監聽器傳回 false,然後懸停事件就會照常分派到父項檢視畫面。
如果您的應用程式使用了會變更外觀的按鈕或其他小工具
您現在可以在狀態清單可繪項目中使用 android:state_hovered
屬性,
當遊標懸停在檢視區塊上時,會提供不同的背景可繪項目。
如需最新懸停事件的相關示範,請參閱下文中的「懸停」類別: ApiDemos。
觸控筆和滑鼠按鈕事件
Android 現在提供 API,可從觸控筆輸入裝置 (例如數位工具) 接收輸入內容 平板電腦週邊裝置或支援觸控筆的觸控螢幕。
觸控筆輸入的運作方式與觸控或滑鼠輸入類似。觸控筆接觸時 應用程式接收觸控事件,就像使用手指 輕觸螢幕。當觸控筆懸停在數位工具上方時,應用程式會收到懸停動作 事件,就像在沒有按鈕的情況下將滑鼠遊標移動到螢幕上時一樣 按下按鈕。
應用程式可以使用 getToolType()
查詢 MotionEvent
中與每個指標相關聯的「工具類型」,藉此區分手指、滑鼠、觸控筆和橡皮擦的輸入內容。目前定義的工具類型為:TOOL_TYPE_UNKNOWN
、TOOL_TYPE_FINGER
、TOOL_TYPE_MOUSE
、TOOL_TYPE_STYLUS
和 TOOL_TYPE_ERASER
。透過查詢工具類型,應用程式可以選擇以不同方式處理手指或滑鼠輸入的觸控筆輸入內容。
應用程式也可以使用 getButtonState()
查詢 MotionEvent
的「按鈕狀態」,藉此查詢哪些滑鼠或觸控筆按鈕已按下。目前定義的按鈕狀態為:BUTTON_PRIMARY
、BUTTON_SECONDARY
、BUTTON_TERTIARY
、BUTTON_BACK
和 BUTTON_FORWARD
。為方便使用者,系統會自動將滑鼠的「前」和「後」按鈕對應至 KEYCODE_BACK
和 KEYCODE_FORWARD
鍵。應用程式可處理這些按鍵,支援以滑鼠按鈕為基礎的向前和向後導覽功能。
除了能準確測量聯絡人的位置和壓力外,還可以使用觸控筆輸入
此外,裝置還會回報觸控筆尖與數位化工具 (觸控筆傾斜角度) 之間的距離
以及觸控筆的螢幕方向應用程式可以使用 getAxisValue()
搭配軸代碼 AXIS_DISTANCE
、AXIS_TILT
和 AXIS_ORIENTATION
查詢這項資訊。
如需工具類型、按鈕狀態和新軸向程式碼的示範,請參閱 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
類別宣告 Property
Foo
類別的物件 BAR
,讓您可以在以下例項的 foo
執行個體上設定欄位:
Foo
類別,如下所示:
Kotlin
BAR.set(foo, value)
Java
BAR.set(foo, value);
View
類別現在會利用 Property
類別來
您可以設定各種欄位,例如在 Android 3.0 中新增的轉換屬性 (ROTATION
、ROTATION_X
、TRANSLATION_X
等)。
ObjectAnimator
類別也會使用 Property
類別,因此您可以使用 Property
建立 ObjectAnimator
,比字串型更快、更有效率且更安全
。
硬體加速
從 Android 4.0 開始,如果應用程式將 targetSdkVersion
或 minSdkVersion
設為 “14"
以上,則系統會預設啟用所有視窗的硬體加速功能。硬體加速功能通常可以使動畫更流暢
進而提高整體效能並回應使用者互動
如有需要,您可以針對個別 <activity>
元素或 <application>
元素,使用 hardwareAccelerated
屬性手動停用硬體加速功能。您也可以呼叫 setLayerType(LAYER_TYPE_SOFTWARE)
,為個別檢視畫面停用硬體加速。
如要進一步瞭解硬體加速功能,包括不支援的繪圖作業清單,請參閱「硬體加速」說明文件。
JNI 變更
在先前的 Android 版本中,JNI 本機參照並非間接控制;使用的 Android 裝置 直接指標。只要垃圾收集器沒有移動物體,則不會出現問題 這個程式碼似乎可以正常運作,是因為系統可以編寫錯誤的程式碼。在 Android 4.0 中,系統現在會使用間接參照來偵測這些錯誤。
如要進一步瞭解 JNI 本機參照的細節,請參閱「JNI 提示」中的「本機和全域參照」。在 Android 4.0 中, 系統已強化 CheckJNI,以便偵測這些錯誤。請留意 Android 開發人員網誌,我們將在近期發布一篇文章,說明 JNI 參照的常見錯誤及其修正方式。
這項變更僅會影響以 Android 4.0 為目標版本的應用程式,方法是將
targetSdkVersion
或 minSdkVersion
變更為 “14"
以上版本。如果您已將這些屬性設為任何較低的值
則 JNI 本機參照的運作方式與先前版本相同。
WebKit
- WebKit 已更新至 534.30 版
- 支援印度文字型 (梵文字母、孟加拉文和泰米爾文,且支援複雜的字元)
使用
WebView
和內建瀏覽器時必須結合字符 - 在
WebView
和內建瀏覽器中支援衣索比亞文、喬治亞文和亞美尼亞文 - 支援 WebDriver 製造
更輕鬆地測試使用
WebView
的應用程式
Android 瀏覽器
瀏覽器應用程式會新增下列功能,以支援網頁應用程式:
- 已更新 V8 JavaScript 編譯器,提升執行效能
- 以及其他從 Android 裝置轉移的著名強化功能
3.0 手機現已支援:
- 支援所有網頁上的固定位置元素
- HTML 媒體擷取功能
- 裝置螢幕方向 事件
- CSS 3D 轉換
權限
以下是新權限:
ADD_VOICEMAIL
:允許語音信箱服務新增語音留言 訊息傳送到裝置。BIND_TEXT_SERVICE
:實作SpellCheckerService
的服務本身必須具備這項權限。BIND_VPN_SERVICE
:實作VpnService
的服務必須為自身要求此權限。- android.Manifest.permission#READ_PROFILE:提供
ContactsContract.Profile
供應器的讀取權限。 - android.Manifest.permission#WRITE_PROFILE:提供
ContactsContract.Profile
供應器的寫入權限。
裝置功能
以下是新裝置功能:
FEATURE_WIFI_DIRECT
:宣告應用程式 用途 用於點對點通訊的 Wi-Fi。
如需 Android 4.0 (API 級別 14) 中所有 API 異動內容的詳細資訊,請參閱 API 差異報告。
舊版 API
除了上述所有內容之外,Android 4.0 自然也支援先前版本的所有 API。由於 Android 3.x 平台僅適用於大螢幕裝置,因此如果您主要開發的是手機,可能就不會知道 Android 在近期版本中新增的所有 API。
我們整理出幾項您可能沒注意到的知名 API,歡迎參考。 設定方式如下:
- Android 3.0
-
Fragment
:一種架構元件,可讓您區分 將活動的元素放入獨立模組,定義自己的 UI 和生命週期。請參閱「Fragments」開發人員指南。ActionBar
:取代活動視窗頂端的傳統標題列。「小工具」左上角包含應用程式標誌,並提供新的 選單項目介面。請參閱 Action Bar 開發人員指南。Loader
:協助非同步作業的架構元件 載入資料與 UI 元件,以便在不封鎖 主執行緒。詳情請參閱 載入器開發人員指南。- 系統剪貼簿:應用程式可將資料 (不限於文字) 複製及貼上至系統級別的剪貼簿,反之亦然。剪報資料可以是純文字、URI 或意圖。請參閱「複製和貼上」開發人員指南。
- 拖曳:這是一組內建於檢視區塊架構中的 API,可協助執行拖曳作業。詳情請參閱 開發人員指南「拖曳」。
- 全新的彈性動畫架構可讓您為任何物件 (View、Drawable、Fragment、Object 或其他物件) 的任意屬性建立動畫,並定義動畫的各個層面,例如時間長度、插補、重複等。新架構造就 Android 中的動畫 比以往更加容易請參閱屬性動畫開發人員指南。
- RenderScript 圖形和運算引擎:RenderScript 可在原生層級提供高效能 3D 圖形算繪和運算 API,您可使用 C (C99 標準) 編寫這些 API,以便在原生環境中獲得預期的效能,同時在各種 CPU 和 GPU 之間保持可攜性。請參閱 RenderScript 開發人員指南。
- 硬體加速 2D 圖形:您現在可以為
應用程式,方法是在資訊清單元素的
<application>
中設定 {android:hardwareAccelerated="true"} 元素或個別<activity>
元素。如此一來 讓動畫更流暢、更流暢地捲動畫面,整體效能以及使用者反應更佳 互動。注意:如果將應用程式的
minSdkVersion
或targetSdkVersion
設為"14"
以上版本,系統預設會啟用硬體加速功能。 - 還有許多其他福利等您發掘。請參閱 Android 3.0 平台 附註
- Android 3.1
-
- USB API:強大的全新 API,可將已連結的周邊裝置與 Android 應用程式整合。API 是以下列 ,包括支援 USB 主機和裝置互動。請參閱 USB 主機和配件開發人員指南。
- MTP/PTP API:應用程式可直接與已連結的相機和其他 PTP 裝置互動,以便在裝置連結和移除時接收通知、管理這些裝置上的檔案和儲存空間,以及傳送及接收檔案和中繼資料。MTP API 會執行 PTP
(影像傳輸通訊協定) 的 MTP (媒體傳輸通訊協定) 規格的一部分。請參閱
android.mtp
說明文件。 - RTP API:Android 會將 API 公開給內建的 RTP (即時傳輸通訊協定) 堆疊,應用程式可使用這項 API 管理按需或互動式資料串流。特別是提供 VOIP、按壓通話、會議和音訊串流的應用程式,可以使用 API 啟動工作階段,並透過任何可用的網路傳輸或接收資料串流。請參閱
android.net.rtp
說明文件。 - 支援搖桿和其他一般動作輸入。
- 如需更多新 API 的資訊,請參閱 Android 3.1 平台的附註。
- Android 3.2
-
- 新的畫面支援 API,讓您進一步控管應用程式 能在不同的螢幕大小上顯示廣告此 API 可擴充現有的螢幕支援模型,讓您根據尺寸 (以密度獨立像素單位 (例如 600dp 或 720dp 寬) 為單位) 精確指定特定螢幕大小範圍,而非以一般化的螢幕大小 (例如 large 或 xlarge) 為單位。例如,這很重要 是為了幫助您 區分 5 吋旁邊為 7 吋該類裝置一般都會歸類為 「大」螢幕。請參閱網誌文章「管理螢幕大小的新工具」。
- 將
<uses-feature>
的新常數至 宣告橫向或直向螢幕螢幕方向規定。 - 裝置的「螢幕大小」設定現在會在螢幕方向變更時變更。如果應用程式指定的目標為 API 級別 13 以上,則如要處理
"orientation"
設定變更,您必須處理"screenSize"
設定變更。詳情請參閱android:configChanges
。 - 如需其他新 API 的相關資訊,請參閱 Android 3.2 平台的附註。
API 級別
Android 4.0 API 會獲派整數 ID (14),儲存在帳戶中。 這個識別碼稱為「API 級別」,可讓系統正確判斷 在安裝應用程式之前,應用程式與系統相容。
如要在應用程式中使用 Android 4.0 中導入的 API,您需要編譯
將應用程式與支援 API 級別 14 或
更高。視您的需求而定,您可能還需要新增
將 android:minSdkVersion="14"
屬性設為
<uses-sdk>
元素。
詳情請參閱「什麼是 API? 關卡?