Android6.Permission 에 대한 주의 사항 요약

3931 단어 Android
Andorid6.다음은 targetSdkVersion 23(=22 이하) 미만에서 0(Marshmallow)에서 추가된 애플리케이션에 대한 라이센스(Runtime Permissions)를 적용할 때 주의사항을 요약한 것이다.

장점


23세의 targetSdkVersion이 23세 이하의 상황에서 대응하지 못하게 하는 장점은 다음과 같다.
· 설치 시 프로그램의 허가가 필요합니다. 모두 허가됩니다.
tagetSdkVersion을 23으로 설정하면 응용 프로그램이 허용하지 않기 때문에 허가 대화상자를 표시하고 사용자의 허가를 받아야 합니다.
· targetSdkVersion을 향상시켜 고장 발생 방지

Permissions 에 대한 고려 사항


targetSdkVersion을 23 이하로 설정하더라도 compuileSdkVersion을 23으로 설정하면 Permission에 필요한 방법을 사용할 수 있다.
단, 아래 열거한 주의점은 다음과 같다.

①Context.checkSelfPermission


각 Permission의 라이센스 여부를 확인하는 방법인 checkSelfPermission(String perission)도 라이센스가 없을 때 진짜로 반환됩니다.
↓
23 미만인 경우 PermissionCheckercheckSelfPermission(Context context, String persion)을 사용하면 적절한 결과를 얻을 수 있습니다.

② onRequestPermissionsResult(..., int[]grantResults)의grantResults는 항상PERMMISSIONGRANNTED 회복


허가가 없을 때 사용자에게 허가 대화상자를 표시하고 '허가' 또는 '허가하지 않음' 의 결과를 선택하는 방법을 받아들이는 방법
23 미만이면 허가 대화상자에서 '허락하지 않음' 을 선택한 경우grantResults도 PERMMISSION을 선택할 수 있습니다GRANNTED로 돌아갑니다.
↓
23 미만의 경우 onRequestPermissions Result(...)내부①의 PermissionCheckercheckSelfPermission(...)를 참고하십시오.
라이센스를 선택한 경우 PermissionCheckercheckSelfPermission(...)진실로 돌아가도록 수정되었습니다.
(targetSdkVersion 23이면 적절한grantResult를 반환합니다.)

③ 라이센스 대화 상자에서 라이센스를 선택하면 응용 프로그램이 다시 시작됩니다.


RequestPermissions(String[]permissions, int requestCode)를 사용하여 라이센스 대화 상자를 표시한 후 라이센스되지 않은 Permission에 대해 [라이센스]를 선택하면 응용 프로그램이 다시 시작됩니다.
라이센스 변경 시 시스템 로그:
I/ActivityManager: Killing *** : Permission related app op changed
적용 -> 응용 프로그램 -> 객체 응용 프로그램의 권한 변경 라이센스 상태를 설정할 때도 마찬가지로 다시 시작합니다.그러나 라이센스 대화 상자에서 라이센스를 변경한 후에만 다시 시작합니다.
targetSdkVersion 23이면 재부팅되지 않습니다.
↓
허가 대화상자를 표시하지 않고 설정된 응용 프로그램의 화면을 보여 허가를 변경하는 방법도 있다.
응용 프로그램의 권한 화면으로 이동할 수 없습니다.
Java

Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:あなたのアプリのパッケージ名"));
startActivity(intent);

④ 허용 대화 상자에서 스토리지 라이센스를 변경한 후 재부팅한 상태에서는 스토리지를 액세스할 수 없습니다.


③ Permission에 대한 스토리지 라이센스 대화 상자를 다시 시작합니다.
PermissionChecker.checkSelfPermission(...)진짜로 돌아가다
실제로 스토리지 라이센스가 필요한 Environmentge tExternal Storage Directory() 등의
File.canWrite()가 휴가를 반환합니다.
또 실제 방문 시 다음과 같은 예외를 토로한다.
W/System.err: java.io.IOException: open failed: EACCES (Permission denied)
W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at java.io.File.createNewFile(File.java:932)
W/System.err: ... 3 more
이 상태에서 멀티태스킹 화면 등을 통해 앱을 다시 시작하면 정상적으로 접근할 수 있다.
또 설정 프로그램에서 허가 상태를 변경한 후 시작하면 이런 현상이 일어나지 않는다.
(targetSdkVersion 23이면 재부팅되지 않으며 허용 대화 상자에서 선택하면 스토리지 디바이스에 정상적으로 액세스할 수 있습니다.

총결산


23 미만이면 일부 제한이 있는 것 같으니 그것에 따라 시행할 필요가 있다.
특히 ④의 경우 재가동 등 대응책을 안내해야 할 수도 있다.

참고 자료

좋은 웹페이지 즐겨찾기