Android 4.1 API

API レベル: 16

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

アプリ デベロッパーは、Android Emulator と、アプリのビルドに使用できる SDK プラットフォームとして、実行できるシステム イメージとして Android 4.1 を SDK Manager から入手できます。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 を使用して IntentstartActivity() を呼び出します。さらに、EXTRA_LIVE_WALLPAPER_COMPONENT の文字列としてライブ壁紙 ComponentName を指定するエクストラを指定します。

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

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 を追加するだけで、適切な動作を実現できます。

マルチメディア

Media Codec

MediaCodec クラスは、メディアのエンコードとデコード用の低レベルのメディア コーデックへのアクセスを提供します。MediaCodec をインスタンス化するには、createEncoderByType() を呼び出してメディアをエンコードするか、createDecoderByType() を呼び出してメディアをデコードします。これらの各メソッドは、エンコードまたはデコードするメディアのタイプ("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 クラスが、音声をキャプチャする際に追加のオーディオ前処理タイプをサポートするようになりました。

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

これらのプリプロセッサ エフェクトは、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 を実装し、NsdServiceInfo を使用して registerService() に渡す必要があります。

ネットワーク上のサービスを検出するには、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 精度をサポート。
  • Compute スクリプトから RS オブジェクトからの追加情報のクエリをサポートします。
  • パフォーマンスを大幅に改善。

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

注: 試験運用版の 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 つ高いものと低いものがあります。

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

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

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

SYSTEM_UI_FLAG_FULLSCREEN
重要でないシステム UI(ステータスバーなど)を非表示にします。 アクティビティで(android:windowActionBarOverlay を有効にして)アクションバーをオーバーレイ モードで使用する場合、このフラグでアクションバーも非表示になります。2 つの表示時と表示時の両方で調整されたアニメーションが使用されます。
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 のような入力形式が主流であり、通常はタップやマウス/ポインタ デバイスを使用しません。