📷

【Flutter】iOSでカメラへのアクセス権限が許可されているか取得する

2025/01/22に公開

こんにちは、laughtaoneです。
Flutter学習中に備忘録として書いていますので、正確な情報でない可能性もありますのでご了承ください。

前提

カメラを使用するアプリを作っていた際に、ユーザーがカメラへのアクセスをオフにした際に、設定画面への遷移を促したいという状態でした。
今回は、iOS版の場合をご紹介します。(Android版も記事がたくさん転がっているので、ご自身で調べてみてください!)

準備

まずは、準備を紹介します。

パッケージのインストール

アクセス権限を調べるために「permission_handler」というパッケージを、次のコマンドを実行しインストールします:

flutter pub add permission_handler

Podfileの変更

次に、iOS側の設定を変更します。
Flutterプロジェクトのルートディレクトリの ios/Podfile を開きます。

Flutterプロジェクトのルートディレクトリとは

私が勝手に呼んでいるだけですが、flutter create アプリ名でアプリを新規作成したときの、アプリ名の名前のフォルダを指します。
要は、ターミナル上に % アプリ名と表示されていれば大丈夫です!

そして、一番下付近に post_install do |installer| という行があるかと思うので、この行に次のコードを加えます(参考サイト):

post_install do |installer|
+  installer.pods_project.targets.each do |target|
+    flutter_additional_ios_build_settings(target)
+    target.build_configurations.each do |config|
+    config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
+        '$(inherited)',
+	
+        ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
+        'PERMISSION_LOCATION=1',
+	
+	## dart: PermissionGroup.microphone
+        'PERMISSION_MICROPHONE=1',
+	
+	## dart: PermissionGroup.camera
+        'PERMISSION_CAMERA=1',
+	
+	## dart: PermissionGroup.photos
+        'PERMISSION_PHOTOS=1',
+      ]
+    end
+  end
+end

Runner/Info.plistの変更

Flutterプロジェクトのルートディレクトリの ios/Runner/Info.plist を開きます。
このサイトを参考に、<dict> </dict> の間に、次のコードを入れます:

<key>NSCameraUsageDescription</key>
<string>カメラを使う理由文</string>
<key>NSMicrophoneUsageDescription</key>
<string>マイクを使う理由文</string>

反映

これらのコードを反映させるために、Flutterプロジェクトのルートディレクトリの ios ディレクトリ下で、次のコマンドを実行します。

pod install

実践

ここまで行って成功したら、早速次のステップに従って書き、カメラへのアクセス権限が許可されているか取得してみましょう!
libディレクトリ下の任意のコード内で、次のステップに従って書いていきます!

①インポート

次のコードを、ファイル冒頭にコピペして、permission_handlerをインポートします:

import 'package:permission_handler/permission_handler.dart';

②関数

次のコードを、関数が書ける任意の場所にコピペして、関数を準備します:

// カメラの権限が許可されているか返す関数
Future<bool> functionCheckCameraPermission() async {
  // カメラの権限状態を取得
  PermissionStatus status = await Permission.camera.status;

  // カメラの権限が許可されているかどうかの真偽値を返す
  return status.isGranted;
}

③関数を使って真偽値を取得する

例として、そのコードで実装している画面を開いた瞬間、最初に真偽値を取得するようにしてみます。
そのコード内にあるStatefulWidgetの状態を管理するクラス内に次のコードをコピペします:

@override
void initState() {
  super.initState();
  firstCameraPermissionLoad();
}

// カメラ権限確認
Future<void> firstCameraPermissionLoad() async {
  bool isCameraAllowed = await functionCheckCameraPermission();
  debugPrint('😎isCameraAllowedは、${isCameraAllowed.toString()}');
}

そして、Flutterアプリをビルドし、このコードのページへ遷移すると、ターミナル上に「😎isCameraAllowedは、true」または「😎isCameraAllowedは、false」と表示されます。
この表示で true の場合はカメラが許可された状態、 false の場合はカメラが拒否された状態を表しています。

活用

これらを活用して、私は、次のように許可されていない場合、設定を開き許可を促すような仕組みにしました:

なお、ボタンの onPressed などで、次のように指定すれば、そのアプリへのiOS側の設定画面への遷移が実現できます:

onPressed: () async {
  await openAppSettings();
}

まとめ

このようにして、FLutterのiOSで、カメラへのアクセス権限が許可されているか取得することができます。
かなり私のクセがあるコードになってしまったかもしれませんが、私の備忘録のような位置付けで書いているため、ご了承ください。
また、カメラの権限が許可されているか返す関数をわざわざ作成しているのは、その場所以外でも使用できるようにするためです、、、

↓ 以下のサイトを参考にしました。大変ありがとうございます。

【Flutter】permission_handlerを使ってみる
【Flutter】カメラ機能を実装する

Discussion