안드로이드 권한
안드로이드에서는 개인정보, 센서, 저장소, 카메라 등을 사용하기 위해서는 권한 등록을 해야 합니다.
권한이 필요로 하는 기능을 사용할 때 반드시 권한을 등록을 해야 합니다.
사용 방법은 아래와 같이 AndroidManifest.xml 에 권한을 등록해주면 됩니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.permissionexample">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<uses-permission android:name="권한 종류"/>
위와 같이 사용하면 됩니다.
권한 중에 개인정보를 필요로 하는 권한은 안드로이드 마시멜로부터 사용자가 권한 체크를 해야지 사용할 수 있습니다.
권한 체크는 코드로 작성하면 됩니다.
전체 코드는 아래와 같습니다.
class MainActivity : AppCompatActivity() {
private val permissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
Manifest.permission.SEND_SMS,
Manifest.permission.RECEIVE_SMS
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkPermission()
}
private fun checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for(permission in permissionList) {
if (checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {
requestPermissions(permissionList, 0)
}
}
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
private val permissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_CONTACTS,
Manifest.permission.WRITE_CONTACTS,
Manifest.permission.SEND_SMS,
Manifest.permission.RECEIVE_SMS
)
허용할 권한들을 넣은 배열입니다.
private fun checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for(permission in permissionList) {
if (checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_DENIED) {
requestPermissions(permissionList, 0)
}
}
}
}
권한 허용을 확인하는 checkPermission 함수입니다.
먼저, 마시멜로 이상 버전은 권한 허용을 확인합니다.
그리고 checkCallingOrSelfPermission을 통하여 권한이 확인되어있는지 검사를 합니다.
PackageManager.PERMISSION_DENIED를 통해 권한 허용이 되어있지 않는다면 requestPermissions을 통해 권한을 받습니다.
requestPermissions에는 permissionList를 넣었지만 만약 권한 허용을 안 하고 지나쳤을 때 권한 허용을 하지 않은 권한들만 다시 보여줍니다.
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
onRequestPermissionsResult 함수는 권한 허용이 끝난 후 실행되기 때문에 권한 허용이 끝난 후 바로 작업하고 싶은 것들이 있다면 사용하면 됩니다.
실행하면 아래와 같이 동작하는 것을 볼 수 있습니다.
같은 종류의 권한일 경우에는 하나의 큰 권한만 받습니다.
즉, Manifest.permission.SEND_SMS와 Manifest.permission.RECEIVE_SMS 권한을 받는다고 하면 SMS 사용 권한을 받습니다.