마시멜로우 버전이상 WRITE_SETTINGS 권한 승인방법


알람어플을 만들던 중에 벨소리를 선택하는 부분을 만들었는데 퍼미션 부분에서 승인이 안되더라구요 그래서 찾아봤더니 마시멜로우부터는 퍼미션 승인을 위해 따로 작업을 할 필요가 있다고 해서 관련된 자료를 찾아보는 도중 https://stackoverflow.com/questions/32083410/cant-get-write-settings-permission 같은 질문을 올린 사람이 있어서 보고 참고 해봤더니 7.0버전에서는 이상없이 작동하는 반면에 마시멜로우에서는 여전히 오류가 발생합니다.. 저 사이트에서도 같은 문제를 겪는 사람이 있더라구요..

코드는 아래와 같은데 어느 부분이 문제 일까요..

다른 사람들 의견을 들어보니까 마시멜로우버전 에서는 승인해도 승인이 안됐다고들 하셨어요

 @RequiresApi(api = Build.VERSION_CODES.M)
    public void onClick(View v) {

        if (v.equals(b)) {
            boolean permission;

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //마시멜로우 이상일 경우
                permission = Settings.System.canWrite(getApplicationContext()); //권한 승인 여부 검사
            } else {
                permission = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;
            }

            if (permission) { //누가 버전은 바로 여기로 오는데 마시멜로우는 승인후 여기로 오는데 어차피 오류남

                Intent in = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                startActivityForResult(in, 0);

            } else { //안된 경우


                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { // 승인하는 과정

                    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                    intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);

                } else {

                    requestPermissions(new String[]{Manifest.permission.WRITE_SETTINGS}, 1000);
                }
            }
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 1000 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplication(), "마시멜로우나 누가 버전 이하 입니다", Toast.LENGTH_SHORT).show();
        } else {
                Toast.makeText(getApplication(), "권한 요청을 거부했습니다.", Toast.LENGTH_SHORT).show();
            }


    }


    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case 0:
                Toast.makeText(getApplication(), "Successfully set", Toast.LENGTH_SHORT).show();
                Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
                RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, uri);
                break;
        }
    }
  • 2017년 11월 02일에 작성됨

조회수 86


1 답변


오류 로그도 같이 올려주시면 더 좋은 답변 가능할 것 같습니다.

일단 제 생각에는 requestPermissions() 까지 오는데 너무 많은 동작을 하는 것 같습니다.

런타임 권한 요청이 없는 버전에서는 설치 시에 권한 요청을 다 수락하기 때문에 requestPermissions() 전에 버전 검사를 하실 필요가 없다고 알고 있거든요

그래서 간단하게 권한 있나없나 확인해보시고 없으면 권한요청 있으면 코드 동작 하시면 될 것 같습니다.

    // fragment 위에서 돌아갑니다.
    REQUEST_PERMISSION_AUDIO_RECORD = 상수;
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_PERMISSION_AUDIO_RECORD);
    } else {
        doSomthing();
    }
  • 2017년 11월 07일에 작성됨
    안드로이드 입문

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close