Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Android 6.0 API

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

開発の開始

Android 6.0 対応アプリの開発を始めるには、最初に Android SDK を入手する必要があります。次に、SDK Manager を使用して Android 6.0 SDK プラットフォームとシステム イメージをダウンロードします。

対象 API レベルのアップデート

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

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

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

指紋認証

このリリースでは、対象端末での指紋スキャンを使用したユーザー認証を可能にする新しい API が提供されています。これらの API は、Android キーストローク システムと共に使用します。

指紋スキャンでユーザーを認証するには、新しい FingerprintManager クラスのインスタンスを取得して、authenticate() メソッドを呼び出します。なお、アプリは指紋センサー付きの対応端末で実行されている必要があります。指紋認証フローのユーザー インターフェースをアプリに実装し、Android 標準の指紋アイコンを UI に使用する必要があります。Android 指紋アイコン(c_fp_40px.png)は指紋ダイアログのサンプルに含まれています。指紋認証を使用するアプリを複数開発する場合は、それぞれのアプリで個別にユーザーの指紋を認証する必要があります。

アプリでこの機能を使用するには、まずマニフェストに USE_FINGERPRINT パーミッションを追加する必要があります。

<uses-permission
        android:name="android.permission.USE_FINGERPRINT" />

アプリでの指紋認証の実装については、指紋ダイアログのサンプルをご覧ください。これらの認証 API を他の Android API とともに使用する方法については、指紋と支払いの API のビデオをご覧ください。

この機能をテストする場合は、次のステップに従います。

  1. Android SDK Tools Revision 24.3 をインストールします(まだインストールしていない場合)。
  2. [Settings] > [Security] > [Fingerprint] と選択し、登録手順に従ってエミュレータに新しい指紋を登録します。
  3. エミュレータを使って、次のコマンドで指紋のタッチイベントをエミュレートします。同じコマンドを使って、ロック画面やアプリでの指紋のタッチイベントをエミュレートします。
    adb -e emu finger touch <finger_id>
    

    Windows では、telnet 127.0.0.1 <emulator-id>finger touch <finger_id> の順に実行する必要がある場合があります。

資格情報の確認

アプリで、ユーザーがいつ、最後に端末のロックを解除したかに基づいて、ユーザーを認証できます。この機能によって、ユーザーがアプリ固有のパスワードを覚えたり、開発者が独自の認証ユーザー インターフェースを実装したりする必要がなくなります。アプリでこの機能を使用する場合は、ユーザー認証用の公開鍵または秘密鍵の実装も組み合わせる必要があります。

ユーザーが正常に認証された後、同じキーを再使用できるタイムアウト期間を設定するには、KeyGenerator またはKeyPairGenerator をセットアップした後、新しい setUserAuthenticationValidityDurationSeconds() メソッドを呼び出します。

再認証ダイアログを過度に表示しないようにします。アプリでは、まず暗号オブジェクトを使用し、タイムアウトした場合は createConfirmDeviceCredentialIntent() メソッドを使用してユーザーをアプリ内で再認証するようにします。

アプリでのこの機能の実装については、資格情報の確認サンプルをご覧ください。

アプリのリンク機能

このリリースでは、アプリのリンク機能を改良することで Android のインテント システムが強化されました。この機能では、所有するウェブ ドメインにアプリを関連付けることができます。この関連付けに基づいて、プラットフォームが特定のウェブリンクの処理に使用するデフォルトのアプリを決めることができ、ユーザーにアプリを選択させる操作をスキップできます。この機能の実装方法については、アプリのリンク機能をご覧ください。

アプリの自動バックアップ

システムで、アプリの自動フルデータ バックアップと復元を実行できるようになりました。この動作を有効にするには、アプリで Android 6.0(API レベル 23)を対象にする必要があります。追加のコードは必要ありません。ユーザーが Google アカウントを削除すると、バックアップ データも削除されます。この機能の仕組みとファイル システムでバックアップ対象を設定する方法については、アプリの自動バックアップの設定をご覧ください。

ダイレクト シェア

このリリースでは、ユーザーが直感的にすばやく共有処理を行えるようにするための API が提供されています。アプリで特定のアクティビティを起動するダイレクト シェアのターゲットを定義すると、それらのダイレクト シェアのターゲットは [Share] メニューに表示されるようになります。この機能を使うと、他のアプリ内にある連絡先などのターゲットにコンテンツを共有できます。たとえば、ダイレクト シェアのターゲットによって他のソーシャル ネットワーク アプリのアクティビティが起動し、そのアプリ内の特定の友人やコミュニティと直接コンテンツを共有できるようになります。

