안드로이드 6.0(api23 이상)에서는 manifest 파일에 기술하는거 이외에, 권한을 요청해야한다.
즉 앱을 설치하고 실행하자마자 필수권한을 요청하던, 권한이 필요한 서비스를 실행할때 권한을 질의하던지 이런식으로 해야한다.
구글 개발자 레퍼런스 문서에는 아래와 같이 permission에 대해 설명하고 있다.
The purpose of a permission is to protect the privacy of an Android user. Android apps must request permission to access sensitive user data (such as contacts and SMS), as well as certain system features (such as camera and internet). Depending on the feature, the system might grant the permission automatically or might prompt the user to approve the request.
요약하면 "권한이란 사용자의 개인정보 보호를 위해 사용되며 그 권한에 따라 시스템이 자동으로 부여하기도 하고 사용자에게 요청을 승인받아야 한다." 라고 정리할 수 있다.
Normal permissions(일반 권한)
→ 단순히 메니페스트에만 정의하면 설치시에 자동으로 권한을 보장한다.
→ 일반 권한의 경우 이전과 같이 uses-permission 속성만 추가하면 사용할 수 있는 권한
Dangerous permissions(위험 권한)
→ 런타임에 명시적으로 사용자에게 권한을 요청해야 하는 골치거리
→ 주로 사용자 개인 정보와 관련된 권한
→ 위험 권한은 일반 권한과 달리 사용자의 개인정보가 담겨있는 정보에 접근하거나 개인정보를 만들어 낼 수 있는 단말의 주요 장치에 접근하는 경우에 부여되는 권한으로 사용자가 직접 권한 하나하나 체크하고 승낙해야 어플이 작동되도록 하는 권한
결론적으로, shouldShowRequestPermissionRationale는 onRequestPermissionsResult 이외의 코드에서 사용하면 비결정적이다.