728x90

안드로이드 6.0 버전 이상부터 권한 체크 기능을 선택할 수 있도록 만들었다.

앱에서 해당 권한이 필요할때마다 사용자로부터 권한을 허가받도록 변경되었다.

사용자가 권한을 허가했더라도 사용자는 설정화면(설정 > 애플리케이션 > 앱이름 > 권한)을 통해 언제든지 권한을 허용/거부 할 수 있다.


테드 퍼미션 설정 방법 코드 : https://link2me.tistory.com/1509

아래 코드로 해도 되지만 테드 퍼미션 사용하고 부터는 이걸로 활용하고 있다.


개별로 설정해서 사용하다가 다른 자료를 찾다가 코드에 포함된 걸 발견하고 테스트해보니 아주 잘된다.

이 코드만 활용하면 퍼미션 지정때문에 골치아플 일은 없을 것이다.


1. 먼저 알아야 할 사항은 AndroidManifest.xml 에 권한 옵션이 추가되어 있어야 한다.

    아래 코드가 전부 필요한 것이 아니다. 필요한 것만 이용하면 된다.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 전화걸려올경우 상대방 정보 확인 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_READ" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />


2. java 코드에서 멀티 퍼미션 설정코드

    멀티퍼미션에 항목이 6개 이지만 실제로는 5개를 설정하도록 나온다. (동일 권한체크를 알아서 배제하더라)

 public class Login extends Activity {
    // 멀티 퍼미션 지정
    private String[] permissions = {
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.CALL_PHONE, // 전화걸기 및 관리
            Manifest.permission.WRITE_CONTACTS, // 주소록 액세스 권한
            Manifest.permission.WRITE_EXTERNAL_STORAGE, // 기기, 사진, 미디어, 파일 엑세스 권한
            Manifest.permission.RECEIVE_SMS, // 문자 수신
            Manifest.permission.CAMERA
            };
    private static final int MULTIPLE_PERMISSIONS = 101;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        if (Build.VERSION.SDK_INT >= 23) { // 안드로이드 6.0 이상일 경우 퍼미션 체크
            checkPermissions();
        }

    }

    private boolean checkPermissions() {
        int result;
        List<String> permissionList = new ArrayList<>();
        for (String pm : permissions) {
            result = ContextCompat.checkSelfPermission(this, pm);
            if (result != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(pm);
            }
        }
        if (!permissionList.isEmpty()) {
            ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case MULTIPLE_PERMISSIONS: {
                if (grantResults.length > 0) {
                    for (int i = 0; i < permissions.length; i++) {
                        if (permissions[i].equals(this.permissions[i])) {
                            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                                showToast_PermissionDeny();
                            }
                        }
                    }
                } else {
                    showToast_PermissionDeny();
                }
                return;
            }
        }

    }

    private void showToast_PermissionDeny() {
        Toast.makeText(this, "권한 요청에 동의 해주셔야 이용 가능합니다. 설정에서 권한 허용 하시기 바랍니다.", Toast.LENGTH_SHORT).show();
        finish();
    }

}


위 코드는 http://programmar.tistory.com/5 에 링크된 GitHub 소스에 포함되어 있던 건데 아주 약간 수정했다.


소스코드 첨부 (퍼미션 지정에 필요한 코드만 발췌 수정)

PermissionChk.java


개별로 사용하던 퍼미션 설정 코드도 첨부해둔다.

PermissionCheck_Indivisual.java



라이브러리를 사용하는 것이 훨씬 더 편하므로 아래 사이트를 참조하면 좋다.

https://brunch.co.kr/@babosamo/50


퍼미션 라이브러리 관련 사이트

https://www.androidhive.info/2017/12/android-easy-runtime-permissions-with-dexter/


https://thanosfisherman.github.io/posts/mayi/


http://gun0912.tistory.com/61  TED Permission (추천)


https://hanburn.tistory.com/173  RxPermission (추천)



728x90
블로그 이미지

Link2Me

,