API Level: 12
開発者は Android SDK のコンポーネントとして Android 3.1 platform をダウンロードできるようになりました。このプラットフォームには Android library と system image, emulator skin などが含まれていますが、外部のライブラリは含まれていません。
Android 3.1 向けの開発とテストを始めるには、Android SDK Manager を使って自分の SDK にプラットフォームをダウンロードします。より詳しい情報は
Adding SDK Components を見てください。Android が初めての人は、まず
download the SDK Starter Package から始めてください。
Android 3.1 のより高レベルの紹介は
Platform Highlights を見てください。
Reminder: あなたがすでに Android アプリを公開しているなら、できるだけ早く、あなたのアプリを Android 3.0, Android 3.1 向けにテストおよび最適化を行なってください。最新の Android-powered デバイスで、あなたのアプリのベストな体験を受けられるようにするべきです。そのために何をするか・できるかの情報は
Optimizing Apps for Android 3.0 を読んでください。
---
API Overview
以下のセクションは Android 3.1 で開発者が新しくできるようになったもののテクニカルオーバービューです。新しい機能や、前回のバージョンからの framework API の変更点が含まれています。
USB APIs
Android 3.1 はプラットフォームで動作するアプリケーションと接続された周辺機器間の統合を目的としたパワフルな新しい API を紹介します。この API はプラットフォーム内に組み込まれた USB (Universal Serial Bus) のスタックとサービスに基づいており、USB host とデバイスとのやりとり両方のサポートが含まれています。この API を使うことで、開発者は USB を介して様々なタイプのデバイスを見つけ、やりとりし、管理するアプリケーションを作ることができます。
スタックと API は、プラットフォーム自身がホストとして振舞うか、はたまた外部のハードウェアが振舞うかに基づいた、USB ハードウェアの2つの基礎タイプを区別します。
- USB デバイスはホストとして機能する Android-powered デバイスに依存した接続先のハードウェアの一部です。例えば、ほとんどの入力デバイス、マウス、ジョイスティックは USB デバイスです。同様にカメラやハブなどもあります。
- USB accessory はホストコントローラをもち、電力を供給し、USB を介して Android-powered デバイスとやりとりするようデザインされた接続先のハードウェアの一部です。ロボットコントローラから音楽機器、エクササイズバイクなどまで、多くの周辺機器が accessory として接続できます。
USB デバイスと USB accessory 両方のタイプに対してプラットフォームの USB API は取り付け時と取り外し時の broadcast intent による検出をサポートします。また、標準のインタフェース、エンドポイント、転送モード (コントロール、バルク、割り込み)も同様にサポートします。
USB API は
android.hardware.usb パッケージにあります。中心クラスは UsbManager で、USB デバイスと USB accessory 両方に対する識別とやりとりのヘルパーメソッドを提供します。
アプリケーションは
UsbManager のインスタンスを取得して、取り付けられているデバイスもしくは accessory の一覧を得るためのクエリを投げるたり、やりとりしたり、管理したりすることができます。また
UsbManager には、USB デバイスや accessory の取り付け時・取り外し時にシステムが broadcast する intent action が定義されています。
他の含まれているクラスとして:
USB スタックはプラットフォーム内に組み込まれていますが、実際に特定のデバイスで USB host と open accessory mode をサポートするかどうかはそのデバイスのメーカーが決定します。特に、host mode は Android-powered デバイスの適切な USB コントローラーハードウェアに依存します。
加えて、開発者は適切な USB サポートが提供されていないデバイスのユーザーにアプリケーションを利用できないように、Android Market でフィルタリングを依頼することができます。フィルタリングをリクエストするには、必要に応じて次のエレメントのいずれかもしくは両方をアプリケーションのマニフェストに追加します。
- アプリケーションが USB host mode (USB デバイスと接続)をサポートしているデバイスにのみ見えるようにするには、次のエレメントを宣言する
<uses-feature android:name="android.hardware.usb.host" android:required="true">
- アプリケーションが USB accessory(USB host と接続)をサポートしているデバイスにのみ見えるようにするには、次のエレメントを宣言する
<uses-feature android:name="android.hardware.usb.accessory" android:required="true">
USB accessory とやり取りするアプリケーションを開発するための全ての情報は
developer documentation を参照してください。
USB host API を使ったサンプルアプリケーションを参照するには、
ADB Test と
Missile Launcher を見てください。
MTP/PTP API
Android 3.1 は新しい MTP API を公開しました。これにより、アプリケーションは接続されたカメラや他の PTP デバイスと直接やりとりすることができます。新しい API によって、アプリケーションはデバイスの取り付け・取り外しの通知を簡単に受けられるようになり、それらのデバイス上でのファイルやストレージの管理や、ファイルやメタデータの転送も簡単にできるようになりました。MTP API は MTP (Media Transfer Protocol) 仕様の PTP (Picture Transfer Protocol) サブセットを実装しています。
MTP API は
android.mtp パッケージで使用できます。ここでは以下のクラスが提供されています。
- MtpDevice は USB host bus を介して接続された MTP デバイスをカプセル化したものです。アプリケーションはこのタイプのオプジェクトをインスタンス化し、そのメソッドを使ってデバイスの情報や保存されているオブジェクトを取得することができます。同様に接続をオープンしてデータを転送することもできます。
例えば、含まれているメソッドとして、
- MtpStorageInfo は MTP 仕様の section 5.2.2 で記述されている StorageInfo Dataset に対応する MTP デバイスのストレージユニット情報を保持する。このクラスのメソッドをつかってストレージユニットを記述する文字列、フリースペース、最大ストレージ容量、ストレージID、ヴォリューム識別子を取得できる。
- MtpDeviceInfo は MTP 仕様の section 5.1.1 で記述されている DeviceInfo Dataset に対応する MTP デバイスの情報を保持する。このクラスのメソッドを使ってデバイスのメーカー、モデル、シリアルナンバー、バージョンを取得できる。
- MtpObjectInfo は MTP 仕様の section 5.3.1 で記述されている ObjectInfo Dataset に対応する MTP デバイスに保存されているオブジェクトの情報を保持する。このクラスのメソッドを使ってオブジェクトのサイズ、データフォーマット、アソシエーションタイプ、作成日、サムネイル情報を取得できる。
- MtpConstants は MTP ファイルフォーマットコード、アソシエーションタイプ、プロテクションステータスを宣言するための定数を提供する
Support for new input devices and motion events
Android 3.1 は全てのビューとウィンドウにわたって新しい入力デバイスと新しいモーションイベントタイプをサポートすることで、入力のサブシステムを拡張します。開発者はユーザーがキーボードやタッチスクリーンに加えて、マウス、トラックボール、ジョイスティック、ゲームパッド、その他のデバイスを使ってプリケーションを操作できるように、これらの機能を構築することができます。
マウス、スクロールホイール、トラックボールによる入力をハンドリングするために、プラットフォームは2つの新しいモーションイベントアクションをサポートします:
ジョイスティックとゲームパッドをサポートするために、
InputDevice クラスは新しく次のデバイスソースを含むようになりました:
これらの新しいソースからのモーションイベントを示すために、
KeyEvent においてキーコードが定義されているように、プラットフォームは
MotionEvent において軸コードを新しく定義します。ジョイスティックとゲームコントローラ用の新しい軸には
AXIS_HAT_X,
AXIS_HAT_Y,
AXIS_RTRIGGER,
AXIS_ORIENTATION,
AXIS_THROTTLE, 他多くが含まれます。すでに存在している
MotionEvent の軸は
AXIS_X,
AXIS_Y,
AXIS_PRESSURE,
AXIS_SIZE,
AXIS_TOUCH_MAJOR,
AXIS_TOUCH_MINOR,
AXIS_TOOL_MAJOR,
AXIS_TOOL_MINOR,
AXIS_ORIENTATION として表されます。
加えて、
MotionEvent には、フレームワークが特定の軸をどのようにマップするか知らない場合に使用する汎用的な軸コードも定義します。特定のデバイスはカスタムモーションデータをアプリケーションに渡すために汎用的な軸コードを使うことができます。軸の全リストとそれらの意図するものの解釈は
MotionEvent クラスのドキュメントを見てください。
プラットフォームはバッチ処理でアプリケーションにモーションイベントを提供します。そのため、1つのイベントは現在の位置といわゆる運動の履歴を含みます。アプリケーションは
getHistorySize() を使って履歴サンプルの数を取得し、それから順番に
getHistoricalAxisValue() を使って全ての履歴サンプルの取得と処理を行うべきです。そのあと、アプリケーションは
getAxisValue() を使って現在のサンプルを処理します。
いくつかの軸は特別なアクセサメソッドを使って取得することができます。例えば、
getAxisValue() を呼ぶ代わりに、
getX() を呼ぶことができます。ビルトインのアクセサが含む軸は、
AXIS_X,
AXIS_Y,
AXIS_PRESSURE,
AXIS_SIZE,
AXIS_TOUCH_MAJOR,
AXIS_TOUCH_MINOR,
AXIS_TOOL_MAJOR,
AXIS_TOOL_MINOR,
AXIS_ORIENTATION です。
各入力デバイスはユニークな、システムが割り当てた ID を持ち、複数のソースを提供することがあります。デバイスが複数のソースを提供する場合、1つ以上のソースが同じ軸を使って軸データを提供できます。例えば、タッチイベントはスクリーンの位置データとしてX軸を使うソースからきますが、ジョイスティックイベントは代わりにジョイスティックの位置データとしてX軸を使ったソースからきます。つまり、どのソースによって発生したかによって軸の値を解釈することが重要です。モーションイベントを処理するとき、アプリケーションは
InputDevice クラスのメソッドを使ってデバイスやソースがサポートする軸を決めるべきです。特にアプリケーションはデバイスの全ての軸や、デバイスの特定のソースの全ての軸をクエリするために
getMotionRanges() を使うことができます。両方のケースで、軸の範囲情報は 各軸値のソースを指定する <
InputDevice.MotionRange オブジェクトで返されます。
最後に、ジョイスティック、ゲームパッド、マウス、トラックボールからのモーションイベントはタッチイベントではありません。プラットフォームには、これらを "汎用的な" モーションイベントとして
View に渡すための新しいコールバックメソッドが追加されています。具体的には、
onTouchEvent() ではなく、
onGenericMotionEvent() を呼ぶことで
View にノンタッチモーションイベントを通知します。
プラットフォームはイベントソースクラスに依存して異なる汎用的モーションイベントを送ります。
SOURCE_CLASS_POINTER イベントは、どのようにタッチイベントが動くかと似て、ポインターの下の View に行きます。その他の全ては、現在フォーカスされている View に行きます。例えば、ジョイスティックのイベントを受け取るためには、View はフォーカスされていなければならないという意味です。代わりに、必要であればアプリケーションはこれらのイベントを
onGenericMotionEvent() を実装することで Activity や Dialog のレベルで処理することができます。
ジョイスティックモーションイベントを使ったアプリケーションのサンプルは
GameControllerInput と
GameView です。
RTP API
Android 3.1 にはビルトイン RTP(Real-time Transport Protocol) の API があります。アプリケーションはオンデマントやインタラクティブのデータストリーミングを管理するために使うことができます。特に VOP, push-to-talk, 電話会議(conferencing), 音声ストリーミングを提供するアプリは、利用可能な任意ネットワークを介して、セッションの初期化とデータストリームの転送・受信を行うのに、このAPIを使うことができます。
RTP API は
android.net.rtp パッケージで利用可能です。
含まれるクラスとして:
音声会議とそれに似た使い方をサポートする為に、アプリケーションはストリームのエンドポイントして2つのクラスをインスタンス化します。
もっともシンプルな使い方は、1つのリモートエンドポイントと1つのロカールエンドポイントから構成されます。
より複雑な使い方は、
AudioGroup に記述されている limitation を参照してください。
RTP API を使うには、アプリケーションはユーザーにパーミッションをリクエストしなければなりません。そのためには、マニフェストファイルに <uses-permission android:name="android.permission.INTERNET"> を宣言してください。
デバイスのマイクを取得するなら、<uses-permission android:name="android.permission.RECORD_AUDIO"> パーミッションも必要です。
Resizable app widgets
Android 3.1 から、開発者は自分のホームスクリーンウィジェットを縦方向、横方向、両方の軸でサイズ変更可能にすることができるようになりました。ユーザーはウィジェットをタッチ-ホールドすることでリサイズハンドルを表示します。そして、縦と/もしくは横にハンドルをドラッグしてレイアウトグリッド上のサイズを変更します。
開発者はウィジェットの
AppWidgetProviderInfo メタデータ内に
resizeMode 属性を定義することで全てのホームスクリーンウィジェットをサイズ変更可能にできます。
resizeMode 属性用の値は "horizontal", "vertical", "none" です。ウィジェットを縦横両方でサイズ変更可能にするには "horizontal|vertical" のように書きます。
例)
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/preview"
android:initialLayout="@layout/example_appwidget"
android:configure="com.example.android.ExampleAppWidgetConfigure"
android:resizeMode="horizontal|vertical" >
</appwidget-provider>
ホームスクリーンウィジェットのより詳しい情報は、
App Widgets のドキュメントを見てください。
Animation framework
- New ViewPropertyAnimator class
- Animation background color
- Getting animated fraction from ViewAnimator
UI framework
- Forced rendering of a layer
- 新しい buildLayer() メソッドによってアプリケーションは生成される View のレイヤーを強制することができ、View は直ちにそこにレンダリングされます。例えば、アプリケーションはこのメソッドを使って、アニメーションがスタートする前に、そのレイヤーに View をレンダリングすることができます。View が複雑な場合、アニメーションが開始される前にそのレイヤーにレンダリングしておくことで、フレームがスキップされるのを防ぐことができます。
- Camera distance
- アプリケーションは新しいメソッド setCameraDistnace(float) を使ってカメラと View の距離を設定できるようになりました。これにより、アプリケーションは回転などの View の3D変換上のコントロールを改善することができます。
- Getting a calnendar view from a DatePicker
- Getting callbacks when views are detached
- Fragment breadcrumb listener, new onInflate() signature
- Display search result int new tab
- Drawable text cursor
- Setting displayed child in remote views
- Generic keys for gamepads and other input devices
Graphics
- Helper for managing bitmaps
- setHasAlpha(boolean) を使って、アプリケーションは Bitmap 内の全てのピクセルが不透明(false)かいつくかのピクセルが不透明ではないアルファ値(true)を含むかどうかを示すことができます。いくつかの設定(RGB_565など)では、per-pixel アルファ値がサポートされていないため、この呼び出しが無視されることに気をつけてください。このメソッドは描画のヒントを与えることを意味しています。いくつかのケースでは、不透明だと分かっているビットマップの描画は、不透明ではない per-pixel アルファ値が含まれている可能性があるときの描画よりも速くなることが知られています。
- getByteCount() でバイト単位での Bitmap のサイズを取得する
- getGenerationId() を使ってキャッシュ用などに Bitmap が変更されたかどうかを見つけることができます。
- sameAs(android.graphics.Bitmap) は、与えられた Bitmap が現在の Bitmap と寸法、設定、もしくはピクセルデータで異なるかどうかを決定する。
- Setting camera location and rotation
Network
- High-performance Wi-Fi lock
- High-performance Wi-Fi lock によって、デバイスのスクリーンがオフの状態であっても、アプリケーションはハイパフォーマンス Wi-Fi 接続を制御することができます。長期間、音楽、ビデオ、音声をストリームするアプリケーションは high-performance Wi-Fi lock によって画面オフの状態でもストリーミングパフォーマンスを確実に保つことができます。この状態はより電力を使うため、アプリケーションは長時間アクティブな接続が必要なとき high-performance Wi-Fi を得るようにすべきです。
- More traffic stats
- アプリケーションは TrafficStats 内の新しいメソッドを使うことで、より多くのタイプのネットワーク使用の統計情報にアクセスできるようになりました。アプリケーションはメソッドを使って、UDP状態, パケットカウント, TCP 転送/受信 ペイロードバイト、特定の UID のセグメント を取得することができます。
- SIP auth username
Download Manager
- Handling of completed downloads
- Show downloads sorted by size
IME framework
- Getting and input method's extra value key
Media
- New streaming audio formats
- ストリーミングオーディオを改善するために、メディアフレームワークに raw ADTS AAC コンテンツのビルドインサポートが追加されました。同様に、高品質(lossless)圧縮オーディオコンテンツ用に FLAC audio のサポートも追加されました。より詳しい情報は Supported Media Formats を見てください。
Launch controls on stopped applications
Android 3.1 から、システムのパッケージマネジャーは stopped 状態のアプリケーションをトラックし続けるようになりました。そして、バックグラウンドプロセスや他のアプリケーションからの起動を制御する手段を提供します。
アプリケーションの stopped 状態は Activity の stopped 状態とは異なることに気をつけてください。システムはこれら2つの状態を別々に管理します。
プラットフォームは2つの新しい intent flag を定義します。これにより stopped アプリケーション内のコンポーネントをアクティブすることを、そのインテントが許可すべきかどうかを送信側が指定することができます。
これらのフラグの両方がインテントに定義されている場合、デフォルトの振る舞いは、可能性のあるターゲットのリストに stopped アプリケーションのフィルターを含みます。
システムはずべての broadcast intent に
FLAG_EXCLUDE_STOPPED_PACKAGES を追加することに注意してください。これは不注意によるバックグラウンドサービスからの broadcast や、不必要な stopped アプリケーションのコンポーネント起動を防ぎます。バックグラウンドサービスやアプリケーションは、 stopped アプリケーションをアクティブにするべき broadcast intent に
FLAG_INCLUDE_STOPPED_PACKAGE フラグを加えることで、この振る舞いをオーバーライドすることができます。
アプリケーションは最初にインストールされて、また起動されたいない状態とき、stopped 状態になります。また、アプリケーション管理でユーザーが手動でストップしたときも stopped 状態になります。
Notification of application first launch and upgragde
次の2つの intent action を通してアプリケーションの最初の起動とアップグレードの改善された通知がプラットフォームに追加されました。
- ACTION_PACKAGE_FIRST_LAUNCH - アプリケーションが最初に起動したとき(つまり、stopped state から最初に外れたとき)にアプリケーションのインストーラパッケージに送る。データにはパッケージ名が含まれる。
- ACTION_MY_PACKAGE_REPLACED - アップデートされた(規存のバージョンを新しいバージョンで上書きインストールされた)アプリケーションを通知する。これは置き換えられたアプリケーションにのみ贈られる。付加的なデータは含まれない。これを受け取るには、この intent action を intent filter に宣言する。アップグレード後に適切な起動状態にアプリケーションを戻すためのトリガーコードとして使うことができる。
このインテントは、アップグレードされたアプいrケーションが started 状態のときのみアプリケーションに直接送られる。(stopped 状態では送られない)
Core utilities
- LRU cache
- 新しい LruChacke クラスによってアプリケーションは効果的なキャッシュによる利益を受けられます。キャッシュされたデータのための賢いメモリフットプリントを維持することで、アプリケーションは計算やネットワークからのデータのダウンロードに費やす時間を減らすことができます。LruCache は限られた数の値への強力なリファレンスを保持するキャッシュです。値がアクセスされるたびに、キューの先頭に移動します。値がフルキャッシュに追加されたとき、そのキューの最後の値は立ち退かされ、ガーベージコレクションの対象になります。
- File descriptor as int
WebKit
- File scheme cookies
- Notification of login request
- Android 3.0 で紹介されたブラウザオートログイン機能をサポートするために、新しい onReceivedLoginRequest() メソッドはユーザーのオートログインリクエストが処理されたことをホストアプリケーションに通知します。
- Removed classes and interfaces
Browser
ブラウザアプリケーションにはウェブアプリケーションをサポートするために次の機能が追加されました:
- HTML5 <video> タグに埋込まれたビデオのインラインプレイバックがサポートされました。可能であればプレイバックはハードウェアアクセラレイトされます。
- 全てのサイト(モバイルとデスクトップ)に対して固定位置エレメントのレイヤーがサポートされました。
New feature constants
開発者がアプリケーションマニフェストで宣言できるハードウェアの機能定数が追加されました。Android Market のような外部のエンティティに、アプリケーションがこのプラットフォームのバージョンで新しくサポートされたハードウェアの機能が必要であることを知らせることができます。開発者はこれらおよび他の機能定数を
<uses-feature> マニフェストエレメントに宣言します。
- android.hardware.usb.accessory - アプリケーションは USB API を使ってUSB を介して接続されたホストとして機能する外部のハードウェアデバイスとやりとりすることができます。
- android.hardware.usb.host - アプリケーションは USB API を使って USB を介して接続されたデバイスとして機能する外部のハードウェアデバイスとやりとりすることができます。
Android Market は <uses-feature> マニフェストエレメントに宣言された機能に基づいてアプリケーションをフィルターします。アプリケーションマニフェストに機能を宣言するためのより詳しい情報は
Android Market Filters を読んでください。