<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
이러한 것들은 외부의 허가없는 접근으로 부터 보호하는 기능이다.
위의 것들은 Nomal 과 Danger가 섞여있지만, 사용하는 모든 Permission들은
전부 Manifast에 등록해줘야 한다.
이러고 난뒤, Android 6.0 에서는 Dangerous 쪽에 관한 Permission 은 사용자 승인을 받아야 한다.
Permission 체크
SMS 권한 설정을 통해 위험 권한 설정법을 알아보자.
int permissionChceked = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS); if(permissionChceked == PackageManager.PERMISSION_GRANTED){ Toast.makeText(getApplicationContext(), "SMS 수신권한 있음.",Toast.LENGTH_LONG).show(); }else { Toast.makeText(getApplicationContext(), "SMS 수신권한 없음.",Toast.LENGTH_LONG).show(); ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.RECEIVE_SMS},1); }
ContextCompat.checkSelfPermission을 통해 권한을 획득하고, PackageManager를 통해 분기를 가를수있는데 PackageManager 이녀석이 Enum 비스무리하게 되어있다.
public static final int PERMISSION_DENIED = -1;
public static final int PERMISSION_GRANTED = 0;
그렇기에 분기를 통해서, 아닐경우에 승인을 받지않았다는것이고 체크하게 만들어줘야한다.
else { //2. 퍼미션 요청을 허용한 적이 없다면 퍼미션 요청이 필요합니다. 2가지 경우(3-1, 4-1)가 있습니다.
// 3-1. 사용자가 퍼미션 거부를 한 적이 있는 경우에는
if (ActivityCompat.shouldShowRequestPermissionRationale(this,REQUIRED_PERMISSIONS[0])
|| ActivityCompat.shouldShowRequestPermissionRationale(this, REQUIRED_PERMISSIONS[1])) {
// 3-2. 요청을 진행하기 전에 사용자가에게 퍼미션이 필요한 이유를 설명해줄 필요가 있습니다.
Snackbar.make(mLayout, "이 앱을 실행하려면 카메라와 외부 저장소 접근 권한이 필요합니다.",
Snackbar.LENGTH_INDEFINITE).setAction("확인", new View.OnClickListener() {
@Override
public void onClick(View view) {
// 3-3. 사용자게에 퍼미션 요청을 합니다. 요청 결과는 onRequestPermissionResult에서 수신됩니다.
ActivityCompat.requestPermissions( MainActivity.this, REQUIRED_PERMISSIONS,
PERMISSIONS_REQUEST_CODE);
}
}).show();
} else {
// 4-1. 사용자가 퍼미션 거부를 한 적이 없는 경우에는 퍼미션 요청을 바로 합니다.
// 요청 결과는 onRequestPermissionResult에서 수신됩니다.
ActivityCompat.requestPermissions( this, REQUIRED_PERMISSIONS,
PERMISSIONS_REQUEST_CODE);
}