Android 4.1 API

API レベル: 16

Android 4.1(JELLY_BEAN)は、プラットフォームが進化し、パフォーマンスとユーザー エクスペリエンスが向上しています。ユーザーとアプリ デベロッパー向けの新機能を追加します。このドキュメントでは、アプリ デベロッパー向けの注目度が高く有用な新しい API を紹介します。

アプリ デベロッパーは、Android Emulator やアプリのビルドに使用できる SDK プラットフォームとして、SDK Manager から Android 4.1 を利用できます。Android 4.1 でアプリをビルドしてテストするには、できるだけ早くシステム イメージとプラットフォームをダウンロードしてください。

Android 4.1 搭載デバイス向けにアプリをより適切に最適化するには、targetSdkVersion"16" に設定し、Android 4.1 システム イメージにインストールしてテストしてから、この変更を含むアップデートを公開する必要があります。

Android 4.1 の API を使用しながら、古いバージョンもサポートするには、minSdkVersion でサポートされていない API を実行する前に、システム API レベルをチェックする条件をコードに追加します。下位互換性の維持について詳しくは、下位互換性のある UI の作成をご覧ください。

API レベルの仕組みについて詳しくは、API レベルとはをご覧ください。

アプリ コンポーネント

分離されたサービス

<service> タグで android:isolatedProcess="true" を指定すると、Service は、独自の権限を持たない独立したユーザー ID プロセスで実行されます。

メモリ管理

TRIM_MEMORY_RUNNING_LOWTRIM_MEMORY_RUNNING_CRITICAL などの新しい ComponentCallbacks2 定数を使用すると、システムが onLowMemory() を呼び出す前に、フォアグラウンド プロセスでメモリ状態に関するより多くの情報を取得できます。

新しい getMyMemoryState(ActivityManager.RunningAppProcessInfo) メソッドを使用すると、一般的なメモリ状態を取得できます。

コンテンツ プロバイダ

新しいメソッドである acquireUnstableContentProviderClient() を使用すると、コンテンツ プロバイダがクラッシュしてもアプリがクラッシュしないように、「不安定」な ContentProviderClient にアクセスできます。別のアプリでコンテンツ プロバイダとやり取りする場合に便利です。

ライブ壁紙

ライブ壁紙のプレビュー アクティビティを直接起動する新しいインテント プロトコルを使用すると、ユーザーはアプリから離れてホーム壁紙選択ツールに移動することなく、ライブ壁紙を簡単に選択できるようになります。

ライブ壁紙選択ツールを起動するには、ACTION_CHANGE_LIVE_WALLPAPER と、ライブ壁紙 ComponentNameEXTRA_LIVE_WALLPAPER_COMPONENT の文字列として指定するエクストラを使用して、Intent を指定して startActivity() を呼び出します。

アプリスタックのナビゲーション

Android 4.1 では、「上へ」ナビゲーションの適切なデザイン パターンの実装がはるかに簡単になっています。マニフェスト ファイル内の各 <activity> 要素に android:parentActivityName を追加するだけで済みます。ユーザーがアクションバーの上ボタンを押すと(同時に現在のアクティビティも終了)、システムはこの情報を使用して適切なアクティビティを開きます。そのため、アクティビティごとに android:parentActivityName を宣言する場合、アクションバーのアプリアイコンでのクリック イベントを処理する onOptionsItemSelected() メソッドは必要ありません。システムがそのイベントを処理し、適切なアクティビティを再開または作成します。

これは、通知や別のアプリからのインテントなど、「詳細」インテントを介してユーザーがアプリのアクティビティのいずれかを入力するシナリオで特に効果的です(アプリ間のナビゲーションの設計ガイドを参照)。ユーザーがこの方法でアクティビティを開始した場合、ユーザーが上に移動したときに再開できるアクティビティのバックスタックがアプリに用意されていない可能性があります。ただし、アクティビティに android:parentActivityName 属性を指定すると、アプリに親アクティビティのバックスタックがすでに含まれているかどうかがシステムによって認識され、含まれていない場合は、すべての親アクティビティを含む合成バックスタックが作成されます。