ダイレクト シェアのターゲットを有効にするには、ChooserTargetService クラスを拡張するクラスを定義する必要があります。マニフェストでサービスを宣言します。その宣言内で、BIND_CHOOSER_TARGET_SERVICE パーミッションと、SERVICE_INTERFACE アクションを使ったインテント フィルタを指定します。

次の例は、マニフェストで ChooserTargetService を宣言する方法を示しています。

<service android:name=".ChooserTargetService"
        android:label="@string/service_name"
        android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
    <intent-filter>
        <action android:name="android.service.chooser.ChooserTargetService" />
    </intent-filter>
</service>

ChooserTargetService に公開するアクティビティごとに、"android.service.chooser.chooser_target_service" という名前の <meta-data> 要素をアプリのマニフェストに追加します。

<activity android:name=".MyShareActivity”
        android:label="@string/share_activity_label">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
<meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value=".ChooserTargetService" />
</activity>

音声インタラクション

このリリースでは、音声操作と共に使用することでアプリに対話形式の音声操作機能を組み込める新しい Voice Interaction API が提供されています。isVoiceInteraction() メソッドを呼び出して、音声操作によってアクティビティがトリガーされたかどうかを判別します。トリガーされていた場合は、アプリで VoiceInteractor クラスを使用してユーザーに音声の確認や、オプションのリストからの選択などを求めることができます。

ほとんどの音声インタラクションはユーザーの音声操作から始まります。ただし、音声インタラクション アクティビティはユーザーの入力なしで開始されることもあります。たとえば、音声インタラクションを介して起動された他のアプリが、音声インタラクションを起動するインテントを送信することもあります。アクティビティがユーザーの音声クエリまたは他の音声インタラクション アプリから起動されたかどうかを判別するには、isVoiceInteractionRoot() メソッドを呼び出します。他のアプリがアクティビティを起動した場合、メソッドは false を返します。アプリは、このアクションが意図されたものであることの確認をユーザーに求める場合があります。

音声操作の実装については、音声操作のデベロッパー サイトをご覧ください。

Assist API

このリリースでは、アシスタントを介してユーザーがアプリを操作できる新しい方法が提供されています。この機能を使用するには、ユーザーがアシスタントを有効にし、現在のコンテキストを使うようにする必要があります。有効にすると、[Home] ボタンを長押しすることで、すべてのアプリ内でアシスタントを呼び出すことができます。

FLAG_SECURE フラグを設定すると、アプリが現在のコンテキストをアシスタントと共有しないように選択できます。新しい AssistContent クラスを使用すると、プラットフォームがアシスタントに渡す標準的な情報セットの他に、アプリで追加の情報を共有できます。

アプリから追加のコンテキストをアシスタントに提供するには、次のステップに従います。

  1. Application.OnProvideAssistDataListener インターフェースを実装します。
  2. registerOnProvideAssistDataListener() を使用してこのリスナーを登録します。
  3. アクティビティ固有のコンテキスト情報を提供するには、onProvideAssistData() コールバックと(オプションで)新しい onProvideAssistContent() コールバックをオーバーライドします。

追加可能なストレージ デバイス

このリリースでは、SD カードなどの外部ストレージ デバイスを追加できます。外部ストレージ デバイスを追加すると、デバイスが内部ストレージのように動作するよう暗号化とフォーマットが行われます。この機能によって、アプリとアプリの個人データをストレージ端末間で移動できるようになります。アプリを移動する際、システムはマニフェストの android:installLocation を遵守します。

アプリが次の API やフィールドにアクセスする場合は、アプリが内部ストレージ端末と外部ストレージ端末間で移動する際に返されるファイルパスが動的に変化することに注意してください。ファイルパスの構築時は、これらの API を動的に呼び出すことを強くお勧めします。ハードコードされたファイル パスを使用したり、過去にビルドした完全修飾ファイルパスをそのまま使用したりしないでください。

この機能をデバッグするには、次のコマンドを実行することによって、USB On-The-Go(OTG)ケーブルを介して Android 端末に接続されている USB ドライブの追加を有効にします。

$ adb shell sm set-force-adoptable true

通知

このリリースでは、通知に関して次のような API の変更が追加されています。

Bluetooth タッチペンのサポート

