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

조회수 3305회

알람어플을 만들던 중에 벨소리를 선택하는 부분을 만들었는데 퍼미션 부분에서 승인이 안되더라구요 그래서 찾아봤더니 마시멜로우부터는 퍼미션 승인을 위해 따로 작업을 할 필요가 있다고 해서 관련된 자료를 찾아보는 도중 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;
        }
    }
  • (•́ ✖ •̀)
    알 수 없는 사용자

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();
        }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)