注: ユーザーがアプリにディープ アクティビティを入力し、アプリに新しいタスクを作成すると、システムは親アクティビティのスタックをタスクに挿入します。そのため、[戻る] ボタンを押すと、親アクティビティのスタックを戻ります。

システムは、アプリの合成バックスタックを作成すると、基本的な Intent をビルドして、各親アクティビティの新しいインスタンスを作成します。したがって、ユーザーが各アクティビティを自然に移動する場合に想定されるような親アクティビティの保存状態はありません。通常、いずれかの親アクティビティがユーザーのコンテキストに依存する UI を表示している場合、そのコンテキスト情報は失われるため、ユーザーがスタック内に戻ったときにそれを配信する必要があります。たとえば、ユーザーが音楽アプリでアルバムを表示している場合、上に移動すると、選択した音楽ジャンルのすべてのアルバムを一覧表示するアクティビティが表示されることがあります。この場合、スタックを作成する必要がある場合は、現在のアルバムが属するジャンルを親アクティビティに通知して、ユーザーが実際にそのアクティビティからアクセスしてきたかのように親が適切なリストを表示できるようにする必要があります。このような情報を合成親アクティビティに配信するには、onPrepareNavigateUpTaskStack() メソッドをオーバーライドする必要があります。これにより、親アクティビティを合成するためにシステムが作成した TaskStackBuilder オブジェクトが提供されます。TaskStackBuilder には、システムが各親アクティビティを作成するために使用する Intent オブジェクトが含まれます。onPrepareNavigateUpTaskStack() の実装で、適切な Intent を変更して、親アクティビティが適切なコンテキストを決定し、適切な UI を表示するために使用できるデータを追加できます。

システムが TaskStackBuilder を作成すると、親アクティビティの作成に使用される Intent オブジェクトが、アクティビティ ツリーの上部から論理的な順序で追加されます。そのため、内部配列に追加された最後の Intent が、現在のアクティビティの直接の親になります。アクティビティの親の Intent を変更する場合は、まず getIntentCount() で配列の長さを決定し、その値を editIntentAt() に渡します。

アプリの構造が複雑な場合は、上方ナビゲーションの動作を処理し、合成バックスタックを完全にカスタマイズできる API が他にもあります。詳細な制御を可能にする API には次のものがあります。

onNavigateUp()
これをオーバーライドして、ユーザーが上ボタンを押したときにカスタム アクションを実行します。
navigateUpTo(Intent)
これを呼び出して現在のアクティビティを終了し、指定された Intent が示すアクティビティに移動します。アクティビティがバックスタックに存在していても、最も近い親ではない場合は、現在のアクティビティとインテントで指定されたアクティビティの間の他のすべてのアクティビティも終了します。
getParentActivityIntent()
これを呼び出して、現在のアクティビティの論理的な親を開始する Intent を取得します。
shouldUpRecreateTask(Intent)
上に移動するために合成バックスタックを作成する必要があるかどうかを照会するには、これを呼び出します。合成スタックを作成する必要がある場合は true を返し、適切なスタックがすでに存在する場合は false を返します。
finishAffinity()
現在のアクティビティと、現在のアクティビティにチェーンされている同じタスク アフィニティを持つすべての親アクティビティを終了する場合に呼び出します。onNavigateUp() などのデフォルトの動作をオーバーライドする場合は、「上へ」ナビゲーション時に合成バックスタックを作成するときに、このメソッドを呼び出す必要があります。
onCreateNavigateUpTaskStack
合成タスクスタックの作成方法を完全に制御する必要がある場合は、オーバーライドします。バックスタックのインテントにデータを追加するだけの場合は、代わりに onPrepareNavigateUpTaskStack() をオーバーライドする必要があります。

ただし、ほとんどのアプリでは、これらの API を使用したり onPrepareNavigateUpTaskStack() を実装したりする必要はありませんが、各 <activity> 要素に android:parentActivityName を追加するだけで正しい動作を実現できます。

マルチメディア

メディア コーデック

