Android 6.0(M)はアプリ開発者とユーザーに新機能を提供します。
このドキュメントでは注目のAPI群について紹介します。
原文
Android6.0 API群
開発を始める
Android6.0向けのアプリ開発を始めるためにはまずはじめにget the Android SDKでAndroid SDKを取得します。次にSDK Managerを使ってAndroid 6.0 SDK PlatformとSystem Imagesをダウンロードします。target API levelをアップデートする
更新されたアプリを公開する前にテストを行ってください。アプリを端末に最適化するために、targetSdkVersionに23を設定し、Android system imageにインストールしてテストを行います。
minSdkVersionで指定したバージョンではサポートされていないAPIを使用する場合には、使用する前にシステムのAPI levelを確認することで、古いバージョンをサポートしたまま新しいAPIを使用することが出来ます。
後方互換性を維持する方法について詳しくはSupporting Different Platform Versionsを読んでください。
API levelの動作について詳細はWhat is API Level?を読んでください。
指紋認証
このリリースでは新しいAPIによって対応端末上で指紋を使ったユーザー認証を行わせることが可能です。このAPIはAndroid Keystore systemと連携します。指紋を使ったユーザー認証を行わせるためには、新しいFingerprintManagerクラスを使ってauthenticate()メソッドを呼びます。アプリが指紋認証に対応した端末上で動作している必要があります。
指紋認証を行うためのUIを実装するときには標準のAndroid指紋アイコンをUI上で使用する必要があります。Andriod指紋認証アイコン(c_fp_40px.png)はFingerprint Dialog sampleに入っています。もし、指紋認証を使う複数のアプリを作っている場合、それぞれのアプリで独立して指紋認証を行う必要が有ることに注意してください。
アプリ内でこの機能を使用するときまずmanifestにUSE_FINGERPRINT permissionを追加します。
<uses-permission
android:name="android.permission.USE_FINGERPRINT" />
指紋認証の実装を見るにはFingerprint Dialog sampleを参照してください。 指紋認証を他のAndroid APIと連携させるデモについてはFingerprint and Payment APIsのビデオを見てください。
この機能を試すには以下の手順に従ってください。
1. Android SDK Tools Revision24.3をインストールします。
2.エミュレーターに指紋を登録するために、設定>セキュリティ>指紋 を選び、導入画面従って「登録の開始」まで画面を進めてください。
3.エミュレータで指紋のタッチイベントをエミュレートするために、次のコマンドを使います。同じコマンドをロックスクリーンやあなたのアプリでも使用してください。
adb -e emu finger touch <finger_id>
Windowsを使用している場合は、finget touch
証明の確認
最後に端末をロック解除してからどれくらいの時間が経っているかに基づいてアプリ内でユーザーを認証することが出来ます。この機能により、ユーザーはアプリ専用のパスワードを覚えておく必要がなくなり、開発者は認証ユーザーインターフェイスを実装する必要もなくなります。アプリはユーザー認証のために公開鍵または秘密鍵を合わせてこの機能を使用する必要があります。ユーザーが認証に成功したら、同じ鍵を再利用できるタイムアウト期間を設定するために、KeyGeneratorあるいはKeyPairGeneratorをセットアップするときにsetUserAuthenticationValidityDurationSeconds()を呼びます。
過剰に再認証ダイアログが表示されることを防ぐために、アプリはcryptographicオブジェクトを最初に使って見る必要があります。もし、タイムアウトになったらcreateConfirmDeviceCredentialIntent()メソッドを呼ぶことでアプリ内で再認証を行うことが出来ます。
この機能を実装する方法についてはConfirm Credential sampleを見てください。
App Linking
このバージョンではより強力なapp linkingが提供されAndroidのintentの仕組みが強化されました。この機能によりアプリとあなたの所有するWebドメインを連携させることが出来ます。この連携に基づき、プラットフォームは特定のURLに関連するデフォルトアプリを認識しユーザーがアプリを選択するプロンプトをスキップする事ができます。この機能を実装する方法はHandling App Linksを参照してください。Auto Backup for Apps
システムはアプリの全データを自動的にバックアップ・復元するようになりました。アプリのtarget APIがAndroid6.0(API Level23)以上の時、この機能が有効になります。コードには何一つ追加する必要はありません。もしユーザーがGoogleアカウントを削除するとこれらのバックアップデータも削除されます。この機能がどのように働き、ファイルシステム上でバックアップがどのように構成されるかについてはConfiguring Auto Backup for Appsを読んでください。Direct Share
このリリースではユーザーが直感的に素早く共有を行うことが出来るAPIが導入され、あなたのアプリでDirect share対象となる特定のActivityを指定することが出来るようになりました。Direct shareの対象は共有メニューを通じてユーザーに表示されます。この機能によりユーザは連絡先やその他アプリに登録された対象にコンテンツを共有することが出来ます。Direct shareの対象は例えば別のソーシャルネットワークアプリのActivityなどです。これによりユーザーはアプリ内に登録された特定の友人やコミュニティにコンテンツを直接共有できます。Direct share対象を有効にするためにはChooserTargetServiceを継承したクラスを作成します。サービスをManifestで宣言します。BIND_CHOOSER_TARGET_SERVICEpermissionを宣言し、SERVICE_INTERFACEアクションのintent filterを使用します。
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で表示する各Activityに対してmanifestで meta-data 要素に name "android.service.chooser.chooser_target_service"を追加します。
<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>
声による対話
このリリースでは新しい音声対話APIがVoice Actionsとして提供されます。これにより、声での対話ができるアプリを開発することが出来ます。音声アクションによりActivityを起動したかどうか調べるにはisVoiceInteraction()メソッドを呼びます。もし、そうであればVoiceInteractorクラスを使って、ユーザーに選択リストから選ばせるなどの音声操作をリクエストできます。多くの音声対話は、ユーザーの音声アクションから開始されます。しかし、ユーザーによる入力がない状態で音声対話のActivityを始めることも出来ます。例えば、他のアプリから音声対話によって起動された時、音声対話のActivityを起動するIntentを送信することが出来ます。
あなたのActivityがユーザーからの音声対話で起動されたのか、他の音声対話アプリから起動されたのかを調べるにはisVoiceInteractionRoot()メソッドを使います。もし他のアプリからActivityが起動されていたらメソッドはfalseを返します。これによりあなたのアプリはIntentのアクションをユーザーに確認する事もできます。
音声アクションを実装する方法についてはVoice Actions developer site
音声アクションを実装する方法について学ぶにはVoice Actions developer siteを読んでください。
Assist API
このリリースではアシスタントを通じて、ユーザーとアプリを結びつける新しい方法を提供します。この機能を使用するにはユーザーは現在の状況を使用できるようにアシスタントを有効にする必要があります。
有効にすれば、ユーザーはホームボタンを長押しすることでどんなアプリからでもアシスタントを呼び出すことが出来ます。
アプリで現在状況をアシスタントと共有したくない時は、FLAG_SECUREフラグを設定します。
新しいAssistContentクラスを使うことでプラットフォームがアシスタントに共有する標準的な情報のセットに加えて、アプリから追加の情報をアシスタントと共有することが出来ます。
アプリ内の追加の状況をアシスタントに提供するには以下の手順を行います。
1. Application.OnProvideAssistDataListenerインターフェースを実装する。
2.registerOnProvideAssistDataListener()を使用してlistenerを設定する。
3.Activity特有の状況についての情報を提供するために、onProvideAssistData()コールバックをOverrideして、必要ならば新しいonProvideAssistContent()コールバックをOverrideします。
ストレージデバイスを取り込む
このリリースではユーザーがSDカードのような拡張ストレージデバイスを取り込むことが出来ます。拡張デバイスを取り込むには内部ストレージのように振る舞わせるために初期化して暗号化します。この機能によりユーザーはアプリやアプリの個人的なデータをストレージデバイス間で移動することが出来ます。アプリを移動出来るかどうかについて、システムはmanifestにあるandroid:installLocationの設定に従います。もし、アプリが以下のAPI群やフィールドにアクセスしているならば、それらのファイルパスは内部ストレージと外部ストレージを移動した時に動的に変化することに注意してください。ファイルパスをビルドするときには、常にこれらのAPIを呼ぶことを強く推奨します。
ハードコードしたファイルパスを使ってはいけません。また、1度作った絶対パスがずっと使えるとは限りません。
Contextのメソッド
・getFilesDir()
・getCacheDir()
・getCodeCacheDir()
・getDatabasePath()
・getDir()
・getNoBackupFilesDir()
・getFileStreamPath()
・getPackageCodePath()
・getPackageResourcePath()
ApplicationInfoのフィールド
・dataDir
・sourceDir
・nativeLibraryDir
・publicSourceDir
・splitSourceDirs
・splitPublicSourceDirs
次のコマンドでデバッグのためにUSB On-The-Go (OTG)で接続されているUSBドライブに対してこの機能を有効にすることができます。
$ adb shell sm set-force-adoptable true
Notifications
このリリースではNotificationに対して次のAPIに変更が加わっています。・新しいINTERRUPTION_FILTER_ALARMSフィルターレベルは「通知を非表示」が「アラームのみ」に設定されている時に合致します。
・新しいCATEGORY_REMINDERカテゴリーはユーザースケジュールのリマインダーをそれ以外の(CATEGORY_EVENT)やアラーム(CATEGORY_ALARM)と区別します。
・新しいIconクラスはsetSmallIcon()とsetLargeIcon()メソッドによりNotificationに添付することが出来ます。同様にaddAction()メソッドはdrwableリソースIDの代わりにIconオブジェクトを使うことが出来ます。
・新しいgetActiveNotifications()はアプリのNotificationのうち現在残っているものを探すことが出来ます。この機能を実装する方法についてはActive Notifications sampleを読んでください。
Bluetoothスタイラスのサポート
このリリースではBluetoothスタイラスを使ったユーザー入力のサポートが強化されました。ユーザーは互換性のあるBluetoothスタイラスを電話やタブレットとペアリング出来ます。接続されると、タッチスクリーン上の位置情報に加えてスタイラスから筆圧とボタン情報を受け取ります。これにより、タッチスクリーン単独より幅広い表現が可能となります。View.OnContextClickListenerとGestureDetector.OnContextClickListenerオブジェクトをActivity内で登録することでアプリでスタイラスのボタンが押されたことを検知したり第二ボタンの処理を実装できます。
スタイラスボタンを受け付けるためにMotionEventメソッドと定数を使用してください。
・ユーザーがアプリのボタンをスタイラスでタッチした場合、getTooltype()メソッドはTOOL_TYPE_STYLUSを返します。
・TargetがAndroid 6.0 (API level 23)のアプリでは、スタイラスの主ボタンをユーザーが押した時getButtonState()メソッドがBUTTON_STYLUS_PRIMARYを返します。スタイラスに副ボタンが有り、ユーザーが押した時はBUTTON_STYLUS_SECONDARYを返します。
ユーザーが主ボタンと副ボタンを同時に押した時は、BUTTON_STYLUS_PRIMARYとBUTTON_STYLUS_SECONDARYを合算して返します。
・古いプラットフォームをターゲットとしている場合はgetButtonState()メソッドは、主ボタンをおした時、BUTTON_SECONDARYを返し副ボタンをおした時、BUTTON_TERTIARYを返します。
改良されたBluetooth Low Energyのスキャニング
もし、アプリでBluetooth Low Energyのスキャンを行っているなら、setCallbackType()メソッドでBluetooth Low Energyデバイスが見つかった時のコールバックをシステムに要求できます。システムは長時間ScanFilterにセットした内容と一致するadvertisement packetを探します。この方法は以前のプラットフォームに比べてより効率がいいです。
Hotspot 2.0 リリース1対応
このリリースによりNexus6とNexus9上でHotspot 2.0 リリース1のサポートを追加します。アプリ内でHotspot2.0の認証を準備するために、新しいWifiEnterpriseConfigクラスのsetPlmn()やsetRealm()メソッドを使用します。WifiConfigurationオブジェクト内で、FQDNとproviderFriendlyNameフィールドを設定できます。isPasspointNetwork()メソッドはHotspot 2.0アクセスポイントを見つけます。
4K Display mode
アプリは4K解像度に対応している端末で4K解像度へアップグレードするよう要求できるようになりました。現在の物理的な解像度を知るためには新しいDisplay.ModeAPIを使用します。
もしUIが低い論理的解像度で描画されていて、高解像度な物理解像度にアップスケールされている時、物理解像度を返す
getPhysicalWidth()は論理解像度を返すgetSize()の値と差がでることに注意してください。
Android 6.0 APIs | Android Developersを設定することで、アプリが実行されている時に物理解像度を変更するようシステムに要求することが出来ます。この機能は4Kディスプレイ解像度に切り替えたい時に便利です。
4Kディスプレイモードの時、UIはオリジナルの1080pで描画され4Kにアップスケールされますが、SurfaceViewオブジェクトは元の解像度を維持することが有ります。
テーマに対応したColorStateLists
Theme atrributeはAndroid6.0(API level 23)が動作する端末においてColorStateListをサポートします。Resources#getColorStateList()とResources#getColor()は非推奨となりました。もしこれらのAPIを呼んでいたらなら代わりにContext#getColorStateList()やContext#Android 6.0 APIs | Android Developersメソッドを代わりに呼んでください。このメソッドはContextCompatとしてv4 appcompatライブラリでも使用可能です。音声機能
このリリースでは音声処理の機能が改善されています。・新しいandroid.media.midiAPI群によりMIDIプロトコルがサポートされます。このAPIを使用することでMIDIイベントを送受信できます。
・新しいAudioRecord.BuilderとAudioTrack.Builderクラスによってそれぞれデジタルオーディオの録音と再生オブジェクトを作って、オーディオソースを指定しシステム標準の同期プロパティーを上書きできます。
・APIはオーディオ関連した入力デバイスをフックします。これは特にアプリで、ゲームコントローラーやリモコンを使って接続したAndroid TVで音声検索を開始したい時便利です。システムはユーザーが検索を開始すると、新しいonSearchRequested()コールバックを実行します。コールバックからInputDeviceオブジェクトを取得し、新しいhasMicrophone()メソッドを呼ぶことで入力デバイスがマイクを内蔵しているか確認します。
・新しいgetDevices()メソッドにより現在システムに接続されている全てのオーディオデバイスのlistを取得します。オーディオデバイスが接続されたり取り外された時にシステムから通知を受けるためにAudioDeviceCallbackを登録することもできます。
ビデオ機能
このリリースではビデオ処理のAPIについて以下の心機能を含みます。・新しいMediaSyncは音声出力とビデオストリームを同期しやすくします。オーディオバッファーはコールバックによりお互いブロックされることなく作成・取得できます。それは可変ビットレートもサポートします。
・新しいEVENT_SESSION_RECLAIMEDイベントにより、アプリが開いたセッションがリソースマネージャーに再取得されたことを検知できます。アプリがDRMセッションを使用しているならば、このイベントを検出してリソースマネージャーに再取得されたセッションを使用しないようにしなくてはいけません。
・新しいERROR_RECLAIMEDエラーコードによりコーデックが使用しているメディアセッションをリソースマネージャーが再取得したことがわかります。この例外が発生したら、コーデックを開放して終了状態に移行する必要があります。
・新しいgetMaxSupportedInstances()インターフェースで現在のコーデックインスタンスがサポートする最大数を取得します。
・新しいsetPlaybackParams()メソッドでメディア再生のレートや早送り、スローモーション、などを設定できます。ビデオと関連したオーディオ再生をスローにしたりスピードアップすることも出来ます。
カメラ機能
このリリースには以下のようにカメラのフラッシュやカメラの画像現像処理にアクセスするための新しいAPIが含まれています。フラッシュライトAPI
カメラデバイスがフラッシュを持っているなら、setTorchMode()メソッドを呼ぶことでフラッシュのトーチモードを切り替えてフラッシュの点灯・消灯をカメラデバイスを開くこと無く行うことが出来ます。アプリはフラッシュ及びカメラに対して排他的な所有権を持ちません。トーチモードはカメラデバイスが利用不可能になった時や、その他フラッシュを灯すために必要なカメラのリソースを保持できなくなった時にオフになり利用できなくなります。他のアプリがsetTorchMode()を呼んだ時もトーチモードはオフになります。最後のアプリがトーチモードを終了するとトーチモードはオフになります。トーチモードの状態について通知を受けるためにregisterTorchCallback()メソッドを呼んでコールバックを登録できます。コールバックが登録されたら最初にすぐに現在のフラッシュライトを持っている全てのカメラのトーチモードの状態が渡されます。
トーチモードがオン、オフされるとonTorchModeChanged()が呼ばれます。
再処理API
Camera2APIはYUV対応を拡張して、Opaque formatの画像再処理を提供します。画像処理が可能であるか確認するためにgetCameraCharacteristics()を呼んでREPROCESS_MAX_CAPTURE_STALLキーを確認します。端末が再処理に対応しているならば、createReprocessableCaptureSession()を呼んで再処理可能なキャプチャーセッションを作成して、再処理用の入力バッファ作成を要求できます。入力バッファーフローをカメラの再処理入力に接続するために、ImageWriterクラスを使用します。中身が無いバッファーを取得するために、以下の手順を行います。
1.dequeueInputImage()メソッドを呼ぶ
2.入力バッファー内にデータをセットする。
3.queueInputImage()メソッドを呼びバッファをカメラに送る。
ImageWriterオブジェクトとPRIVATE画像を使用している時は、アプリが画像データに直接アクセスすることは出来ません。代わりに、queueInputImage()メソッドを呼ぶことで一切バッファーにコピーされること無くImageWriterに渡されます。
ImageReaderクラスはPRIVATEフォーマットの画像ストリームをサポートするようになりました。このサポートによりImageReaderが出力する画像のcircular image queueをアプリで管理できるようになりました。現像のために1つ以上の画像を選択してImageWriterに送信します。
Android for Work機能
このリリースでは次のAndroid for Workの新しいAPIが含まれています。改良されたCorporate-Ownerd, Single-Use端末の管理
端末の所有者は会社が所有し短期的に貸し出すCorporate-Owned, Single-Use (COSU)端末の管理を改善するために以下の設定を操作できます。・setKeyguardDisabled()メソッドでキーガードを無効、最有効化できます。
・setStatusBarDisabled()メソッドでステータスバー(クイック設定やNotification,ナビゲーションを上方向にスワイプしてのGoogle Nowの起動を含む)を無効・最有効化できます。
・UserManagerと定数DISALLOW_SAFE_BOOTでsafe bootを無効・最有効化できます。
・STAY_ON_WHILE_PLUGGED_IN定数で充電中にスリープになるのを禁止できます。
デバイスオーナーによるアプリのサイレントインストール/アンインストール
デバイスオーナーはPackageInstaller API群を使うことでアプリのサイレント・インストール・アンインストールが可能になりました。ユーザーの対話を必要とせずデバイスオーナーがアプリを取得しインストールすることで端末を準備することが出来るようになりました。この機能はキオスクなどの端末で各デバイスのGoogleアカウントを有効にする必要なくワンタッチでデバイスを準備するのに便利です。
企業向けのサイレント 証明書アクセス
choosePrivateKeyAlias()をアプリが呼ぶとユーザーが証明書をえらぶプロンプトが開始されます。プロファイルオーナーやデバイスオーナーはonChoosePrivateKeyAlias()メソッドを呼んで、証明書を要求しているアプリにサイレントでエイリアスを提供できるようになりました。この機能により管理されたアプリをユーザーの対話無しで証明書にアクセスさせることができます。
システムアップデートの自動承認
setSystemUpdatePolicy()でシステムのアップデートポリシーを設定できます。デバイスオーナーは例えばキオスク端末のように自動でアップデートを行ったり、ユーザーによって最大30日間アップデートを遅らせることが出来ます。さらには、管理者は、更新を行う時刻をキオスク端末が使用されていない時間などに設定できます。システムのアップデートが利用可能になるとシステムはワークコントローラーアプリがシステムアップデートポリシーを持っているか確認し、適切に振る舞います。証明書のインストールを移譲する
プロファイルオーナーやデバイスオーナーはサードパーティーのアプリがDevicePolicyManagerにある次の証明書管理API群を呼ぶことを許可できます。getInstalledCaCerts()
hasCaCertInstalled()
installCaCert()
uninstallCaCert()
uninstallAllUserCaCerts()
installKeyPair()
データ使用の追跡
プロファイルオーナーとデバイスオーナーはNetworkStatsManagerメソッドにより設定>データ使用量で見ることが出来るデータ統計を問い合わせることが出来るようになりました。デバイスオーナーが管理するメインユーザーの使用データーへのアクセス権を得ている間、プロファイルのオーナーは管理するプロファイルに関するデータを問い合わせる許可が自動的に与えられます。
Runtime permissionの管理
プロファイルオーナーとデバイスオーナーは全てのランタイムリクエストに対してユーザーにパーミッションを設定させるか、自動的に承認/拒否させるかなどPermissionのポリシーをsetPermissionPolicy()を使って設定できます。後者の場合、プロファイルオーナーやデバイスオーナーが設定内にあるアプリの権限で作成したPermissionについてユーザーは変更出来なくなります。設定内のVPN
VPNアプリを設定>もっと見る>VPN内でVPNアプリを見つけることが出来ます。VPNを使用するときのNotificationはVPNが設定される方法を特定します。プロファイルオーナーにNotificationがVPNで管理されたプロファイルか、個人プロファイルか、その両方なのかを示します。
Work statusのNotification
managed profileによって起動されたアプリのActivityが最前面にあるときは常にステータスバーにブリーフケースアイコンが表示されるようになりました。加えて管理されたプロファイル内でアプリのActivityをデバイスがロック解除した時、ユーザーがワークプロファイルに入ったことがToastで表示されます。Except as noted, this content is licensed under Creative Commons Attribution 2.5. For details and restrictions, see the Content License.