본문 바로가기
Android/소스

안드로이드 퍼미션 권한 관련

by 므시칸곰틔군 2018. 4. 17.

안드로이드 퍼미션  권한 정리.

개별 권한이던 여러개의 권한이던 권한 설정이 안되면 앱 사용이 불가.


권한이 이루어진 경우는 상관이 없지만

다시 보지 않기 를 선택한 경우 앱권한이 없기에 어떻게 해야 할지 막막.




최초 권한 체크..



/**추상화를 통한 객체생성 금지. only extends */

public abstract class BaseActivity extends AppCompatActivity {


    /**

     * 퍼미션 체크 인터페이스

     */


    public interface PermissionCheckListener {


        /**

         * 퍼미션 허용이 끝나면 끝나는 시점 초기화 시작구간을 콜백으로 구현

         * <p>

         * 어디서든 등록하고 액티비티에서 콜백으로 지정을 한다

         */

        void permissionCheckFinish();

    }


    public PermissionCheckListener permissionCheckListener;


    public void setPermissionCheckListener(PermissionCheckListener permissionCheckListener) {


        this.permissionCheckListener = permissionCheckListener;


    }


    private final int PERMISSION_REQUEST = 1000;



    /**

     * 스트링 배열로 퍼미션 체크.

     */


    public boolean permissionCheck(String[] strings) {


        boolean check = false;



        // //안드로이드 마시멜로 이후 퍼미션 체크.


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


            for (int i = 0; i < strings.length; i++) {

                if (ContextCompat.checkSelfPermission(this, strings[i]) == PackageManager.PERMISSION_DENIED) {

                    ActivityCompat.requestPermissions(this, strings, PERMISSION_REQUEST);

                    check = true;

                    break;

                }

            }

        }

        return check;

    }



    /**

     * 거부를 했을때 처리

     * <p>

     * <p>

     * <p>

     * 다시보지 않기 체크 후 거부를 하면 설정에서 권한을 허용하도록 요청.

     * <p>

     * 허용하지 않을 경우 앱 사용 을 못함..

     * <p>

     * 처리를 잘못하면 무한 반복할 경우가 생김.

     */


    @Override


    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {


        super.onRequestPermissionsResult(requestCode, permissions, grantResults);



        if (requestCode == PERMISSION_REQUEST) {

            Log.e("bear", "권한 허용이 안된것을 확인해야한다..");

            // //안드로이드 마시멜로 이후 퍼미션 체크.

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {


                for (int i = 0; i < grantResults.length; i++) {

                    if (grantResults[i] == 0) {

                        Log.w("bear", "권한이 승락된 것은 ??? " + permissions[i]);

                        if (grantResults.length == (i + 1)) {

                            Log.e("bear", "인터페이스로 한곳에 모아서 앱을 실행하도록 한다...");

                            permissionCheckListener.permissionCheckFinish();


                        }



                    } else {


                        Log.e("bear", "권한 거절 것은 ??? " + permissions[i]);

                        // 거부한 이력이 있으면 true를 반환한다.

                        if (shouldShowRequestPermissionRationale(permissions[i])) {

                            Log.e("bear", "사용자가 다시 보지 않기에 체크를 하지 않고, 권한 설정을 거절한 이력이 있는 경우");

                            ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST);

                            break;


                        } else {

                            Log.e("bear", "사용자가 다시 보지 않기에 체크하고, 권한 설정을 거절한 이력이 있는 경우.");

                            new AlertDialog.Builder(this)

                                    .setTitle("다시보지않기 클릭.")

                                    .setMessage(permissions[i] + " 권한이 거부되었습니다 설정에서 직접 권한을 허용 해주세요.")

                                    .setNeutralButton("설정", new DialogInterface.OnClickListener() {


                                        @Override


                                        public void onClick(DialogInterface dialog, int which) {

                                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

                                            intent.setData(Uri.parse("package:" + getPackageName()));

                                            startActivity(intent);

                                            Toast.makeText(getApplicationContext(), "권한 설정 후 다시 실행 해주세요.", Toast.LENGTH_SHORT).show();

                                            finish();

                                        }


                                    })


                                    .setPositiveButton("확인", new DialogInterface.OnClickListener() {


                                        @Override


                                        public void onClick(DialogInterface dialog, int which) {

                                            Toast.makeText(getApplicationContext(), "권한 설정을 하셔야 앱을 사용할 수 있습니다.", Toast.LENGTH_SHORT).show();

                                            finish();

                                        }


                                    })

                                    .setCancelable(false)

                                    .create().show();

                        }// shouldShowRequestPermissionRationale /else

                    } // 권한 거절

                } // for end

            }//Build.VERSION.SDK_INT  end

        }//requestCode  end


    }

}







매인 액티비티에서 동작 .

이걸 따로 클래스화 한다????음.

2개의 메서드 로 대체 .....








'Android > 소스' 카테고리의 다른 글

디펜던시.  (0) 2018.06.04
안드로이드 연속클릭 방지 클래스.  (0) 2018.05.23
안드로이드 리스트뷰 예제  (0) 2018.03.22
프레그먼트 생성.  (0) 2018.03.09
안드로이드 리사이클러뷰(RecyclerView) 정리.  (0) 2018.02.02