MediaCodec クラスは、メディアのエンコードとデコードのための低レベルのメディア コーデックへのアクセスを提供します。createEncoderByType() を呼び出してメディアをエンコードするか、createDecoderByType() を呼び出してメディアをデコードすることで、MediaCodec をインスタンス化できます。これらの各メソッドは、エンコードまたはデコードするメディアのタイプ("video/3gpp""audio/vorbis" など)に対応する MIME タイプを取ります。

MediaCodec のインスタンスが作成されたら、configure() を呼び出して、メディア形式やコンテンツが暗号化されているかどうかなどのプロパティを指定できます。

メディアをエンコードするかデコードするかにかかわらず、MediaCodec を作成した後の残りのプロセスは同じです。まず、getInputBuffers() を呼び出して入力 ByteBuffer オブジェクトの配列を取得し、getOutputBuffers() を呼び出して出力 ByteBuffer オブジェクトの配列を取得します。

エンコードまたはデコードの準備ができたら、dequeueInputBuffer() を呼び出して、ソースメディアへのフィードに使用する ByteBuffer のインデックス位置を(入力バッファの配列から)取得します。ByteBuffer にソースメディアを入力したら、queueInputBuffer() を呼び出してバッファの所有権を解放します。

出力バッファの場合も同様に、dequeueOutputBuffer() を呼び出して、結果を受け取る ByteBuffer のインデックス位置を取得します。ByteBuffer からの出力を確認したら、releaseOutputBuffer() を呼び出して所有権を解放します。

コーデックで暗号化されたメディアデータを処理するには、通常の queueInputBuffer() ではなく、MediaCrypto API と組み合わせて queueSecureInputBuffer() を呼び出します。

コーデックの使用方法について詳しくは、MediaCodec のドキュメントをご覧ください。

キューの音声を録音する

新しいメソッド startRecording() を使用すると、MediaSyncEvent で定義されたキューに基づいて録音を開始できます。MediaSyncEvent は、MediaPlayer で定義された音声セッションなど、音声セッションを指定します。このセッションが完了すると、音声レコーダーがトリガーされ、録音が開始されます。たとえば、この機能を使用すると、録音セッションの開始を示す音声トーンを再生できます。録音は自動的に開始されるため、トーンと録音の開始を手動で同期する必要はありません。

テキスト トラックのタイミング指定

MediaPlayer が帯域内テキスト トラックと帯域外テキスト トラックの両方を処理するようになりました。インバンド テキスト トラックは、MP4 または 3GPP メディアソース内のテキスト トラックです。帯域外のテキスト トラックは、addTimedTextSource() メソッドを使用して外部テキストソースとして追加できます。外部テキスト トラックのソースをすべて追加したら、getTrackInfo() を呼び出して、データソースで使用可能なすべてのトラックの更新されたリストを取得する必要があります。

MediaPlayer で使用するトラックを設定するには、使用するトラックのインデックス位置を使用して selectTrack() を呼び出す必要があります。

テキスト トラックの再生準備が整ったときに通知を受け取るには、MediaPlayer.OnTimedTextListener インターフェースを実装して setOnTimedTextListener() に渡します。

オーディオ エフェクト

AudioEffect クラスが、音声をキャプチャするときに追加の音声前処理タイプをサポートするようになりました。

  • 音響エコー キャンセラ(AEC)と AcousticEchoCanceler は、キャプチャした音声信号から、リモート パーティから受信する信号を除去します。
  • AutomaticGainControl を使用した自動ゲイン コントロール(AGC)は、キャプチャされた信号の出力を自動的に正規化します。
  • ノイズ サプレッサー(NS)と NoiseSuppressor は、キャプチャした信号からバックグラウンド ノイズを除去します。

これらのプリプロセッサ エフェクトは、AudioEffect サブクラスのいずれかを使用して、AudioRecord でキャプチャした音声に適用できます。

注: すべてのデバイスがこれらのエフェクトをサポートしているとは限りません。そのため、まず、対応するオーディオ エフェクト クラスで isAvailable() を呼び出して、使用可能かどうかを確認する必要があります。

