Android6.0 동적 신청할 권한은 무엇입니까?

Adroid 시스템 6.0 이전에는 App을 설치할 때 권한을 부여하고 권한을 부여해야 관련 설치를 완성할 수 있었다.6.0 시스템에서는 먼저 App을 설치하고 설치가 끝난 후에 관련 권한을 사용할 때 권한의 알림 상자를 팝업하고 사용자가 권한을 동의해야 정상적으로 사용할 수 있다.구글이 이렇게 하면 사용자로 하여금 관련 권한의 사용을 더욱 명확하게 인식하게 하고 어느 정도에 사용자의 프라이버시를 더욱 인성화하고 보호할 수 있다.
구글은 공식적으로 권한을 두 가지로 나눈다. 하나는 정상적인 권한(Normal Permissions)이다. 이런 권한은 사용자의 프라이버시와 관련이 없고 사용자가 권한을 부여할 필요가 없다. 예를 들어 인터넷 방문, 휴대전화 진동 등이다.또 다른 유형은 위험 권한(Dangerous Permissions)인데 일반적으로 사용자의 프라이버시와 관련된 것이기 때문에 사용자가 SD카드를 조작하는 쓰기, 카메라, 녹음 등 권한을 부여해야 한다.
Normal Permissions:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
Dangerous Permissions:
 group:android.permission-group.CONTACTS
    permission:android.permission.WRITE_CONTACTS
    permission:android.permission.GET_ACCOUNTS    
    permission:android.permission.READ_CONTACTS

  group:android.permission-group.PHONE
    permission:android.permission.READ_CALL_LOG
    permission:android.permission.READ_PHONE_STATE 
    permission:android.permission.CALL_PHONE
    permission:android.permission.WRITE_CALL_LOG
    permission:android.permission.USE_SIP
    permission:android.permission.PROCESS_OUTGOING_CALLS
    permission:com.android.voicemail.permission.ADD_VOICEMAIL

  group:android.permission-group.CALENDAR
    permission:android.permission.READ_CALENDAR
    permission:android.permission.WRITE_CALENDAR

  group:android.permission-group.CAMERA
    permission:android.permission.CAMERA

  group:android.permission-group.SENSORS
    permission:android.permission.BODY_SENSORS

  group:android.permission-group.LOCATION
    permission:android.permission.ACCESS_FINE_LOCATION
    permission:android.permission.ACCESS_COARSE_LOCATION

  group:android.permission-group.STORAGE
    permission:android.permission.READ_EXTERNAL_STORAGE
    permission:android.permission.WRITE_EXTERNAL_STORAGE

  group:android.permission-group.MICROPHONE
    permission:android.permission.RECORD_AUDIO

  group:android.permission-group.SMS
    permission:android.permission.READ_SMS
    permission:android.permission.RECEIVE_WAP_PUSH
    permission:android.permission.RECEIVE_MMS
    permission:android.permission.RECEIVE_SMS
    permission:android.permission.SEND_SMS
    permission:android.permission.READ_CELL_BROADCASTS

해결 방법
공식 문서를 보고 나니 해결 방안이 그리 어렵지도 않고 번거롭지도 않아서 다행이다. 물론 이전과 비교하면 좀 번거롭다.쓸데없는 말은 그만하고 해결 방안은 아래와 같다.
시스템 버전 확인
private boolean canMakeSmores(){

    return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);

}

시스템 버전을 검사하는 이유는 시스템 6.0 이상이면 새로운 권한 수여 방법이 필요하다는 것을 알 수 있다.
권한 수여를 신청하다
예를 들어 만약에 사진 조작이 필요하다면 사진 조작이 필요한 곳에 권한을 붙여 권한을 신청해야 한다.방법은 다음과 같습니다.
String[] perms = {"android.permission.CAMERA"};

int permsRequestCode = 200; 

requestPermissions(perms, permsRequestCode);

승인 콜백 처리
@Override

public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){

    switch(permsRequestCode){

        case 200:

            boolean cameraAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;
            if(cameraAccepted){
                //      ,             
            }else{
                //        ,          
            }

            break;

    }

}

한층 더 처리하고 보완하다
위에서 보듯이 시스템 버전만 검사했습니다. 권한을 부여받은 경우 다시 권한을 부여해야 합니까?우리의 판단은 사실 좀 더 완벽할 수 있다. 예를 들어 다음과 같다.
private boolean hasPermission(String permission){

    if(canMakeSmores()){

        return(checkSelfPermission(permission)==PackageManager.PERMISSION_GRANTED);

    }

    return true;

}

좋은 웹페이지 즐겨찾기