このリリースでは、Bluetooth タッチペンを使用したユーザー入力のサポートが強化されました。互換性のある Bluetooth タッチペンとスマートフォンやタブレットをペア設定して接続できます。接続されている間は、タッチ スクリーンからの位置情報とタッチペンからの筆圧やボタン情報を合わせることで、タッチ スクリーン単独の場合よりも表現の幅が大きく広がります。View.OnContextClickListener オブジェクトと GestureDetector.OnContextClickListener オブジェクトをアクティビティに登録すると、タッチペンのボタンが押されたことをアプリがリッスンし、次のアクションを実行できるようになります。

タッチペンのボタン操作を検出するには、MotionEvent メソッドと定数を使用します。

  • ユーザーがタッチペンでアプリ画面のボタンをタップすると、getTooltype() メソッドが TOOL_TYPE_STYLUS を返します。
  • Android 6.0(API レベル 23)を対象としたアプリでは、ユーザーがプライマリのタッチペン ボタンを押すと getButtonState() メソッドが BUTTON_STYLUS_PRIMARY を返します。タッチペンにセカンダリ ボタンがある場合は、ユーザーがそのボタンを押したときに同じメソッドで BUTTON_STYLUS_SECONDARY が返されます。ユーザーが同時に両方のボタンを押した場合、メソッドは両方の値を論理和(OR)した値を返します(BUTTON_STYLUS_PRIMARY|BUTTON_STYLUS_SECONDARY)。
  • 以前のプラットフォーム バージョンを対象としたアプリでは、getButtonState() メソッドはBUTTON_SECONDARY(プライマリのタッチペン ボタンが押されたとき)と BUTTON_TERTIARY(セカンダリのタッチペン ボタンが押されたとき)のいずれか、または両方を返します。

Bluetooth Low Energy のスキャンの改善

アプリで Bluetooth Low Energy スキャンを実行する場合は、新しいsetCallbackType() メソッドを使って、設定された ScanFilter に一致する広告パケットが最初に見つかったときと、長時間経過した後に見つかったときにコールバックを通知するようにシステムに指定します。このスキャン アプローチでは、以前のプラットフォーム バージョンで提供されていたアプローチよりも電力が効率的に使用されます。

Hotspot 2.0 Release 1 のサポート

このリリースでは、Nexus 6 および Nexus 9 端末での Hotspot 2.0 Release 1 仕様のサポートが追加されました。Hotspot 2.0 の認証情報をアプリで提供するには、setPlmn()setRealm() などの WifiEnterpriseConfig クラスの新しいメソッドを使用します。WifiConfiguration オブジェクトには、FQDN フィールドと providerFriendlyName フィールドを設定できます。新しい isPasspointNetwork() メソッドは、検出されたネットワークが Hotspot 2.0 のアクセス ポイントを表しているかどうかを示します。

4K ディスプレイ モード

対応するハードウェアで、ディスプレイの解像度を 4K レンダリングにアップグレードするようアプリから要求できるようになりました。現在の物理的解像度を照会するには、新しい Display.Mode API を使用します。UI が低い論理的解像度で描画されていて、より高い物理的解像度にアップスケールされた場合は、getPhysicalWidth() メソッドが返す物理的解像度が getSize() で報告される論理的解像度と異なる場合があります。

アプリ ウィンドウの preferredDisplayModeId プロパティを設定することで、アプリの実行時に物理的解像度を変更するようシステムに要求できます。この機能は、4K ディスプレイの解像度に切り替えたい場合に便利です。4K ディスプレイ モードのとき、UI は引き続き元の解像度(1080p など)でレンダリングされ、4K にアップスケールされますが、SurfaceView オブジェクトではコンテンツがネイティブの解像度で表示される場合があります。

テーマ化可能な ColorStateList

Android 6.0(API レベル 23)を搭載する端末で、テーマの属性が ColorStateList でサポートされるようになりました。Resources.getColorStateList() メソッドと Resources.getColor() メソッドは廃止されました。これらの API を呼び出す場合は、代わりに新しい Context.getColorStateList() メソッドか Context.getColor() メソッドを呼び出します。これらのメソッドは、ContextCompat を介して v4 appcompat ライブラリでも使用できます。

オーディオ機能

