Android 5.0 API

API レベル: 21

Android 5.0(Lollipop)は、ユーザーとアプリ デベロッパーに新しい機能を提供します。このドキュメントでは、注目すべき新しい API の概要について説明します。

アプリを公開している場合は、アプリで考慮する必要のある Android 5.0 の動作の変更点を確認してください。これらの動作変更は、新しい API を使用していない場合や新しい機能をターゲットとしていない場合でも、Android 5.0 デバイスのアプリに影響する可能性があります。

新しいプラットフォーム機能の概要については、Android Lollipop の特長をご覧ください。

開発する

Android 5.0 向けのアプリの作成を開始するには、まず Android SDK を入手する必要があります。次に、SDK Manager を使用して Android 5.0 SDK プラットフォームとシステム イメージをダウンロードします。

対象 API レベルを更新する

Android 5.0 を搭載している端末向けにアプリを最適化するには、targetSdkVersion"21" に設定し、Android 5.0 システム イメージにアプリをインストールした後、この変更を加えたアップデート済みのアプリを公開します。

Android 5.0 の API を使用しながらも、以前のバージョンをサポートすることもできます。そのためには、minSdkVersion でサポートされていない API を実行する前に、システムの API レベルを確認する条件をコードに追加します。下位互換性の維持について詳しくは、異なるプラットフォーム バージョンのサポートをご覧ください。

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

重要な動作変更

過去に Android にアプリを公開したことがある場合は、アプリが Android 5.0 の変更点による影響を受ける場合があります。

詳しくは、Android 5.0 の変更点をご覧ください。

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

マテリアル デザインのサポート

Android 5.0 では、Android の新しいマテリアル デザイン スタイルのサポートが追加されています。マテリアル デザインを使用して、視覚的に動的に変化し、UI 要素が自然に切り替わるアプリを作成できます。このサポートには以下が含まれます。

  • マテリアル テーマ
  • シャドウを表示
  • RecyclerView ウィジェット
  • ドローアブル アニメーションとスタイル設定効果
  • マテリアル デザインによるアニメーション効果とアクティビティ遷移効果
  • ビューの状態に基づくビュー プロパティ用の animator
  • カスタマイズ可能な UI ウィジェットと、制御可能なカラーパレットがあるアプリ バー
  • XML ベクター グラフィックをベースとするアニメーション ドローアブルと非アニメーション ドローアブル

アプリにマテリアル デザインの機能を追加する方法について詳しくは、マテリアル デザインをご覧ください。

最近使ったアプリ画面の同時実行中のドキュメントとアクティビティ

以前のリリースでは、最近の画面には、ユーザーが最近操作したアプリごとにタスクが 1 つだけ表示されていました。今後は、ドキュメントに同時実行中のアクティビティが追加される場合、必要に応じて複数のタスクをアプリで開けるようになります。この機能により、ユーザーは [最近] 画面から個々のアクティビティとドキュメントをすばやく切り替え、すべてのアプリ間で一貫した切り替え操作が可能になるため、マルチタスクが容易になります。このような同時実行タスクの例としては、ウェブブラウザ アプリで開いているタブ、生産性向上アプリでドキュメントを開く、ゲーム内での同時対戦、メッセージ アプリでのチャットなどがあります。アプリは ActivityManager.AppTask クラスを介してタスクを管理できます。

論理的な分割によってアクティビティが新しいタスクとして扱われるようにするには、startActivity() を使ってアクティビティを起動するときに FLAG_ACTIVITY_NEW_DOCUMENT を使用します。マニフェストで <activity> 要素の documentLaunchMode 属性を "intoExisting" または "always" に設定しても、この動作を実現できます。

[最近] 画面を見やすくするために、その画面に表示できるアプリからのタスクの最大数を設定できます。これを行うには、<application> 属性を android:maxRecents に設定します。現在指定できる最大タスク数は、ユーザーあたり 50 個(RAM が不足している端末の場合は 25 個)です。

最近使ったアプリ画面のタスクは、再起動後も保持されるように設定できます。永続性の動作を制御するには、android:persistableMode 属性を使用します。また、setTaskDescription() メソッドを呼び出して、履歴画面でアクティビティの視覚的プロパティ(アクティビティの色、ラベル、アイコンなど)を変更することもできます。

WebView のアップデート

