안드로이드 앱은 핸드폰의 제한된 공간에서 작동 되는데 앱 외부에 있는 리소스(카메라, SMS, 저장공간 등)에 접속 하기 위해서는 핸드폰 소유자의 접근 허가 권한을 받아야 이용이 가능 합니다. 물론 Android 5.1(API 수준 22) 이하에서 실행하는 기기에 설치된 앱 이라면 권한이 설정 만으로도 자동으로 부여되므로 허가 요청은 필요하지 않습니다. 권한을 요청하는 순서대로 설명을 하면 1. 권한 설정앱에서 필요한 권한을 AndroidManifest.xml 파일에 등록을 해야 합니다. 문법은 <uses-permission android:name="string" android:maxSdkVersion="integer" /> 과 같이 작성 합니다.
실제 사용 예를 들면 아래처럼 입력하면 됩니다. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> 권한의 종류는 안드로이드 사이트에 리스트 되어 있으며 양이 많아 링크만 연결해 드립니다. https://developer.android.com/reference/android/Manifest.permission 2. 앱에 이미 권한이 부여되었는지 확인사용하려는 권한을 이미 부여 받았다면 권한 요청을 다시 하지는 않습니다. ContextCompat.checkSelfPermission() 메서드를 사용하여 앱에 이미 권한을 부여 받았는지 확인을 할 수 있습니다. 호출 결과로는 PERMISSION_GRANTED 또는 PERMISSION_DENIED를 반환 받게 됩니다. public static int checkSelfPermission (Context context, String permission)
실제 사용 예는 아래와 같습니다. ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION); 3. 앱에 권한이 필요한 이유 설명앱에 필요한 권한을 요청 하려는 경우 사용자가 처음 권한을 요청 받은건지 기존에 요청을 받았는데 거부를 한 것인지에 따라 요청 방식을 달리 해야 하고 요청 화면도 달라지게 됩니다. shouldShowRequestPermissionRationale() 메서드는 사용자가 이전에 권한 요청을 거부한 경우 true 값을 넘겨주게 되어 있습니다. 그 결과를 이용하여 앱을 사용하려면 권한이 필요함을 사용자에게 알려 주는 안내를 추가 해야 합니다. public static boolean shouldShowRequestPermissionRationale (Activity activity, String permission)
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { // 이전에 거부한 경우 권한 필요성 설명 및 권한 요청 } else { // 처음 요청하는 경우 그냥 권한 요청 } 4. 권한요청권한 요청은 메소드를 호출 하면서 필요한 권한을 적어주면 됩니다. 요청 하려는 권한이 한개 이상이면 String 배열에 죽 기입해 주면 되고 너무 많으면 배열을 별도로 작성해서 추가해도 됩니다. static void requestPermissions(Activity activity, String[] permissions, int requestCode)
requestCode는 개발자가 임의로 만들어 놓은 코드를 말하고 메소드가 void를 리턴하는데 전달받으려는 값을 설정 한다는 건 메소드 실행 후 onRequestPermissionsResult() 메소드를 이용하여 결과 값을 넘겨 주게 됩니다. - 요청 권한이 한개인 경우 static final int PERMISSIONS_REQUEST_READ_LOCATION = 0x00000001; ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_READ_LOCATION); - 요청 권한이 2개 이상인 경우 static final int PERMISSIONS_REQUEST_READ_LOCATION = 0x00000001; private String[] PERMISSIONS = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; ActivityCompat.requestPermissions(this,PERMISSIONS,PERMISSIONS_REQUEST_READ_LOCATION); 5. 권한요청 응답처리사용자가 권한 요청 대화상자에 응답하면 시스템은 앱의 onRequestPermissionsResult() 메소드를 호출 하게 되고 이곳에서 결과에 대한 다음 작업을 진행하게 됩니다. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch(requestCode) { case returnCode: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 권한 허가된 경우 처리 } else { // 권한 거절된 경우 처리 } break; } } 6. 테스트 프로젝트간단한 권한 요청만 진행하는 프로젝트를 하나 생성해 봅니다. 프로젝트를 생성하고 소스를 입력 합니다. 실제 사용되는 파일은 2개이고 전체 소스 입니다. - AndroidManifest.xml <?xml
version="1.0" encoding="utf-8"?> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <application android:allowBackup="true"android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /></intent-filter> </activity> </application> </manifest> - MainActivity.java package copycoding.tistory.permissiontest; 7. 결과 화면 - 처음 권한 요청 처음 권한을 요청하면 위 그림과 같이 [거부]와 [허용] 버튼이 나타 납니다. 여기에서 거부를 클릭 했습니다. - 거부 후 다시 실행시 이번에는 [다시묻지않음]이 추가된 요청 화면이 나타 납니다. - copy coding - |