ギャップレス再生

2 つの個別の MediaPlayer オブジェクト間でギャップレス再生を実行できるようになりました。最初の MediaPlayer が終了する前であればいつでも、setNextMediaPlayer() を呼び出します。Android は、最初のプレーヤーが停止した時点で 2 番目のプレーヤーを起動しようとします。

メディア ルーター。新しい API の MediaRouter、MediaRouteActionProvider、MediaRouteButton は、メディアの再生場所を選択するための標準的なメカニズムと UI を提供します。

カメラ

オート フォーカス動作

新しいインターフェース Camera.AutoFocusMoveCallback を使用すると、オート フォーカスの動きの変更をリッスンできます。インターフェースは setAutoFocusMoveCallback() で登録できます。カメラが連続オートフォーカス モード(FOCUS_MODE_CONTINUOUS_VIDEO または FOCUS_MODE_CONTINUOUS_PICTURE)になると、onAutoFocusMoving() が呼び出されます。これにより、オート フォーカスが移動を開始したか停止したかがわかります。

カメラの音

MediaActionSound クラスは、カメラなどのメディア アクションによって生成される標準的なサウンドを生成するためのシンプルな API セットを提供します。カスタムの静止カメラまたはビデオカメラを作成する場合は、これらの API を使用して適切なサウンドを再生する必要があります。

音声を再生するには、MediaActionSound オブジェクトをインスタンス化し、load() を呼び出して目的の音声をプリロードし、適切なタイミングで play() を呼び出します。

接続

Android ビーム

Android BeamTM では、Bluetooth を介した大規模なペイロード転送がサポートされるようになりました。新しい setBeamPushUris() メソッドまたは新しいコールバック インターフェース NfcAdapter.CreateBeamUrisCallback で転送するデータを定義すると、転送速度を上げるために、Android はデータ転送を Bluetooth または別の代替トランスポートに渡します。これは、画像ファイルや音声ファイルなどの大きなペイロードの場合に特に有用で、デバイス間のペア設定が不要です。アプリが Bluetooth 経由の転送を利用するために、追加の作業は必要ありません。

setBeamPushUris() メソッドは、アプリから転送するデータを指定する Uri オブジェクトの配列を受け取ります。または、setBeamPushUrisCallback() を呼び出してアクティビティに指定できる NfcAdapter.CreateBeamUrisCallback インターフェースを実装することもできます。

コールバック インターフェースを使用する場合、ユーザーが Android ビームとの共有を実行すると、システムはインターフェースの createBeamUris() メソッドを呼び出します。これにより、共有時に共有する URI を定義できます。これは、共有する URI がアクティビティ内のユーザー コンテキストによって異なる可能性がある場合に便利です。setBeamPushUris() の呼び出しは、共有する URI が変化せず、事前に安全に定義できる場合に便利です。

ネットワークサービスの検出

Android 4.1 では、マルチキャスト DNS ベースのサービス ディスカバリのサポートが追加されています。これにより、ローカル ネットワークに登録されているモバイル デバイス、プリンタ、カメラ、メディア プレーヤーなど、Wi-Fi 経由でピアデバイスが提供するサービスを見つけて接続できます。

新しいパッケージ android.net.nsd には、ローカル ネットワークへのサービスのブロードキャスト、ネットワーク上のローカル デバイスの検出、デバイスへの接続を可能にする新しい API が含まれています。

サービスを登録するには、まず NsdServiceInfo オブジェクトを作成し、setServiceName()setServiceType()setPort() などのメソッドを使用して、サービスのさまざまなプロパティを定義する必要があります。

次に、NsdManager.RegistrationListener を実装し、NsdServiceInforegisterService() に渡す必要があります。

ネットワーク上のサービスを検出するには、NsdManager.DiscoveryListener を実装して discoverServices() に渡します。

検出されたサービスに関するコールバックを NsdManager.DiscoveryListener が受信したら、resolveService() を呼び出して、検出されたサービスに関する情報を含む NsdServiceInfo オブジェクトを受け取る NsdManager.ResolveListener の実装を渡すことでサービスを解決する必要があります。これにより、接続を開始できます。