Android 5.0 では WebView の実装が Chromium M37 に更新され、セキュリティと安定性が強化され、バグの修正が行われています。Android 5.0 で実行される WebView のデフォルトのユーザー エージェント文字列がアップデートされ、バージョン番号として 37.0.0.0 が設定されています。

このリリースでは PermissionRequest クラスが導入されており、アプリで getUserMedia() などのウェブ API を使用して、カメラ、マイクなどの保護されたリソースにアクセスするためのパーミッションを WebView に付与できます。WebView にパーミッションを付与するには、これらのリソースに対する適切な Android パーミッションがアプリにある必要があります。

新しい onShowFileChooser() メソッドにより、WebView の入力フォーム フィールドを使用し、ファイル選択ツールを起動して Android デバイスから画像とファイルを選択できるようになりました。

また、このリリースでは、WebAudioWebGLWebRTC オープン標準がサポートされるようになりました。 このリリースに含まれている新機能については、Android の WebView をご覧ください。

画面のキャプチャと共有

Android 5.0 では、新しい android.media.projection API を使用して、画面キャプチャ機能と画面共有機能をアプリに追加できます。この機能は、たとえば、ビデオ会議アプリで画面の共有を有効にしたい場合に便利です。

新しい createVirtualDisplay() メソッドを使用すると、アプリはメイン画面(デフォルト ディスプレイ)の内容を Surface オブジェクトにキャプチャして、ネットワーク経由で送信できます。この API では、セキュリティで保護されていない画面コンテンツのキャプチャのみを許可し、システム音声のキャプチャを許可しません。アプリで画面のキャプチャを開始するには、最初に createScreenCaptureIntent() メソッドを通じて取得した Intent を使用して画面キャプチャ ダイアログを起動することによって、ユーザーのパーミッションをリクエストする必要があります。

新しい API の使用例については、サンプル プロジェクトの MediaProjectionDemo クラスをご覧ください。

通知

ロック画面通知

Android 5.0 のロック画面には、通知を表示する機能があります。ユーザーは [設定] で、セキュアロック画面に機密性の高い通知コンテンツを表示することを許可するかどうかを選択できます。

アプリでは、セキュリティで保護されたロック画面にアプリの通知が表示されるときの詳細表示レベルを制御できます。可視性レベルを制御するには、setVisibility() を呼び出して次のいずれかの値を指定します。

  • VISIBILITY_PRIVATE: 通知のアイコンなどの基本的な情報は表示しますが、通知の完全なコンテンツは表示しません。
  • VISIBILITY_PUBLIC: 通知のすべての内容を表示します。
  • VISIBILITY_SECRET: 通知のアイコンを除いて、何も表示しません。

公開設定レベルが VISIBILITY_PRIVATE の場合は、個人情報を非表示にする通知コンテンツを秘匿化したバージョンを指定できます。たとえば、SMS アプリで「新しいテキスト メッセージが 3 件あります」という通知は表示されますが、メッセージの内容と送信者は非表示になります。この代替通知を提供するには、まず Notification.Builder を使用して代わりの通知を作成します。プライベート通知オブジェクトを作成する場合は、setPublicVersion() メソッドを使用して代わりの通知をオブジェクトに添付します。

通知メタデータ

Android 5.0 では、アプリ通知に関連付けられたメタデータを使用して、通知をよりインテリジェントに並べ替えます。メタデータを設定するには、通知を作成するときに Notification.Builder で次のメソッドを呼び出します。

  • setCategory(): デバイスが優先モードの場合のアプリ通知の処理方法をシステムに指示します(通知が着信、インスタント メッセージ、アラームを表している場合など)。
  • setPriority(): 通知の重要度が通常の通知よりも高い(または低い)ものとしてマークします。優先度フィールドが PRIORITY_MAX または PRIORITY_HIGH に設定された通知は、通知に音やバイブレーションも含まれる場合、小さなフローティング ウィンドウに表示されます。
  • addPerson(): 通知に関連するユーザーを 1 人以上追加できます。アプリは、この情報をシステムに伝え、特定の人達からの通知をグループ化したり、それらの人達からの通知を重要度が高い通知としてランク付けしたりします。

グラフィック

OpenGL ES 3.1 のサポート

