상세 컨텐츠

본문 제목

[Android] java.lang.SecurityException : Permission Denial : Starting Intent 에러 처리 방법

프로그래밍/안드로이드

by 우뇽킴 2020. 8. 2. 14:08

본문

 

어느 날 운영중인 안드로이드 앱에서 전화 버튼 선택 시, 자동으로 앱 전화로 자동으로 걸어주는 기능이 되어야하는데 안되면서 발견한 오류

 

안드로이드 스튜디오 로그캣으로 찍어보니 아래와 같이 찍히는걸 확인함

 

java.lang.SecurityException: Permission Denial: starting Intent :
{ act=android.intent.action.CALL dat=tel:xxxxxxxx cmp=android/com.
android.internal.app.ResolverActivity } from ProcessRecord{76636e6d0
30437:패키지명/u0a1691} {pid=30437, uid=11691} with revoked permission
android.permission.CALL_PHONE

 

 

위의 로그를 대충 보면 버튼 누르고 나서, ACTION_CALL 로 암시적 인텐트를 날릴때, 에러가 발생하는 것 같군요

 

그렇다면, 문제가 되고 있는 앱 소스를 잠시 살펴 보았습니다.

 

 

 

TelephonyManager tm = (TelephonyManager)SmartBaseActivity.getInstance().getSystemService( Context.TELEPHONY_SERVICE );
			if( tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT )
			{
				MessageDialog dlgLogout = new MessageDialog( getContext() );
				dlgLogout.setTitle( "전화걸기" );
				dlgLogout.setMessage( "USIM 장착 후 시도해주세요" );
				dlgLogout.setNeutralButton( "확인", new DialogInterface.OnClickListener()
				{
					@Override
					public void onClick( DialogInterface dialog, int which )
					{
						if ( dialog != null )
							dialog.dismiss();
					}
				} );
				dlgLogout.show();
			}
			else
			{
				try
				{
					getContext().startActivity( new Intent( Intent.ACTION_CALL, Uri.parse( strArg1 ) ) );
				}
				catch ( Exception ex )
				{
					ex.printStackTrace();
				}
			}

 

 

 

소스를 보아하니 아래의 소스가 문제가 되는 듯한것을 확인.

 

getContext().startActivity( new Intent( Intent.ACTION_CALL, Uri.parse( strArg1 ) ) );

 

이미 AndroidManifest.xml에서  <uses-permission> 가 추가되어있는데 무엇이 문제일까??

해당 문제에 대해서 구글링해서  찾아보니 대략 2가지 방법이 나옵니다.

 

1. AndroidManifest.xml에서 해당 Activity에서 exported속성을 true속성으로 설정

2. 안드로이드M(마시멜로우 버전)부터 실시간 권한 허가 체크 작업

 

우선, 첫번째 방법인 exported속성을  true로 변경해서 했더니 여전히 문제가 해결되지 않아서 두번째 방법으로 시작함.

 

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
	// 안드로이드 M 이상일 경우
	if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
    	//전화 권한 있을 경우
		getContext().startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(strArg1)));
	}
    else {
    //전화 권한 없을 경우
    }
}
else { // 안드로이드 M 이하일 경우
	getContext().startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(strArg1)));
}

 

 

 

안드로이드 마시멜로우 버전부터 구글 보안 정책이 변화로 다음과 같이 해당 앱 소스에서 처리 시 실시간으로 Permission을 체크해줘야하도록 바뀌었다고 하는 -_-;;;

 

안드로이드M 이상일 경우, 안드로이드 M 이하일 경우에 대한 케이스를 처리해 주어야하니 참고바랍니다~

 

 

관련글 더보기

댓글 영역