[Flutter] camera プラグイン利用時の RECORD_AUDIO 権限を取り除く
イントロ
Flutter でカメラを扱う場合にお世話になる camera プラグイン。
ですが、そのまま利用するとカメラに加え、動画撮影時の音声録音を目的としたマイクについてもアクセス権限を要求してしまいます。
iOS の場合 | Android の場合 |
---|---|
スチルカメラとして利用したい場合はマイクへのアクセスは不要なので、 CameraController のコンストラクタにて enableAudio: false
を指定します。
final _controller = CameraController(
cameraDescription,
ResolutionPreset.medium,
enableAudio: false, // ここ
);
実行時のマイクへのアクセス宣言要求についてはこれで防止できるのですが、 Android に限っては、 Google Play のストア上での権限詳細ページにマイクアクセスが残ってしまいます。
アプリの権限詳細ページ
これについて何とかしたいというのが本記事の目的です。
そもそもなぜ表示されるのか
本記事のタイトルにもあるのですが、 AndroidManifest.xml
に
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
という記述があるからというのが答えになります。
とはいえ、実際に手元の Flutter プロジェクトを見てみると、 AndroidManifest.xml
に該当の記述がない場合がほとんどだと思います。
実は、 Android では Gradle ビルド時にライブラリの AndroidManifest.xml
をまとめて 1 つにマージしてくれる機能が存在し、これによって camera_android プラグインの AndroidManifest.xml
の内容が自動的にアプリ側に反映されます。
このため、良くも悪くも camera プラグインを導入するだけで、これら 2 つのリクエスト権限の宣伝が AndroidManifest.xml
に自動的に追加されることとなります。
対応方法
ここからが対応方法になります。
前述の通り、 AndroidManifest.xml
はライブラリ側のものをマージすることができるのですが、この際のマージオプションとして、逆に取り除くものが存在します。
具体的には tools:node="remove"
という属性で、これを該当要素に指定することでマージ時にその要素を削除することができます。
今回の目的でいうと、
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
の要素を削除したいため、アプリ側の AndroidManifest.xml
にて以下のような記述を追加します。
<!-- `xmlns:tools` で `tools` の名前空間を宣言しておく -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="app.hugehoge.urlfinder">
<!-- プラグイン側で要求している不要な権限の削除 -->
<uses-permission
android:name="android.permission.RECORD_AUDIO"
tools:node="remove" />
これで RECORD_AUDIO の権限が取り除けます。
確認方法
これで大丈夫と言われても、実際に Google Play に上げて内部テストで確認というのはなかなか辛いです。
簡易的なものとして AndroidStudio によるマージ後の AndroidManifest.xml
の記述を確認するという方法があります。
- Flutter プロジェクトの
/android
を AndroidStudio にて新しく開く - Android プロジェクトとして認識されていることを確認
-
AndroidManifest.xml
のファイルを開いて、下部の Merged Manifest タブを選択
という手順で、実際に 1 つにマージされた AndroidManifest.xml
の記述が確認できます。
これで、
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
が消えているかどうかを確認してみてください。
Discussion