플러터에서 간단한 샘플 앱을 만들어 보았는데요.
테스트는 컴퓨터에서만 하다가
최종적으로 안드로이드 폰에서 실행을 해보았는데요.
그런데 권한 문제 때문에 실행이 정상적으로 되지 않았습니다.
예를 들어서 인터넷으로 세계 시간을 가져오는 코드인데요.
인터넷 접속 권한이 없으니 데이터를 가져오지 못했습니다.
그래서 의도하지 않은 에러가 발생하게 되었습니다.
그래서 권한 즉 Permission 를 사용해보게 되었습니다.
아래와 같은 명령어로 간단한 예제 어플을
permission 을 생성하게 되었습니다.
flutter create 프로젝트명
flutter pub add permission_handler
flutter pub get
참고로 프로젝트명과 패키지 이름이 같은 경우에는
패키지가 설치가 않되는 경우가 있습니다.
따라서 이점을 유의하시고
프로젝트 이름을 정하셔야 합니다.
참고로 permission_handler 패키지의 자세한 정보는
pub.dev 에서 검색할 수 있습니다.
https://pub.dev/packages/permission_handler/install
터미널로 생성한 어플이름으로 만들어진 경로로
vscode를 실행하여 폴더열기로 오픈합니다.
그리고 안드로이드 앱 권한을 아래에 파일에 추가해주어야 합니다.
android -> app -> src -> main -> AndroidManifest.xml
인터넷 접속 권한은 아래와 내용을 추가해주면 됩니다.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CAMERA"/>
필요한 권한은 위와같이 넣어주면 됩니다.
세부적인 안드로이드 앱 권한 정보는 아래에서 확인할 수 있습니다.
https://developer.android.com/reference/android/Manifest.permission
그런데 런타임에서 권한을 요청할 경우가 있는데요.
버튼을 누르면 해당 권한이 없으면 권한을 요청하고
권한이 있으면 그냥 무시하고 예제 입니다.
참고 : https://flutter-examples.com/permission-handler-flutter/
기본 앱의 실행은 /lib/main.dart 파일을
visual studio code 로 열고 아래의 코드를 입력하고
실행해서 테스트 해보시면 됩니다.
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("Request RunTime Permission in Android Flutter"),
),
body: SafeArea(
child: Center(
child: AppState(),
))),
);
}
}
class AppState extends StatefulWidget {
@override
AppPermission createState() => AppPermission();
}
class AppPermission extends State<AppState> {
Future<void> requestCameraPermission() async {
final serviceStatus = await Permission.camera.isGranted ;
bool isCameraOn = serviceStatus == ServiceStatus.enabled;
final status = await Permission.camera.request();
if (status == PermissionStatus.granted) {
print('Permission Granted');
} else if (status == PermissionStatus.denied) {
print('Permission denied');
} else if (status == PermissionStatus.permanentlyDenied) {
print('Permission Permanently Denied');
await openAppSettings();
}
}
Future<void> requestLocationPermission() async {
final serviceStatusLocation = await Permission.locationWhenInUse.isGranted ;
bool isLocation = serviceStatusLocation == ServiceStatus.enabled;
final status = await Permission.locationWhenInUse.request();
if (status == PermissionStatus.granted) {
print('Permission Granted');
} else if (status == PermissionStatus.denied) {
print('Permission denied');
} else if (status == PermissionStatus.permanentlyDenied) {
print('Permission Permanently Denied');
await openAppSettings();
}
}
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
margin: const EdgeInsets.all(10),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.lightBlue,
padding: EdgeInsets.all(8),
textStyle: TextStyle(fontSize: 20),
),
child: Text('Request Runtime Camera Permission'),
onPressed: requestCameraPermission,
),
),
Container(
margin: const EdgeInsets.all(10),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
primary: Colors.lightBlue,
padding: EdgeInsets.all(8),
textStyle: TextStyle(fontSize: 20),
),
child: Text('Request Runtime Location Permission'),
onPressed: requestLocationPermission,
),
),
],
));
}
}
위 소스코드의 실행 화면은 아래와 같습니다.
아래는 플로터 명령어 예시입니다.
참고하시라고 올립니다.
flutter clean
flutter pub get
flutter build apk
flutter upgrade
clean : Delete the build/ and .dart_tool/ directories.
build : Build an executable app or install bundle.
upgrade : Upgrade your copy of Flutter.
세부적인 명령어는 flutter --help 를 입력하시면 됩니다.
'IT News > Flutter & Dart' 카테고리의 다른 글
플러터(flutter) dart 언어에서 Non-nullable 타입, 물음표가 있는 이유? null safety (0) | 2022.03.02 |
---|---|
다트 언어(Dart language)에서 사용하는 클래스(class) 예시 (0) | 2022.01.02 |
다트언어(Dart language)의 기본 : 코멘트(comment), 임포트(import), 에로우함수(arrow) (0) | 2022.01.01 |