Wi-Fi P2P サービス ディスカバリ

Android 4.1 では Wi-Fi P2P API が強化され、WifiP2pManager で事前関連付けサービス ディスカバリをサポートするようになりました。これにより、Wi-Fi P2P に接続する前に、サービス別に付近のデバイスを検出してフィルタできます。一方、Network Service Discovery では、既存の接続済みネットワーク(ローカル Wi-Fi ネットワークなど)上のサービスを検出できます。

アプリを Wi-Fi 経由でサービスとしてブロードキャストし、他のデバイスがアプリを検出して接続できるようにするには、アプリサービスを記述する WifiP2pServiceInfo オブジェクトを指定して addLocalService() を呼び出します。

Wi-Fi 経由で付近のデバイスの検出を開始するには、まず、Bonjour と Upnp のどちらを使用して通信するかを決定する必要があります。Bonjour を使用するには、まず setDnsSdResponseListeners() を使用してコールバック リスナーをいくつかセットアップします。このコールバックは WifiP2pManager.DnsSdServiceResponseListenerWifiP2pManager.DnsSdTxtRecordListener の両方を受け取ります。Upnp を使用するには、WifiP2pManager.UpnpServiceResponseListener を受け取る setUpnpServiceResponseListener() を呼び出します。

ローカル デバイスでサービスの検出を開始するには、addServiceRequest() を呼び出す必要もあります。このメソッドに渡す WifiP2pManager.ActionListener が正常なコールバックを受信したら、discoverServices() を呼び出してローカル デバイスでサービスの検出を開始できます。

ローカル サービスが検出されると、Bonjour と Upnp のどちらを使用するように登録したかに応じて、WifiP2pManager.DnsSdServiceResponseListener または WifiP2pManager.UpnpServiceResponseListener のいずれかに対するコールバックを受け取ります。いずれの場合も、コールバックにはピアデバイスを表す WifiP2pDevice オブジェクトが含まれます。

ネットワーク使用状況

新しいメソッド isActiveNetworkMetered() を使用すると、デバイスが現在従量制ネットワークに接続されているかどうかを確認できます。負荷の高いネットワーク トランザクションを実行する前にこの状態を確認することで、ユーザーに課金する可能性があるデータ使用量を管理し、トランザクションを今すぐ実行するか後で実行するか(デバイスが Wi-Fi に接続したときなど)の情報に基づいた意思決定を行うことができます。

ユーザー補助

ユーザー補助サービスの API

Android 4.1 では、ユーザー補助サービス API のリーチが大幅に拡大しました。これにより、AccessibilityEvent クラス、AccessibilityNodeInfo クラス、AccessibilityRecord クラスを追加することで、onGesture() を使用した複雑な操作やその他の入力イベントなど、より多くの入力イベントをモニタリングし、応答するサービスを構築できるようになりました。

ユーザー補助サービスは、performActionsetMovementGranularities を使用して、テキストのクリック、スクロール、ステップ移動などのアクションを、ユーザーに代わって実行することもできます。また、performGlobalAction() メソッドを使用すると、戻る、ホームなどのアクションを実行したり、最近使ったアプリや通知を開いたりすることができます。

カスタマイズ可能なアプリ ナビゲーション

Android アプリを作成するときに、findFocus()focusSearch() を使用してフォーカス可能な要素と入力ウィジェットを検出することでナビゲーション スキームをカスタマイズし、setAccessibilityFocused() を使用してフォーカスを設定できるようになりました。

ウィジェットのアクセシビリティが向上

新しい android.view.accessibility.AccessibilityNodeProvider クラスを使用すると、複雑なカスタムビューをユーザー補助サービスに表示して、ユーザー補助サービスではより利用しやすい方法で情報を表示できます。android.view.accessibility.AccessibilityNodeProvider を使用すると、カレンダー グリッドなどの高度なコンテンツを含むユーザー ウィジェットは、ウィジェットのレイアウト構造から完全に分離されたユーザー補助サービスに論理的なセマンティック構造を提示できます。このセマンティック構造により、ユーザー補助サービスは、視覚障がいのあるユーザーにより有用なインタラクション モデルを提供できます。

