IT News/Flutter & Dart

Flutter 앱 권한(permission) 요청하기

skyLove1982 2022. 3. 2. 00:07
반응형

플러터에서 간단한 샘플 앱을 만들어 보았는데요.

테스트는 컴퓨터에서만 하다가

최종적으로 안드로이드 폰에서 실행을 해보았는데요.

그런데 권한 문제 때문에 실행이 정상적으로 되지 않았습니다.

 

예를 들어서 인터넷으로 세계 시간을 가져오는 코드인데요.

인터넷 접속 권한이 없으니 데이터를 가져오지 못했습니다.

그래서 의도하지 않은 에러가 발생하게 되었습니다.

 

그래서 권한 즉 Permission 를 사용해보게 되었습니다.

아래와 같은 명령어로 간단한 예제 어플을

permission 을 생성하게 되었습니다.

flutter create 프로젝트명
flutter pub add permission_handler
flutter pub get

참고로 프로젝트명과 패키지 이름이 같은 경우에는

패키지가 설치가 않되는 경우가 있습니다.

따라서 이점을 유의하시고

프로젝트 이름을 정하셔야 합니다.

 

참고로 permission_handler 패키지의 자세한 정보는

pub.dev 에서 검색할 수 있습니다.
https://pub.dev/packages/permission_handler/install

 

permission_handler | Flutter Package

Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.

pub.dev

터미널로 생성한 어플이름으로 만들어진 경로로

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

 

Manifest.permission  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

그런데 런타임에서 권한을 요청할 경우가 있는데요.

버튼을 누르면 해당 권한이 없으면 권한을 요청하고

권한이 있으면 그냥 무시하고 예제 입니다.

참고 : 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 를 입력하시면 됩니다.

반응형