개발하던 앱이 마쉬멜로우(M) 버전을 타겟으로 만들고 있었는데

M버전 이상 버전으로는 권한체크 방식이 달라졌다고 들어서


갤럭시 노트4(os 버전이 마쉬멜로우)를 빌려 그곳에 컴파일 해보았는데

해당 Dangerous permissions 을 사용하는 기능에서 

에러가 나면서 앱이 종료되버렸다.

(사실 앱이 종료까지 될 줄은 몰랐다. 해당 기능만 실행 안되고 말줄 았았는데

앱이 강제 종료되버렸다.)


내가 사용한 Dangerous permissions 에는 


ACCESS_FINE_LOCATION

CALL_PHONE

WRITE_EXTERNAL_STORAGE

GET_ACCOUNTS


요렇게 있었는데 해결 방법을 찾던 중

좋은 블로그를 발견해서 여기를 참고하여 해결했다.

http://gun0912.tistory.com/55



이 사이트에서는 라이브러리도 제공하는데

TedPermission 라이브러리를 이용하여

쉽게 권한문제를 해결했다.


https://github.com/ParkSangGwon/TedPermission


해당 Dangerous permissions 을 사용하는 곳에서 

기능을 사용하기전에 권한 체크를한 후

권한이 있을때 작업을 진행하는 구조인것 같다.


////////////////////////////////////////////////////////////////////////////


권한 체크 작업을 하던중 기존에 작동하던 기능이 안되는 부분을 발견하여 

확인해보았는데 



<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


이 부분의 권한이 문제를 이르켰다.


푸쉬알람이 오면 앱안이든 앱밖이던 언제든지 윈도우 다이얼로그 팝업을 띄우려고(최상위 뷰) 사용한 권한인데

해당 기능에 퍼미션 문제를 이르키며 작동되지 않았다


TedPermission 라이브러리를 이용해서 처리해보려 했는데 해결되지 않았다.


확인해보니 해당 권한은 [앱] -> [설정] -> [권한] 에서 확인 하여 허용하는 권한이 아니라

[다른 앱 위에 그릴 수 있는 앱]이라는 설정 화면 에서 허용을 해줘야하는 권한이었다.


https://brunch.co.kr/@babosamo/49


그래서 해당 부분 권한은 따로 처리하였는데


public final static int REQUEST_CODE = 3333;


public void startOverlayWindowService(Context context) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(context)) {

            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));

            startActivityForResult(intent, REQUEST_CODE);

        }

    }



@Override

protected void onActivityResult(int requestCode, int resultCode,  Intent data) {

    if (requestCode == REQUEST_CODE) {

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

            if (Settings.canDrawOverlays(this)) {

                Toast.makeText(MainActivity.this, "오버레이 권한 확인 완료", Toast.LENGTH_SHORT).show();

            } else {

                Toast.makeText(MainActivity.this, "오버레이 권한이 없습니다.", Toast.LENGTH_SHORT).show();

            }

        }

    }

}


이런식으로 처리를 해주었다.

+ Recent posts