コピー&ペースト

インテントによるコピー&ペースト

setClipData() メソッドを使用して、ClipData オブジェクトを Intent に関連付けることができるようになりました。これは、複数のドキュメントを共有する場合など、インテントを使用して複数の content: URI を別のアプリケーションに転送する場合に特に便利です。この方法で指定された content: URI は、読み取りまたは書き込みアクセスを提供するインテントのフラグも考慮するため、インテント内の複数の URI へのアクセス権を付与できます。ACTION_SEND インテントまたは ACTION_SEND_MULTIPLE インテントの開始時に、インテントで指定された URI が ClipData に自動的に伝播されるようになりました。これにより、レシーバはインテントにアクセス権を付与できるようになりました。

HTML と文字列のスタイルのサポート

ClipData クラスがスタイル付きテキスト(HTML または Android のスタイル付き文字列)をサポートするようになりました。newHtmlText() を使用すると、HTML スタイル付きテキストを ClipData に追加できます。

Renderscript

RenderScript の計算機能が拡張され、次の機能が追加されました。

  • 1 つのスクリプトで複数のカーネルをサポート。
  • 新しいスクリプト API rsSample で、コンピューティングからフィルタされたサンプラーを使用した割り当てからの読み取りのサポート。
  • #pragma でさまざまなレベルの FP 精度をサポート。
  • コンピューティング スクリプトからの RS オブジェクトの追加情報のクエリをサポートします。
  • パフォーマンスを大幅に改善。

RenderScript の計算に必要な浮動小数点精度を定義するために、新しいプラグマも使用できます。これにより、完全な IEEE 754-2008 標準では実現できない、CPU パス上での高速ベクトル数学演算などの NEON のような演算を有効にできます。

注: 試験運用版の Renderscript グラフィック エンジンは非推奨になりました。

アニメーション

アクティビティ起動アニメーション

ズーム アニメーションまたは独自のカスタム アニメーションを使用して、Activity を起動できるようになりました。必要なアニメーションを指定するには、ActivityOptions API を使用して Bundle を作成し、それをアクティビティを開始する任意のメソッド(startActivity() など)に渡すことができます。

ActivityOptions クラスには、アクティビティの開始時に表示するアニメーションのタイプごとに異なるメソッドが含まれています。

makeScaleUpAnimation()
画面上の指定された開始位置と指定された開始サイズからアクティビティ ウィンドウを拡大するアニメーションを作成します。たとえば、Android 4.1 のホーム画面では、アプリを開くときにこの ID が使用されます。
makeThumbnailScaleUpAnimation()
指定された位置と指定されたサムネイル画像からアクティビティ ウィンドウを拡大するアニメーションを作成します。たとえば、Android 4.1 の [最近使ったアプリ] ウィンドウは、アプリに戻るときにこのウィンドウを使用します。
makeCustomAnimation()
独自のリソースで定義されたアニメーションを作成します。1 つはアクティビティの開始時のアニメーションを定義し、もう 1 つは停止するアクティビティのアニメーションを定義します。

タイム アニメーター

新しい TimeAnimator は、アニメーションのフレームごとに通知する TimeAnimator.TimeListener によるシンプルなコールバック メカニズムを提供します。この Animator には、期間、補間、オブジェクト値の設定はありません。リスナーのコールバックは、各フレームの情報(前のアニメーション フレームからの合計経過時間や経過時間など)を受け取ります。

ユーザー インターフェース

通知

Android 4.1 では、大きなコンテンツ領域、大きな画像プレビュー、複数の操作ボタン、設定可能な優先度を使用して通知を作成できます。

通知スタイル

新しいメソッド setStyle() を使用すると、より広いコンテンツ領域を提供する 3 つの新しいスタイルのいずれかを通知に指定できます。大きなコンテンツ領域のスタイルを指定するには、setStyle() に次のいずれかのオブジェクトを渡します。