Android 5.0 では、Java インターフェースと OpenGL ES 3.1 のネイティブ サポートが追加されています。OpenGL ES 3.1 で提供される主な新機能は次のとおりです。

  • コンピューティング シェーダー
  • 個別のシェーダー オブジェクト
  • 間接描画コマンド
  • マルチサンプル テクスチャとステンシル テクスチャ
  • シェーディング言語の改善
  • 高度なブレンド モードとデバッグのための拡張機能
  • OpenGL ES 2.0 や 3.0 との下位互換性

Android での OpenGL ES 3.1 の Java インターフェースは GLES31 で提供されます。OpenGL ES 3.1 を使用する場合は、マニフェスト ファイルで <uses-feature> タグと android:glEsVersion 属性を使用して宣言してください。例:

<manifest>
    <uses-feature android:glEsVersion="0x00030001" />
    ...
</manifest>

デバイスでサポートされている OpenGL ES バージョンを実行時にチェックする方法など、OpenGL ES の使用方法の詳細については、OpenGL ES API ガイドをご覧ください。

Android エクステンション パック

このリリースでは、OpenGL ES 3.1 に加えて、Java インターフェースと高度なグラフィック機能のネイティブ サポートを含む拡張パックが提供されます。Android では、これらの拡張機能は 1 つのパッケージとして扱われます。(ANDROID_extension_pack_es31a 拡張機能が存在する場合、アプリではパッケージ内のすべての拡張機能が存在すると見なし、1 つの #extension ステートメントを使用してシェーディング言語機能を有効にできます)。

拡張機能パックは以下をサポートしています。

  • シェーダー保存バッファ、イメージ、アトミックの保証されたフラグメント シェーダー サポート(OpenGL ES 3.1 ではフラグメント シェーダーのサポートはオプションです。)
  • テッセレーション シェーダーとジオメトリ シェーダー
  • ASTC(LDR)テクスチャ圧縮形式
  • サンプル単位の補間とシェーディング
  • フレーム バッファ内の各カラー アタッチメントのための各種のブレンドモード

拡張パックの Java インターフェースは GLES31Ext で提供されます。アプリのマニフェストで、拡張パックをサポートしている端末にのみアプリをインストールする必要があることを宣言できます。例:

<manifest>
    <uses-feature android:name=“android.hardware.opengles.aep”
        android:required="true" />
    ...
</manifest>

メディア

高度なカメラ機能のための Camera API

Android 5.0 では、新しい android.hardware.camera2 API が導入され、写真の撮影と画像処理をきめ細かく行うことができます。プログラムで getCameraIdList() を使用してシステムで利用可能なカメラデバイスにアクセスし、openCamera() を使用して特定のデバイスに接続できるようになりました。画像のキャプチャを開始するには、CameraCaptureSession を作成し、キャプチャした画像を送信する Surface オブジェクトを指定します。CameraCaptureSession は、バーストで単一のショットまたは複数の画像を撮影するように構成できます。

新しい画像が撮影されたときに通知を受けるには、CameraCaptureSession.CaptureCallback リスナーを実装して撮影リクエストに設定します。システムが画像キャプチャ リクエストを完了すると、CameraCaptureSession.CaptureCallback リスナーは onCaptureCompleted() の呼び出しを受け取り、CaptureResult に画像キャプチャ メタデータを提供します。

CameraCharacteristics クラスを使用すると、端末で使用できるカメラ機能をアプリで検出できます。オブジェクトの INFO_SUPPORTED_HARDWARE_LEVEL プロパティは、カメラの機能レベルを表します。

  • すべてのデバイスは少なくとも INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY のハードウェア レベルをサポートしています。このレベルは、廃止された Camera API のレベルにほぼ相当する機能を備えています。
  • INFO_SUPPORTED_HARDWARE_LEVEL_FULL ハードウェア レベルをサポートするデバイスでは、キャプチャと後処理を手動で制御し、高フレームレートで高解像度画像をキャプチャできます。

更新された Camera API の使用方法については、このリリースの Camera2BasicCamera2Video の実装サンプルをご覧ください。

オーディオの再生

このリリースには、AudioTrack に対する次の変更が含まれています。

  • アプリから音声データを浮動小数点形式(ENCODING_PCM_FLOAT)で提供できるようになりました。これにより、優れたダイナミック レンジ、より安定した精度、ヘッドルームの向上が実現します。浮動小数点演算は、中間計算で特に便利です。再生エンドポイントは、音声データに整数形式を使用し、より低いビット深度を使用します。(Android 5.0 では内部パイプラインの一部がまだ浮動小数点になっていません)。
  • アプリは、MediaCodec によって提供されるのと同じ形式の ByteBuffer として音声データを提供できるようになりました。
  • 一部のアプリでは、WRITE_NON_BLOCKING オプションを使用することでバッファ処理とマルチスレッド処理を簡素化できます。

メディア再生の制御

新しい通知とメディア API を使用して、システム UI がメディアの再生を認識し、アルバムアートを抽出して表示できるようにします。UI とサービスにまたがるメディアの再生の制御が、新しい MediaSession クラスと MediaController クラスを使用して、より簡単に行えるようになりました。

新しい MediaSession クラスは、サポートが終了した RemoteControlClient クラスに代わるもので、トランスポート コントロールとメディアボタンを処理するためのコールバック メソッドのセットが 1 つ用意されています。アプリがメディア再生を提供し、Android TV または Wear プラットフォームで実行する場合は、MediaSession クラスを使用して、同じコールバック メソッドでトランスポート コントロールを処理します。

新しい MediaController クラスを使用して独自のメディア コントローラ アプリを作成できるようになりました。このクラスは、アプリの UI プロセスからメディアの再生をモニタリングし、制御するためのスレッドセーフな方法を提供します。コントローラを作成する際は、MediaSession.Token オブジェクトを指定して、アプリが指定の MediaSession とやり取りできるようにします。MediaController.TransportControls メソッドを使用すると、play()stop()skipToNext()setRating() などのコマンドを送信して、そのセッションでメディアの再生を制御できます。コントローラにより、MediaController.Callback オブジェクトを登録し、そのセッションでメタデータや状態の変更がないかをリッスンすることもできます。

さらに、新しい Notification.MediaStyle クラスを使用して、メディア セッションに結びついた再生制御を可能にするリッチ通知を作成できます。

メディアの閲覧

Android 5.0 では、新しい android.media.browse API を通じて、アプリが別のアプリのメディア コンテンツ ライブラリをブラウジングできる機能が導入されています。アプリのメディア コンテンツを公開するには、MediaBrowserService クラスを拡張します。MediaBrowserService の実装で MediaSession.Token へのアクセスを提供することによって、アプリがそのサービスを通じて提供されるメディア コンテンツを再生できるようになります。

メディア ブラウザ サービスを操作するには、MediaBrowser クラスを使用します。MediaBrowser インスタンスを作成するときに、MediaSession のコンポーネント名を指定します。その後、アプリからブラウザ インスタンスを使用して、関連付けられたサービスに接続し、MediaSession.Token オブジェクトを取得して、そのサービスを通じて公開されたコンテンツを再生できます。

ストレージ

ディレクトリの選択

Android 5.0 ではストレージ アクセス フレームワークが拡張され、ユーザーがディレクトリのサブツリー全体を選択し、それぞれのアイテムについてユーザーの確認を必要とせずに、含まれているすべてのドキュメントへの読み取り / 書き込みアクセス権をアプリに与えることができます。

ディレクトリのサブツリーを選択するには、OPEN_DOCUMENT_TREE インテントを作成して送信します。サブツリーの選択をサポートしているすべての DocumentsProvider インスタンスが表示され、ユーザーがディレクトリを参照して選択できます。返される URI は、選択されたサブツリーへのアクセスを意味します。buildChildDocumentsUriUsingTree()buildDocumentUriUsingTree()query() とともに使用すると、サブツリーを探索できます。

新しい createDocument() メソッドを使用すると、サブツリーの任意の場所に新しいドキュメントやディレクトリを作成できます。既存のドキュメントを管理するには、renameDocument()deleteDocument() を使用します。これらの呼び出しを発行する前に、COLUMN_FLAGS をチェックして、プロバイダが呼び出しをサポートしていることを確認してください。

DocumentsProvider を実装していて、サブツリーの選択をサポートする場合は、isChildDocument() を実装し、COLUMN_FLAGSFLAG_SUPPORTS_IS_CHILD を含めます。

また、Android 5.0 では、共有ストレージ上にパッケージ固有の新しいディレクトリが導入されています。これにより、アプリは MediaStore に含めるメディア ファイルを配置できます。新しい getExternalMediaDirs() は、すべての共有ストレージ デバイスにあるこれらのディレクトリへのパスを返します。getExternalFilesDir() と同様に、返されたパスにアクセスするために、アプリに追加の権限は必要ありません。プラットフォームはこれらのディレクトリ内の新しいメディアを定期的にスキャンしますが、MediaScannerConnection を使用して新しいコンテンツを明示的にスキャンすることもできます。

ワイヤレスと接続

複数のネットワーク接続

Android 5.0 には、アプリが特定の機能を持つ利用可能なネットワークを動的にスキャンし、それらへの接続を確立できる新しいマルチネットワーキング API が用意されています。この機能は、アプリで SUPL、MMS、携帯通信会社の課金ネットワークなどの特殊なネットワークを必要とする場合や、特定のタイプのトランスポート プロトコルを使用してデータを送信したい場合に便利です。

アプリからネットワークを動的に選択して接続する手順は次のとおりです。

  1. ConnectivityManager を作成します。
  2. NetworkRequest.Builder クラスを使用して NetworkRequest オブジェクトを作成し、アプリが必要とするネットワーク機能とトランスポート タイプを指定します。
  3. 適切なネットワークをスキャンするには、requestNetwork() または registerNetworkCallback() を呼び出し、NetworkRequest オブジェクトと ConnectivityManager.NetworkCallback の実装を渡します。検出された適切なネットワークに積極的に切り替えたい場合は、requestNetwork() メソッドを使用します。スキャンされたネットワークに積極的に切り替えずに通知のみを受け取る場合は、代わりに registerNetworkCallback() メソッドを使用します。

適切なネットワークを検出すると、システムはネットワークに接続して onAvailable() コールバックを呼び出します。コールバックの Network オブジェクトを使用して、ネットワークに関する追加情報を取得したり、選択したネットワークを使用するようにトラフィックを転送したりできます。

Bluetooth Low Energy

Android 4.3 では、セントラル ロールとしての Bluetooth Low EnergyBluetooth LE)のプラットフォーム サポートが導入されました。Android 5.0 では、Android デバイスが Bluetooth LE の周辺デバイスとして機能できるようになりました。アプリでこの機能を使用すると、端末の存在を付近のデバイスに知らせることができます。たとえば、デバイスを歩数計やヘルスモニターとして機能させ、そのデータを別の Bluetooth LE デバイスと通信できるアプリを構築できます。

