마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

checkSelfPermission 오류 질문드립니다. [closed]

0 추천

안드로이드 권한요청 메서드를 만드는데 한줄 오류떄문에 진행이 안되네요....

checkSelfPermission 이 계속 오류가뜹니다.. 인터넷에서 찾은 글 그대로 맞춰서 햇는데 왜그럴까요??

@Override
			public void onClick(View v) {
				//마쉬멜로우이상인지 체크
				if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
					//전회걸기 권한을 확인
					int permissionResult = checkSelfPermission(Manifest.permission.CALL_PHONE);
					//해당 어플이 거부되있는지 확인
					if (permissionResult == PackageManager.PERMISSION_DENIED) {
						//사용자가 한번이라도 거부햇는지 확인
						if (shouldShowRequestPermissionRationale(Manifest.permission.CALL_PHONE)) {
							AlertDialog.Builder dialog = new AlertDialog.Builder(AdminMain.this);
							dialog.setTitle("권한이 필요합니다.")
									.setMessage("이 기능을 사용하기 위해서는 단말기의 \"전화걸기\"권한이 필요합니다 계속하시겠습니까?")
									.setPositiveButton("네", new DialogInterface.OnClickListener() {
										@Override
										public void onClick(DialogInterface dialog, int which) {
											//새로 인스턴스를 생성햇기떄문에 한번더 버전체크를한다
											if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
												//안드로이드에 권한을 요청합니다.
												requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
											}
										}
									})
									.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
										@Override
										public void onClick(DialogInterface dialog, int which) {
											Toast.makeText(AdminMain.this, "기능을 취소했습니다", Toast.LENGTH_SHORT).show();
										}
									})
									.create()
									.show();
						}//최초 권한요청
						else {
							requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, 1000);
						}
					}//권한 있을경우
					else {
						Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + tel));
						startActivity(intent);
					}
				}//마쉬멜로우 미만
				else {
					Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + tel));
					startActivity(intent);
				}
			}
		});
	}

	//요청응답을 가저옵니다.
	@Override
	public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

		if (requestCode == 1000) {
			//요청한 권한을 허용한 경우....
			if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
				Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + tel));
                //여기아래에서 발생합니다.
				if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
					startActivity(intent);
				}
			} else {
				Toast.makeText(AdminMain.this, "권한요청을 거부했습니다.", Toast.LENGTH_SHORT).show();
			}
		}
	}
질문을 종료한 이유: 해결됨
시로이 (260 포인트) 님이 2019년 11월 20일 질문
시로이님이 2019년 11월 28일 closed

2개의 답변

0 추천

checkSelfPermission은 Activity말고 Context를 사용해보세요

예를 들면 

int permission = ContextCompat.checkSelfPermission(context,
        Manifest.permission.WRITE_EXTERNAL_STORAGE)
int permissionResult = mContext.checkSelfPermission(permissionChk);
tata (230 포인트) 님이 2019년 11월 20일 답변
검색해보니 ActivityCompat 를 ContextCompat  로 변경하라는건 나오는데 위에 알려주신
2가지 int는 어디에 넣어야하나요??
결국 코드를 다르게 바꿧습니다.처음에는 오류가떠서 식겁하긴햇는데
스튜디오에서 고처준걸로 테스트하니 동작되네요
0 추천

만약을 대비해서 해결책을 저장해놓겟습니다, 필요하신분은 가저가서 변경하시면됩니다.

@RequiresApi(api = Build.VERSION_CODES.M)
	@Override
	public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
		if (requestCode == 1000) {
			if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
				Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + tel));
				if (checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
					// TODO: Consider calling
					//    Activity#requestPermissions
					// here to request the missing permissions, and then overriding
					//   public void onRequestPermissionsResult(int requestCode, String[] permissions,
					//                                          int[] grantResults)
					// to handle the case where the user grants the permission. See the documentation
					// for Activity#requestPermissions for more details.
					return;
				}
				startActivity(intent);//전화걸기를 작동합니다
			}
			//권한 요청 거부시 메세지가 뜨게됩니다.
			else{
				Toast.makeText(AdminMain.this,"권한 요청을 거부했습니다.",Toast.LENGTH_SHORT).show();
			}
		}
	}

 

시로이 (260 포인트) 님이 2019년 11월 28일 답변
...