Notification.BigPictureStyle
大きな画像が添付されている通知の場合。
Notification.BigTextStyle
1 通のメールなど、テキストが多く含まれる通知向け。
Notification.InboxStyle
複数のメールの抜粋など、文字列のリストを含む通知の場合。
通知の操作

通知で標準スタイルか大きいスタイルかに関係なく、通知メッセージの下部に最大 2 つのアクション ボタンがサポートされるようになりました。

アクション ボタンを追加するには、addAction() を呼び出します。このメソッドは、アイコンのドローアブル リソース、ボタンのテキスト、実行するアクションを定義する PendingIntent の 3 つの引数を取ります。

優先事項

setPriority() で優先度を設定することにより、リスト内の通知の順序に影響を与える通知の重要性をシステムに示すことができるようになりました。これは、Notification クラスの PRIORITY_* 定数で定義された 5 種類の優先度のいずれかを渡すことができます。デフォルトは PRIORITY_DEFAULT で、上位 2 レベルと下位 2 レベルがあります。

優先度の高い通知とは、新しいインスタント メッセージ、テキスト メッセージ、差し迫ったイベントのリマインダーなど、一般的にユーザーが迅速に対応したいものを指します。優先度の低い通知には、期限切れのカレンダーの予定やアプリのプロモーションなどがあります。

システム UI のコントロール

Android 4.0(Ice Cream Sandwich)には、システムバーの外観を暗くする、スマートフォン上で完全に非表示にするなど、システム UI 要素の可視性を制御する新しいフラグが追加されました。Android 4.1 では、setSystemUiVisibility() を呼び出して以下のフラグを渡すことで、システム UI 要素の外観とそれに関連するアクティビティ レイアウトを詳細に制御できるフラグがいくつか追加されています。

SYSTEM_UI_FLAG_FULLSCREEN
重要でないシステム UI(ステータスバーなど)を非表示にします。アクティビティがオーバーレイ モードで(android:windowActionBarOverlay を有効にして)アクションバーを使用する場合、このフラグはアクションバーも非表示にします。また、アクションバーの表示 / 非表示を切り替えると、調整されたアニメーションが使用されます。
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
システム UI 要素がまだ表示されている場合でも、SYSTEM_UI_FLAG_FULLSCREEN を有効にしたときに利用できる画面領域と同じ画面領域を使用するように、アクティビティ レイアウトを設定します。レイアウトの一部がシステム UI によってオーバーレイされますが、SYSTEM_UI_FLAG_FULLSCREEN を使用してシステム UI の非表示と表示が頻繁に行われる場合は、システム UI が非表示または表示されるたびにレイアウトが新しいレイアウト境界に合わせて調整されなくなるため、この方法が便利です。
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
システム UI 要素がまだ表示されている場合でも、SYSTEM_UI_FLAG_HIDE_NAVIGATION(Android 4.0 で追加)を有効にしたときに利用可能な画面領域と同じ画面領域を使用するように、アクティビティ レイアウトを設定します。レイアウトの一部がナビゲーション バーによってオーバーレイされますが、SYSTEM_UI_FLAG_HIDE_NAVIGATION を使用してナビゲーション バーを頻繁に表示 / 非表示するアプリの場合、ナビゲーション バーが非表示または表示されるたびに新しいレイアウト境界に合わせてレイアウトが調整されなくなるため便利です。
SYSTEM_UI_FLAG_LAYOUT_STABLE
SYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION を使用している場合は、このフラグを追加して、ビューで fitSystemWindows() を呼び出したときに、定義された境界が使用可能な画面スペースに対して一貫しているようにします。つまり、このフラグを設定すると、fitSystemWindows() は、すべてのシステム UI を非表示にした後も、システム UI 要素の表示が変更されていないかのように動作します。

その他の関連するシステム UI フラグの詳細については、Android 4.0 で追加されたフラグに関する説明をご覧ください。

リモートビュー

GridLayoutViewStub がリムーバブル ビューになったため、アプリ ウィジェットや通知カスタム レイアウトのレイアウトで使用できます。

フォント ファミリー