このリリースでは、次のように Android でのオーディオ処理が改善されました。

  • 新しい android.media.midi API を使った MIDI プロトコルのサポート。これらの API を使用して MIDI イベントを送受信できます。
  • デジタル オーディオの録音および再生用のオブジェクトをそれぞれ作成し、システムのデフォルトをオーバーライドするオーディオ ソースとシンク プロパティを構成するための新しい AudioRecord.Builder クラスと AudioTrack.Builder クラス。
  • オーディオと入力端末を関連付ける API フック。これは、ユーザーが Android TV に接続されているゲーム コントローラーやリモコンから音声検索を開始できるアプリの場合に特に便利です。ユーザーが検索を開始すると、システムが新しい onSearchRequested() コールバックを呼び出します。ユーザーの入力端末に組み込みのマイクがあるかどうかを判別するには、そのコールバックから InputDevice オブジェクトを取得して、新しい hasMicrophone() メソッドを呼び出します。
  • システムに現在接続されているすべてのオーディオ機器の一覧を取得できる新しい getDevices() メソッド。オーディオ機器の接続時と接続解除時にアプリで通知を受けたい場合は、AudioDeviceCallback オブジェクトを登録することもできます。

ビデオ機能

このリリースでは、ビデオ処理の API に次のような新機能が追加されました。

  • アプリケーションでオーディオ ストリームとビデオ ストリームを同期してレンダリングできる新しい MediaSync クラス。オーディオ バッファはノンブロッキング方式で送信され、コールバック経由で返されます。ダイナミック再生レートもサポートしています。
  • アプリで開かれたセッションが、リソース マネージャーによって再要求されたことを示す新しい EVENT_SESSION_RECLAIMED イベント。アプリが DRM セッションを使用する場合は、必ずこのイベントを処理し、再要求されたセッションは使用しないようにします。
  • リソース マネージャーがコーデックで使用されたメディア リソースを再要求したことを示す新しい ERROR_RECLAIMED エラーコード。この例外では、コーデックはターミナル状態に移行しているため、解放する必要があります。
  • 同時に発生できるコーデック インスタンスの最大数を得られる新しい getMaxSupportedInstances() インターフェース。
  • 高速または低速モーション再生におけるメディアの再生レートを設定する新しい setPlaybackParams() メソッド。ビデオと共にオーディオの再生を自動的に遅くしたり速くしたりもします。

カメラ機能

このリリースでは、カメラのフラッシュやカメラによる画像の再処理にアクセスするための次の新しい API が用意されています。

Flashlight API

カメラ端末にフラッシュ ユニットが付属している場合は、setTorchMode() メソッドを呼び出すことで、カメラデバイスを開かずにフラッシュ ユニットのタッチモードのオン / オフを切り替えることができます。アプリには、フラッシュ ユニットやカメラデバイスの排他的な所有権はありません。トーチモードは、カメラデバイスが利用不可になったときや、トーチをオンにしている他のカメラリソースが利用不可になったときにオフになり、利用できなくなります。他のアプリでも setTorchMode() を呼び出してトーチモードをオフにできます。最後にトーチモードをオンにしたアプリが閉じられると、トーチモードはオフになります。

registerTorchCallback() メソッドを呼び出すことで、トーチモードのステータスに関する通知を受けるようコールバックを登録できます。コールバックを初めて登録すると、現在検知されているすべてのフラッシュ ユニット付きのカメラデバイスのトーチモードのステータスと共に即座に呼び出されます。トーチモードが正常にオン / オフされると、onTorchModeChanged() メソッドが呼び出されます。

Reprocessing API

Camera2 API は、YUV とプライベートな不透明形式の画像の再処理をサポートするよう拡張されました。これらの再処理機能が使用可能であるかどうかを判別するには、getCameraCharacteristics() を呼び出して REPROCESS_MAX_CAPTURE_STALL キーをチェックします。端末が再処理をサポートしている場合は、createReprocessableCaptureSession() を呼び出して再処理可能なカメラ撮影セッションを作成し、入力バッファの再処理の要求を作成できます。

入力バッファのフローをカメラの再処理入力に接続するには、ImageWriter クラスを使用します。空のバッファを取得するには、次のプログラミング モデルを使用します。

  1. dequeueInputImage() メソッドを呼び出します。
  2. 入力バッファにデータを入力します。
  3. queueInputImage() メソッドを呼び出して、バッファをカメラに送ります。

ImageWriter オブジェクトを PRIVATE 画像と共に使用する場合、アプリから直接画像データにアクセスすることはできません。代わりに、queueInputImage() メソッドをバッファコピーなしで呼び出して、PRIVATE 画像を直接ImageWriter に渡します。

