임리프 2020. 8. 19. 14:31
반응형

안드로이드에서는 개인정보, 센서, 저장소, 카메라 등을 사용하기 위해서는 권한 등록을 해야 합니다.

권한이 필요로 하는 기능을 사용할 때 반드시 권한을 등록을 해야 합니다.

 

 

 

사용 방법은 아래와 같이 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 사용 권한을 받습니다.

반응형