Android M (API Level 23)부터 앱의 권한을 인스톨 시점에 허가하는 대신 사용시점(런타임)에 허가하도록 변경되었다. 엄밀히 말하자면 Target SDK 버전 23 이상부터 Dangerous Permission은 런타임에 사용자로부터 권한을 인가받도록 반드시 구현해야 한다.
일반적인 디자인 가이드는 공식사이트에 잘 설명되어있다. 하지만 시스템의 Setting DB를 수정하는 기능을 사용하기 위해서는 조금 다른 방식의 접근이 필요하다.
WRITE_SETTINGS 퍼미션도 기존에 permission android.permission.WRITE_SETTINGS를 Manifest에 선언하였지만 다른 권한과 동일한 런타임 퍼미션 모델로 디자인하면 권한을 부여할 수 없다. 때문에 이 권한을 "Special Permission"이라는 개념으로 분류하기도 하는데 해결 순서는 다음과 같다.
1. Manifest에 WRITE_SETTINGS 선언
2. Settings.System.canWrite()를 호출하여 Write Setting 가능 여부를 판단
3. false를 리턴했다면 ACTION_MANAGE_WRITE_SETTINGS 를 액션으로 갖는 intent를 날려 권한 설정 activity를 부름
이렇게 구현하면 WRITE_SETTINGS 권한을 획득한 적이 없는 경우 권한 부여를 위한 액티비티가 불려진다. 이에 대한 응답을 받는 방식도 조금 다르니 주의해야 한다. 일반적인 가이드는 onRequestPermissionsResult()를 override 하여 권한 획득 이후 동작을 작성해야만 했다. 하지만 WRITE_SETTINGS에 대한 응답은 액티비티 생명주기를 잘 고려하여 작성하도록 하자. 위 예제에서는 onResume()에서 이를 처리하도록 구현하였다.