新しい android.bluetooth.le API を使用すると、アプリでアドバタイズメントのブロードキャスト、レスポンスのスキャン、付近の Bluetooth LE デバイスとの接続の確立を行うことができます。新しいアドバタイジング機能とスキャン機能を使用するには、マニフェストに BLUETOOTH_ADMIN 権限を追加します。ユーザーが Google Play ストアでアプリを更新またはダウンロードする際、「Bluetooth 接続情報: Bluetooth の制御(付近の Bluetooth デバイスへのブロードキャストや情報の取得など)をアプリに許可する必要があります。」

Bluetooth LE のアドバタイジングを開始して他のデバイスがアプリを検出できるようにするには、startAdvertising() を呼び出して AdvertiseCallback クラスの実装を渡します。コールバック オブジェクトは、アドバタイジング オペレーションの成功または失敗の報告を受け取ります。

Android 5.0 では、特定のタイプの必要なデバイスのみをアプリがスキャンできる ScanFilter クラスが導入されました。Bluetooth LE デバイスのスキャンを開始するには、startScan() を呼び出してフィルタのリストを渡します。メソッド呼び出しでは、Bluetooth LE アドバタイズメントが見つかった場合に報告するように ScanCallback の実装も提供する必要があります。

NFC の機能強化

Android 5.0 では、NFC をより幅広く柔軟に利用できるように、次の機能強化が追加されています。

  • Android ビームが [共有] メニューで使用できるようになりました。
  • アプリは invokeBeam() を呼び出すことで、ユーザーのデバイスで Android ビームを起動し、データを共有できます。これにより、データ転送を完了するために、ユーザーが別の NFC 対応デバイスに手動でデバイスをかざす必要がなくなります。
  • 新しい createTextRecord() メソッドを使用して、UTF-8 テキストデータを含む NDEF レコードを作成できます。
  • 決済アプリを開発している場合、registerAidsForService() を呼び出すことで NFC アプリケーション ID(AID)を動的に登録できるようになりました。setPreferredService() を使用すると、特定のアクティビティがフォアグラウンドにあるときに優先して使用するカード エミュレーション サービスを設定することもできます。