ImageReader クラスで PRIVATE 形式の画像ストリームがサポートされるようになりました。これにより、アプリが ImageReader 出力画像の循環的な画像のキューを維持でき、1 つ以上の画像を選択して、それらをカメラで再処理するために ImageWriter に送ることができます。

Android for Work の機能

このリリースには、次のような Android for Work 用の新しい API が含まれています。

  • 企業の専用端末の制御の強化:デバイス オーナーは次の設定を制御でき、企業の専用(COSU)端末を管理しやすくなります。
    • setKeyguardDisabled() メソッドを使ったキーガードの無効化と有効化。
    • setStatusBarDisabled() メソッドを使ったステータスバー(クイック設定、通知、Google Now を起動するナビゲーション スワイプアップ操作を含む)の無効化と有効化。
    • UserManagerDISALLOW_SAFE_BOOT 定数を使ったセーフブートの無効化と有効化。
    • STAY_ON_WHILE_PLUGGED_IN 定数を使った電源接続時の画面オフの回避。
  • デバイス オーナーによるアプリのサイレント インストールとアンインストール:デバイス オーナーでは、PackageInstaller API を使って、Google Play for Work から独立してアプリケーションをサイレントにインストール、アンインストールできます。デバイス オーナー経由で、ユーザー操作なしでアプリを取得したりインストールしたりできる端末を提供できます。この機能は、Google アカウントのアクティベートなしでキオスクや同様の端末のワンタッチ プロビジョニングを有効にする際に便利です。
  • 企業証明書へのサイレント アクセス: ユーザーが証明書の選択を求められる前にアプリが choosePrivateKeyAlias() を呼び出すと、プロファイルやデバイス オーナーが onChoosePrivateKeyAlias() メソッドを呼び出して要求元のアプリケーションにエイリアスをサイレント状態で提供します。この機能によって、ユーザー操作なしでマネージド アプリが証明書にアクセスできるようになります。
  • システム アップデートの自動適用:setSystemUpdatePolicy() を使ってシステム アップデートのポリシーを設定することによって、デバイス オーナーはキオスク端末などでシステム アップデートが自動的に適用されるようにしたり、ユーザーが操作しないようアップデートを最大 30 日間保留したりできます。さらに、管理者はアップデートを実行する時間枠を、キオスク端末が使用されていない時間帯などに設定できます。利用可能なシステムアップデートがある場合、システムは Device Policy Controller アプリにシステムアップデートのポリシーがあるかどうかを確認し、それに基づいて動作します。
  • 代理証明書のインストール:プロファイルやデバイス オーナーで、サードパーティ アプリが次の DevicePolicyManager 証明書の管理 API を呼び出す権限を付与できるようになりました。
  • データ使用のトラッキング:プロファイルやデバイス オーナーでは、新しい NetworkStatsManager メソッドを使用して、[Settings] > [Data] に表示されるデータ使用統計情報を照会できます。プロファイル オーナーには管理するプロファイルのデータを照会するためのパーミッションが自動的に付与され、デバイス オーナーには管理されるプライマリ ユーザーの使用データへのアクセス権が付与されます。
  • 実行時パーミッションの管理:

    プロファイルやデバイス オーナーは、setPermissionPolicy() を使用する全アプリケーションのすべての実行時の要求に対するパーミッション ポリシーを設定でき、ユーザーにパーミッションを付与するよう要求する、自動的に付与する、パーミッションをサイレントに拒否する、のいずれかを行うことができます。後者のポリシーが設定されている場合、ユーザーはプロファイル オーナーやデバイス オーナーによって選択された内容を [Settings] にあるアプリのパーミッション画面で変更できません。

  • [Settings] の VPN:VPN アプリは、[Settings] > [More] > [VPN] に表示されます。さらに、VPN の使用に関する通知は、その VPN の構成状況に固有の内容になります。プロファイル オーナーの場合、通知は VPN が マネージド プロファイル、個人プロファイル、または両方のどれに構成されているかによって、固有のものになります。デバイス オーナーの場合、通知は VPN が端末全体に構成されているかどうかに応じて、固有のものになります。
  • ワーク ステータスの通知:マネージド プロファイルからのアプリのアクティビティがフォアグラウンドにある場合は、ステータスバーのブリーフケース アイコンが表示されます。さらに、端末がマネージド プロファイルのアプリのアクティビティに対して直接アンロックされている場合、ユーザーが仕事用プロファイル内にいることがトースト通知で表示されます。