Android 4.1 では、Roboto フォント スタイルのバリエーションがいくつか追加されています。合計 10 のバリエーションはアプリで使用できます。これで、アプリはライト バリアントと凝縮されたバリアントの両方のフルセットにアクセスできるようになりました。

利用可能な Roboto フォント バリアントの完全なセットは次のとおりです。

  • 標準
  • 斜体
  • 太字
  • 太字斜体
  • 浅い眠り
  • 薄い斜体
  • 縮約形(レギュラー)
  • 縮小斜体
  • 簡易太字
  • 縮約形太字斜体

新しい fontFamily 属性を textStyle 属性と組み合わせて、これらのいずれかを適用できます。

fontFamily に指定できる値は次のとおりです。

  • "sans-serif": 通常の Roboto
  • "sans-serif-light": Roboto Light
  • "sans-serif-condensed": Roboto Condensed

次に、textStyle の値 "bold""italic" を使用して、太字や斜体を適用できます。android:textStyle="bold|italic" のように、両方を適用できます。

Typeface.create() を使用することもできます。たとえば、Typeface.create("sans-serif-light", Typeface.NORMAL) のように指定できました。

入力フレームワーク

複数の入力デバイス

新しい InputManager クラスを使用すると、現在接続されている入力デバイスのセットをクエリし、新しいデバイスが追加、変更、削除されたときに通知を受け取るように登録できます。これは、複数のプレーヤーをサポートするゲームを作成しており、接続されているコントローラの数や、コントローラの数が変更されたタイミングを検出したい場合に特に便利です。

getInputDeviceIds() を呼び出すと、接続されているすべての入力デバイスをクエリできます。これは整数の配列を返します。それぞれの配列は異なる入力デバイスの ID です。次に、getInputDevice() を呼び出して、指定した入力デバイス ID の InputDevice を取得できます。

新しい入力デバイスが接続、変更、接続解除されたときに通知を受け取るには、InputManager.InputDeviceListener インターフェースを実装して registerInputDeviceListener() に登録します。

入力コントローラのバイブレーション

接続された入力デバイスに独自のバイブレーション機能がある場合、InputDevicegetVibrator() を呼び出すだけで、既存の Vibrator API を使用してデバイスのバイブレーションを制御できるようになりました。

権限

新しい権限は次のとおりです。

READ_EXTERNAL_STORAGE
外部ストレージへの保護された読み取りアクセスを提供します。Android 4.1 では、デフォルトですべてのアプリに引き続き読み取りアクセス権が付与されています。これは今後のリリースで変更され、アプリケーションがこの権限を使用して読み取りアクセスを明示的にリクエストすることが必要になります。アプリケーションがすでに書き込みアクセス権をリクエストしている場合は、読み取りアクセス権も自動的に付与されます。読み取りアクセス制限を有効にする新しい開発者向けオプションが追加されました。このオプションを使用すると、Android の今後の動作に対してアプリをテストすることができます。
android.Manifest.permission.READ_USER_DICTIONARY
アプリに単語リストの読み取りを許可します。これは、IME、または設定アプリなどの辞書エディタでのみ要求する必要があります。
READ_CALL_LOG
着信と発信に関する情報を含むシステムの通話履歴をアプリが読み取ることを許可します。
WRITE_CALL_LOG
スマートフォンに保存されているシステムの通話履歴をアプリが変更できるようにします
android.Manifest.permission.WRITE_USER_DICTIONARY
アプリによるユーザーの単語辞書への書き込みを許可します。

デバイスの機能

Android 4.1 には、テレビ画面にユーザー インターフェースを表示する専用のデバイス向けの新しい機能宣言 FEATURE_TELEVISION が含まれています。アプリにテレビ インターフェースが必要であることを宣言するには、マニフェスト ファイルで <uses-feature> 要素を使用してこの機能を宣言します。

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

この機能は、「テレビ」を一般的なリビングルームのテレビ エクスペリエンスとして定義します。大画面で、ユーザーが離れた場所に座り、D-pad のような入力形式が主流で、通常はタップやマウス/ポインタ デバイスを使用しません。