📷

[Flutter] camera プラグイン利用時の RECORD_AUDIO 権限を取り除く

2022/10/22に公開

イントロ

Flutter でカメラを扱う場合にお世話になる camera プラグイン

ですが、そのまま利用するとカメラに加え、動画撮影時の音声録音を目的としたマイクについてもアクセス権限を要求してしまいます。

iOS の場合 Android の場合
iOS Android

スチルカメラとして利用したい場合はマイクへのアクセスは不要なので、 CameraController のコンストラクタにて enableAudio: false を指定します。

final _controller = CameraController(
  cameraDescription,
  ResolutionPreset.medium,
  enableAudio: false,   // ここ
);

実行時のマイクへのアクセス宣言要求についてはこれで防止できるのですが、 Android に限っては、 Google Play のストア上での権限詳細ページにマイクアクセスが残ってしまいます。

GooglePlay
アプリの権限詳細ページ

これについて何とかしたいというのが本記事の目的です。

そもそもなぜ表示されるのか

本記事のタイトルにもあるのですが、 AndroidManifest.xml

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

という記述があるからというのが答えになります。

https://developer.android.com/training/permissions/declaring?hl=ja

とはいえ、実際に手元の Flutter プロジェクトを見てみると、 AndroidManifest.xml に該当の記述がない場合がほとんどだと思います。

実は、 Android では Gradle ビルド時にライブラリの AndroidManifest.xml をまとめて 1 つにマージしてくれる機能が存在し、これによって camera_android プラグインAndroidManifest.xml の内容が自動的にアプリ側に反映されます。

https://github.com/flutter/plugins/blob/3a03925ecb29adbb3285132d2adfd661d32823b1/packages/camera/camera_android/android/src/main/AndroidManifest.xml#L1-L5

このため、良くも悪くも camera プラグインを導入するだけで、これら 2 つのリクエスト権限の宣伝が AndroidManifest.xml に自動的に追加されることとなります。

対応方法

ここからが対応方法になります。

前述の通り、 AndroidManifest.xml はライブラリ側のものをマージすることができるのですが、この際のマージオプションとして、逆に取り除くものが存在します。

https://developer.android.com/studio/build/manage-manifests?hl=ja#node_markers

具体的には 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 の記述を確認するという方法があります。

https://developer.android.com/studio/build/manifest-merge?hl=ja#inspect_the_merged_manifest_and_find_conflicts
https://tech.dely.jp/entry/2020/12/17/092607

  1. Flutter プロジェクトの /android を AndroidStudio にて新しく開く
  2. Android プロジェクトとして認識されていることを確認
  3. AndroidManifest.xml のファイルを開いて、下部の Merged Manifest タブを選択

という手順で、実際に 1 つにマージされた AndroidManifest.xml の記述が確認できます。

これで、

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

が消えているかどうかを確認してみてください。

Discussion