Flutterで、スマホデバイスのテキスト読み上げ機能が簡単に実装できる「flutter_tts」という便利なパッケージがあります。
このパッケージで実装したFlutterプロジェクトをAndroidアプリとして動かそうとする場合に、マニフェストファイルで以下の設定を忘れると「Android11(APIレベル30)の場合「だけ」読み上げ機能が作動しない」というトラップが発生するので注意が必要です(Android11以外はこれがなくても作動します)。
<queries> <intent> <action android:name="android.intent.action.TTS_SERVICE" /> </intent> </queries>
このトラップは「flutter_tts」パッケージの公式リファレンスにちょこっとだけ書いてあります(これは気づかんで〜)。
Apps targeting Android 11 that use text-to-speech should declare TextToSpeech.Engine.INTENT_ACTION_TTS_SERVICE in the queries elements of their manifest.
なぜ、Android11(APIレベル30)だけこれが必要なのかというと、Android11では、パッケージ(デバイス内の他のアプリやライブラリ)へアプリ内からアクセスする際に、そのパッケージをマニフェストファイルで宣言しないといけない仕様に変更となったからです。
これに伴って、Android11(APIレベル30)では、Androidデバイスに備わっているテキスト読み上げ機能(TTSエンジン)を使う場合に、その宣言をマニフェストファイルで行うことが必要となったようです。
ただ、このAndroidの公式リファレンスを見ると、「Android 11以降」と書いてあるのに、なぜTTSエンジンについては「Android11だけ」マニフェストファイルの設定が必要になるのかはよくわかりません。
Android 11 では、アプリがデバイス上にユーザーがインストールした別のアプリに対してクエリまたは操作を行う方法が変更されています。アプリで
<queries>
要素を使用することで、アクセス可能な他のパッケージ セットを定義できます。この要素により、アプリに表示する他のパッケージをシステムに指示することで、最小権限の原則を実践していくことができます。また、Google Play などのアプリストアが、アプリがユーザーに提供するプライバシーやセキュリティを評価することもできます。Android 11 以降をターゲットとするアプリの場合、アプリのマニフェスト ファイルに
<queries>
要素が必要になることがあります。https://developer.android.com/about/versions/11/privacy/package-visibility?hl=ja
(詳しくは、以下の動画で解説していますので、よろしければご覧ください)