プロジェクト Volta

Android 5.0 では、新機能に加えて、バッテリーの持ちが良くなっています。新しい API やツールを使用すると、アプリの消費電力を把握して最適化できます。

ジョブのスケジュール

Android 5.0 には、電池寿命を最適化するための新しい JobScheduler API が用意されています。この API では、後で、または指定された条件(デバイスの充電中など)で、システムに非同期で実行するジョブを定義します。ジョブ スケジューリングは次のような状況で役に立ちます。

  • アプリに、ユーザーに直接公開しない処理があり、処理を延期できる。
  • 端末が電源に接続されたときに実行する作業がある場合。
  • ネットワーク アクセスまたは Wi-Fi 接続を必要とするタスクがある。
  • アプリには、定期的なスケジュールでバッチとして実行したいタスクが複数あります。

作業単位は JobInfo オブジェクトによってカプセル化されます。このオブジェクトはスケジューリング条件を指定します。

JobInfo.Builder クラスを使用して、スケジュールされたタスクの実行方法を構成します。次のような特定の条件のときに実行されるようにタスクをスケジュールできます。

  • デバイスの充電時に開始する
  • 端末が従量制ではないネットワークに接続されたときに開始する
  • デバイスがアイドル状態のときに開始する
  • 特定の期限までに、または遅延を最小限に抑えて終了する

