์ฑ์์ ์จ๋ฒ ํน์ ์นด๋ฉ๋ผ ๋ฑ ๋ค์ดํฐ๋ธ ์์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋์ ์ฌ์ฉ์์ ๊ถํ์ ํ๋ ํด์ผํ๋ค. ์ด ๋ ์ฌ์ฉ์๊ฐ ๋ฐ๋ก ๊ถํ์ ์ฃผ๋ฉด ๊น๋ํ๋ฐ, ๋ง์ฝ ๊ฑฐ๋ถ ํน์ '๋ค์ ๋ฌป์ง ์๊ธฐ' ๋ฑ์ผ๋ก ์์์ด ๊ฑฐ๋ถ๋ฅผ ํด๋๊ณ ๋ ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์ถ์ดํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ฐ ์ฌ๋ฌ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๊ธฐ์ ๊ถํ์ ๋ํ ์ธ๋ถ์ ์ธ ์ฒ๋ฆฌ๋ ๋งค์ฐ ํ์์ ์ด๋ค. ์๋ฅผ ๋ค์ด ์จ๋ฒ ๋ฐ ์นด๋ฉ๋ผ ์ ๊ทผ ๊ถํ์ ๊ฑฐ์ ํด๋๊ณ ์ฑ ์์์ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์คํํ ๊ฒฝ์ฐ ๊ถํ์ ํ์ธํ๋ค ์ฌ์ฉ์๊ฐ ๊ฑฐ๋ถ๋ฅผ ํ๋ค๋ฉด ๋ค์ด์ผ๋ก๊ทธ ๋ฑ์ ๋์์ '๊ถํ์ ์ค์ผ ์ฌ์ฉํ ์ ์๋ค'๋ ๋ด์ฉ์ ๊ณ ์งํ๊ณ ์ค์ ์ผ๋ก ๋ฐ๋ก ์ด๋์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๋ฑ์ ์กฐ์น๊ฐ ํ์ํ๋ค.
์ฆ, ๋งค๋๋ฌ์ด ์ฑ ์ฌ์ฉ ํ๋ฆ์ ์ํด์ ๊ถํ ์ํ์ ๋ํ ๊ฒ์ฌ์ ๊ฐ ์ํ์ ๋ํ ์ ์ ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
์ค์ ํ๋ก์ ํธ์์ ๊ตฌํํ ์ฝ๋๋ฅผ ์ฎ๊ฒจ๋๋ค. ํ
ํ๋ฆฟ ์ฝ๋์๋ ๊ตฌํํ ์ฑ์ด ์ด๋ค ๊ถํ์ ์ฌ์ฉํ ์ง ์ ์ ์์ด์ ์ผ๋จ์ ์ ์ธ์์ผฐ๋ค. ์๋ ์ฝ๋๋ ์จ๋ฒ๊ณผ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ๋ ์ฑ์์ ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉ ์ ์ ๊ถํ ์ฒดํฌ๋ฅผ ํ ๋ ์ฌ์ฉํ ์ฝ๋์ด๋ค.
flutter pub add permission_handler
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:fitsquad_app/barrel.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
class PermissionManager {
static Future<void> checkPhotoPermission({
required BuildContext currentBuildContext,
required Function grantedAction,
}) async {
PermissionStatus status = await _checkStatus();
if (status.isDenied) {
status = await _requestPermission();
if (status.isGranted) {
grantedAction();
} else if (status.isPermanentlyDenied) {
Future.microtask(() {
BasicDialog.show(
context: currentBuildContext,
title: TextManager.photoPermissionTitle.tr(),
contents: TextManager.photoPermissionMessage.tr(),
confirmAction: () {
openAppSettings();
},
);
});
}
} else if (status.isPermanentlyDenied) {
Future.microtask(() {
BasicDialog.show(
context: currentBuildContext,
title: TextManager.photoPermissionTitle.tr(),
contents: TextManager.photoPermissionMessage.tr(),
confirmAction: () {
openAppSettings();
},
);
});
} else if (status.isGranted) {
grantedAction();
}
}
static Future<PermissionStatus> _checkStatus() async {
if (Platform.isAndroid) {
final androidInfo = await DeviceInfoPlugin().androidInfo;
if (androidInfo.version.sdkInt <= 32) {
return await Permission.storage.status;
} else {
return await Permission.photos.status;
}
}
return await Permission.photos.status;
}
static Future<PermissionStatus> _requestPermission() async {
if (Platform.isAndroid) {
final androidInfo = await DeviceInfoPlugin().androidInfo;
if (androidInfo.version.sdkInt <= 32) {
return await Permission.storage.request();
} else {
return await Permission.photos.request();
}
}
return await Permission.photos.request();
}
static Future<void> checkCameraPermission({
required BuildContext currentBuildContext,
required Function grantedAction,
}) async {
PermissionStatus status = await Permission.camera.status;
if (status.isDenied) {
status = await Permission.camera.request();
if (status.isGranted) {
grantedAction();
} else if (status.isPermanentlyDenied) {
Future.microtask(() {
BasicDialog.show(
context: currentBuildContext,
title: TextManager.cameraPermissionTitle.tr(),
contents: TextManager.cameraPermissionMessage.tr(),
confirmAction: () {
openAppSettings();
},
);
});
}
} else if (status.isPermanentlyDenied) {
Future.microtask(() {
BasicDialog.show(
context: currentBuildContext,
title: TextManager.cameraPermissionTitle.tr(),
contents: TextManager.cameraPermissionMessage.tr(),
confirmAction: () {
openAppSettings();
},
);
});
} else if (status.isGranted) {
grantedAction();
}
}
}
onTap: () async {
if (imageSource == ImageSource.camera) {
await PermissionManager.checkCameraPermission(
currentBuildContext: context,
grantedAction: () async {
await _takePicture(context, imageSource);
});
} else {
await PermissionManager.checkPhotoPermission(
currentBuildContext: context,
grantedAction: () async {
await _takePicture(context, imageSource);
});
}
},
permission_handler๋ ๊ฐ OS ๋ณ๋ก ๊ตฌํ ํด์ค์ผ ํ ๊ฒ๋ค์ด ์ถ๊ฐ์ ์ผ๋ก ์กด์ฌํ๋ค. ์ด๋ ์ด๋ค ๊ถํ์ ์ค์ผ ํ ์ง(์ด๋ค ๋ค์ดํฐ๋ธ ์์์ ๋์ด๋ค ์จ์ผ ํ๋์ง)์ ๋ฐ๋ผ ๋ฌ๋ผ์ ์ฌ๊ธฐ์ ์ ๋ฆฌ๋ ์๋ตํ๋ค.