<uses-permission android:name="string" android:maxSdkVersion="integer" />
* maxSdkVersion 이 18 일 떄 19 버전부터는 이 권한이 적용되지 않음
if (envInfo.getOsVersion() > Build.VERSION_CODES.M) {
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
}
public class PermissionActivity extends AppCompatActivity {
public final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 101;
// 체크 -> 요청 -> 확인
protected boolean checkPermission(String permission, int message) {
int permissionCheck = ContextCompat.checkSelfPermission(this, permission);
if (permissionCheck == PackageManager.PERMISSION_DENIED) {
Log.d("TEST", "거부상태다.");
shouldShowRequestPermission(permission, message);
return false;
} else {
Log.d("TEST", "수락상태다");
requestPermission(permission, message);
return true;
}
}
private void shouldShowRequestPermission(String permission, int message) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
Log.d("TEST", "거부를 눌렀었다. 왜 해야하는지 설명하자.");
requestPermission(permission, message);
} else {
Log.d("TEST", "거부를 누른적이 없다 권한을 요청하자.");
requestPermission(permission, message);
}
}
}
private void requestPermission(String permission, int message) {
ActivityCompat.requestPermissions(this, new String[]{permission}, message);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 권한 허가
Log.d("TEST", "승인");
} else {
// 권한 거부
Log.d("TEST", "거부");
}
return;
}
}
}
2019-01-23 16:40:02.233 8246-8246/com.develop.tb02 D/TEST: 거부상태다.
2019-01-23 16:40:02.236 8246-8246/com.develop.tb02 D/TEST: 거부를 누른적이 없다 권한을 요청하자.
거부 누른 후
2019-01-23 16:40:16.643 8246-8246/com.develop.tb02 D/TEST: 거부상태다.
2019-01-23 16:40:16.644 8246-8246/com.develop.tb02 D/TEST: 왜 해야하는지 설명하자.
승인 누른 후
승인
or
class PermissionActivity : AppCompatActivity() {
companion object {
const val PERMISSION_REQUEST_STORAGE_STORAGE = 1001
const val PERMISSION_REQUEST_MICROPHONE_STORAGE = 1002
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, PERMISSION_REQUEST_STORAGE_STORAGE)
}
private fun checkPermission(permission: String, message: Int): Boolean {
val permissionCheck = ContextCompat.checkSelfPermission(this, permission)
return if (permissionCheck == PackageManager.PERMISSION_DENIED) {
Log.d("TEST", "거부상태다.")
shouldShowRequestPermission(permission, message)
false
} else {
Log.d("TEST", "수락상태다")
requestPermission(permission, message)
true
}
}
private fun shouldShowRequestPermission(permission: String, message: Int) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(this, permission)) {
Log.d("TEST", "거부를 눌렀었다. 왜 해야하는지 설명하자.")
requestPermission(permission, message)
} else {
Log.d("TEST", "거부를 누른적이 없다 권한을 요청하자.")
requestPermission(permission, message)
}
}
}
private fun requestPermission(permission: String, message: Int) {
ActivityCompat.requestPermissions(this, arrayOf(permission), message)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
PERMISSION_REQUEST_STORAGE_STORAGE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 권한 허가
checkPermission(Manifest.permission.RECORD_AUDIO, PERMISSION_REQUEST_MICROPHONE_STORAGE)
} else {
// 권한 거부
setResult(RESULT_CANCELED)
finish()
}
return
}
PERMISSION_REQUEST_MICROPHONE_STORAGE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 권한 허가
setResult(RESULT_OK)
} else {
// 권한 거부
setResult(RESULT_CANCELED)
}
finish()
return
}
}
}
}