たとえば、次のようなコードを追加して、定額制ネットワークでタスクを実行できます。

Kotlin

val uploadTask: JobInfo = JobInfo.Builder(
        jobId,
        serviceComponent /* JobService component */
).run {
    setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
    build()
}
val jobScheduler = context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
jobScheduler.schedule(uploadTask)

Java

JobInfo uploadTask = new JobInfo.Builder(jobId,
                                         serviceComponent /* JobService component */)
        .setRequiredNetworkCapabilities(JobInfo.NETWORK_TYPE_UNMETERED)
        .build();
JobScheduler jobScheduler =
        (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);

デバイスに安定した電力が供給されている場合(つまり、2 分以上電源に接続されていて電池が正常なレベルである場合)は、ジョブの期限内であっても、実行可能なスケジュール設定されたジョブが実行されます。

JobScheduler API の使用例については、このリリースの JobSchedulerSample の実装サンプルをご覧ください。

バッテリー使用量に関するデベロッパー ツール

新しい dumpsys batterystats コマンドでは、端末でのバッテリーの使用状況に関する役立つ統計データが、一意のユーザー ID(UID)別に整理されて生成されます。次のような統計情報が生成されます。

  • バッテリー関連のイベントの履歴
  • デバイスの全体的な統計情報
  • UID およびシステム コンポーネント別の概算消費電力
  • アプリごとのモバイル(ミリ秒)/ パケット
  • システム UID 別に集計された統計情報
  • アプリ UID の集計統計情報

--help オプションを使用して、出力をカスタマイズするためのさまざまなオプションを確認します。たとえば、特定のアプリ パッケージについて、デバイスが最後に充電されてからのバッテリー使用量の統計情報を出力するには、次のコマンドを実行します。

$ adb shell dumpsys batterystats --charged <package-name>

dumpsys コマンドの出力に対して Battery Historian ツールを使用すると、電源に関するイベントを表示する HTML をログから生成できます。この情報によって、バッテリーに関連した問題の把握や診断が容易になります。

職場や学校での Android

管理対象プロビジョニング

Android 5.0 には、エンタープライズ環境内でアプリを実行するための新機能が用意されています。ユーザーが既存の個人アカウントを持っている場合、デバイス管理者は管理対象プロビジョニング プロセスを開始して、共存する独立した管理対象プロファイルをデバイスに追加できます。マネージド プロファイルに関連付けられたアプリは、管理対象外のアプリとともに、ユーザーのランチャー、最近使ったアプリ画面、通知に表示されます。

管理対象プロビジョニング プロセスを開始するには、IntentACTION_PROVISION_MANAGED_PROFILE を送信します。呼び出しが成功すると、システムは onProfileProvisioningComplete() コールバックをトリガーします。その後、setProfileEnabled() を呼び出してこのマネージド プロファイルを有効にできます。

デフォルトでは、管理対象プロファイルで有効になるのは一部のアプリのみです。 管理対象プロファイルに追加のアプリをインストールするには、enableSystemApp() を呼び出します。

