[この記事は Anirudh Dewani、デベロッパー アドボケートによる Android Developers Blog の記事 "New permissions requirements for Android TV" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]

Android 6.0 では、アプリからリクエストされた権限委譲に対しより細かな制御をユーザーにもたらすランタイム パーミッション モデルを導入しており、これにより、アプリのインストールにかかる時間が短縮されます。またユーザーは、権限の設定をいつでも取り消すことができます。M Preview で実行しているアプリで新しいパーミッション モデルがサポートされている場合、ユーザーはアプリをインストールまたはアップグレードするときにパーミッションを付与する必要はありません。デベロッパーは、ユーザーがランタイムの委譲を必要としている権限をチェックし、アプリ自体に装備されていない場合、その権限をリクエストする必要があります。

Android 6.0 でランタイム時にユーザーから権限の委譲を必要とするものすべてをリストするには、下記のようにします -
adb shell pm list permissions -g -d 

RECORD_AUDIO

一般的に、アプリはできる限り最小限の権限をリクエストすべきです。音声検索は Android TV のコンテンツ ディスカバリー エクスペリエンスにおいて、欠くことのできない部分です。音声検索を可能とするために SpeechRecognizer を内部で使用する際、該当するアプリのマニフェストで RECORD_AUDIO 権限を宣言する必要があります。Android 6.0 のランタイム中、RECORD_AUDIO は明確なユーザー権限の委譲を必要とします。Android TV Leanback support library を使用する際、SpeechRecognizer の代わりに SpeechRecognitionCallback を使用することにより、ランタイム中にアプリが RECORD_AUDIO をリクエストする必要がなくなります。

SearchActivity.java

Android TV の Leanback サンプル レポジトリから Commit を実行します。

mFragment = (SearchFragment) getFragmentManager()
                .findFragmentById(R.id.search_fragment);
if (!USE_INTERNAL_SPEECH_RECOGNIZER) {
   
    mSpeechRecognitionCallback = new SpeechRecognitionCallback() {
        
        @Override
        public void recognizeSpeech() {
            if (DEBUG) Log.v(TAG, "recognizeSpeech");
        
            // ACTION_RECOGNIZE_SPEECH
            startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH);
        }
    };
    mFragment.setSpeechRecognitionCallback(mSpeechRecognitionCallback);
}

SpeechRecognitionCallback が設定されると、内部の SpeechRecognizer を使用する代わりに、Android の Leanback support library によって音声検索アクションがアクティビティで処理されるようになります。その後、音声認識をサポートするため、アプリがRecognizerIntent を利用できるようになります。

API レベル 23 を対象とした Android TV アプリをお持ちの場合、アプリをアップデートし、SpeechRecognitionCallback の使用、およびマニフェストから RECORD_AUDIO 権限の削除を行ってください。

Posted by Yoshifumi Yamaguchi - Developer Relations Team