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