ランチャー アプリを開発している場合は、新しい LauncherApps クラスを使用して、現在のユーザーの起動可能なアクティビティのリストと、関連するマネージド プロファイルを取得できます。ランチャーでドローアブルなアイコンにワーク バッジを付けると、マネージド アプリを視覚的に目立たせることができます。バッジアイコンを取得するには、getUserBadgedIcon() を呼び出します。

新機能の使用方法については、このリリースの BasicManagedProfile 実装サンプルをご覧ください。

デバイス オーナー

Android 5.0 では、デバイス オーナー アプリをデプロイする機能が導入されています。デバイス所有者は特殊なタイプのデバイス管理者で、セカンダリ ユーザーの作成と削除、デバイスの全般設定の構成を行う権限があります。デバイス オーナー アプリは、DevicePolicyManager クラスのメソッドを使用して、管理対象デバイス上の設定、セキュリティ、アプリをきめ細かく制御できます。 1 つのデバイスに設定できるデバイス所有者は、一度に 1 人のみです。

デバイス所有者をデプロイして有効にするには、デバイスがプロビジョニングされていない状態のときに、プログラミング アプリからデバイスへの NFC データ転送を行う必要があります。このデータ転送では、管理されたプロビジョニングで説明しているプロビジョニング インテントと同じ情報が送信されます。

画面の固定

Android 5.0 では、新しい画面固定 API が導入されており、ユーザーがタスクから離れることや通知による割り込みを一時的に制限できます。これは、たとえば、Android で重要度の高い評価要件に対応した教育用アプリや、単一用途のアプリ、またはキオスク アプリを開発している場合に使用できます。アプリで画面固定を有効にすると、そのモードを終了するまで、ユーザーは通知を表示することも、他のアプリにアクセスすることも、ホーム スクリーンに戻ることもできなくなります。

画面固定を有効にする方法は 2 つあります。

  • 手動: ユーザーは [設定] > [セキュリティ] > [画面固定] で画面固定を有効にして、最近使ったアプリ画面の緑色のピン アイコンをタップすることによって、固定するタスクを選択できます。
  • プログラムで行う: 画面固定をプログラムで有効にするには、アプリから startLockTask() を呼び出します。リクエスト元のアプリがデバイス所有者でない場合は、確認を求めるメッセージがユーザーに表示されます。デバイス オーナー アプリは setLockTaskPackages() メソッドを呼び出して、ユーザー確認ステップなしでアプリの固定を可能にすることができます。

タスク固定をアクティブにすると、次のような動作になります。

  • ステータス バーが空になり、ユーザーの通知やステータス情報が表示されません。
  • [Home] ボタンと [Recent Apps] ボタンが表示されません。
  • 他のアプリは新しいアクティビティを起動できません。
  • 新しいタスクが作成されない限り、現在のアプリから新しいアクティビティを起動できます。
  • 画面固定がデバイス オーナーによって開始された場合は、アプリが stopLockTask() を呼び出すまで、ユーザーはアプリにロックされたままになります。
  • 画面固定がデバイス オーナーでない別のアプリによってアクティブ化された場合、またはユーザーが直接アクティブ化した場合、ユーザーは [Back] ボタンと [Recent] ボタンを同時に押すことによって画面固定を終了できます。

印刷フレームワーク

PDF をビットマップとしてレンダリング

新しい PdfRenderer クラスを使用して、PDF ドキュメントのページを印刷用のビットマップ画像にレンダリングできるようになりました。システムが印刷可能なコンテンツを書き込む、シーク可能な(つまり、コンテンツにランダムにアクセスできる)ParcelFileDescriptor を指定する必要があります。アプリは、openPage() でレンダリング用のページを取得し、render() を呼び出して、開いた PdfRenderer.Page をビットマップに変換できます。また、ドキュメントの一部のみをビットマップ画像に変換する場合も、追加のパラメータを設定できます(ドキュメントを拡大するタイル レンダリングを実装する場合など)。

新しい API の使用例については、PdfRendererBasic のサンプルをご覧ください。

システム

アプリの使用統計情報

新しい android.app.usage API を使用して、Android デバイスでアプリの使用状況履歴にアクセスできるようになりました。この API では、非推奨の getRecentTasks() メソッドよりも詳細な使用状況情報が提供されます。 この API を使用するには、まずマニフェストで "android.permission.PACKAGE_USAGE_STATS" 権限を宣言する必要があります。また、ユーザーは [設定] > [セキュリティ] > [アプリ] からこのアプリの使用状況へのアクセス権を有効にする必要があります。

使用状況データはアプリ単位で収集され、日次、週次、月次、年次の各期間でデータが集計されます。システムがこのデータを保持する最大期間は次のとおりです。

  • 日別データ: 7 日間
  • 週次のデータ: 4 週間
  • 月次データ: 6 か月
  • 年別データ: 2 年

アプリごとに、次のデータが記録されます。

  • アプリが最後に使用された日時
  • 特定の期間(日、週、月、年)にアプリがフォアグラウンドで実行されていた合計時間
  • 1 日の間にコンポーネント(パッケージとアクティビティ名により識別される)がフォアグラウンドまたはバックグラウンドに移動したときに取得されるタイムスタンプ
  • 端末の設定が変更されたとき(回転して端末画面の向きが変化したときなど)に取得されるタイムスタンプ

テストとユーザー補助

テストとアクセシビリティの改善

Android 5.0 では、テストとアクセシビリティに関する次のサポートが追加されています。

  • 新しい getWindowAnimationFrameStats() メソッドと getWindowContentFrameStats() メソッドは、ウィンドウ アニメーションとコンテンツのフレーム統計情報をキャプチャします。これらのメソッドを使用して計測テストを作成すると、アプリがスムーズな操作性を提供するのに十分なリフレッシュ レートでフレームを描画しているかどうかを評価できます。
  • 新しい executeShellCommand() メソッドを使用すると、計測テストからシェル コマンドを実行できます。コマンドの実行は、デバイスに接続されているホストから adb shell を実行する場合と同様に、dumpsysamcontentpm などのシェルベースのツールを使用できます。
  • ユーザー補助 API(UiAutomator など)を使用するユーザー補助サービスとテストツールで、目の見えるユーザーが操作できる画面上のウィンドウのプロパティに関する詳細情報を取得できるようになりました。AccessibilityWindowInfo オブジェクトのリストを取得するには、新しい getWindows() メソッドを呼び出します。
  • 新しい AccessibilityNodeInfo.AccessibilityAction クラスを使用すると、AccessibilityNodeInfo で実行する標準のアクションやカスタマイズされたアクションを定義できます。新しい AccessibilityNodeInfo.AccessibilityAction クラスは、以前 AccessibilityNodeInfo にあったアクション関連の API の代わりとなります。
  • Android 5.0 では、音声合成によるテキスト読み上げをよりきめ細かくアプリで制御できます。新しい Voice クラスを使用すると、特定のロケール、品質、遅延レーティングに関連付けられた音声プロファイルや、テキスト読み上げ(TTS)エンジン固有のパラメータをアプリで使用できます。

IME

入力言語の切り替えがより簡単に

Android 5.0 以降では、プラットフォームでサポートされているすべてのインプット メソッド エディタ(IME)を簡単に切り替えることができます。指定された切り替えアクション(通常はソフト キーボードの地球アイコンのタップ)を行うと、それらのすべての IME が循環して切り替わります。この動作変更は、shouldOfferSwitchingToNextInputMethod() メソッドで実装します。

さらに、次の IME に切り替えメカニズムがそもそも含まれているかどうか(つまり、その IME がその後の IME への切り替えをサポートしているかどうか)を確認するようになりました。切り替えメカニズムを備えた IME から切り替えるメカニズムのない IME には切り替わりません。この動作の変更は、switchToNextInputMethod() メソッドで実装されます。

最新の IME 切り替え API の使用例については、このリリースの更新済みのソフト キーボード実装サンプルをご覧ください。IME の切り替えを実装する方法について詳しくは、入力方法の作成をご覧ください。

マニフェストの宣言

宣言可能な必須機能

次の値が <uses-feature> 要素でサポートされるようになり、アプリで必要な機能を有する端末にのみアプリがインストールされるようにできます。

ユーザー権限

次の権限が <uses-permission> 要素でサポートされ、アプリで特定の API にアクセスするために必要な権限を宣言できるようになりました。

  • BIND_DREAM_SERVICE: API レベル 21 以降をターゲットとする場合、システムのみがバインドできるようにするために、Daydream サービスにこの権限が必要となります。