ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 앱 개발 연습 - 7 | Permission
    Archive/캡스톤디자인 2022. 3. 28. 16:11

    명세 유형

    권한 명세

    특정 데이터나 기능의 사용 여부 권한을 사용자로부터 내려받기 위한 명세.

    AndroidManifest.xml 파일에 <user-permission /> 태그에 저장된다.

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />

    기능 명세

    특정 기능을 사용할 수 있는 안드로이드 폰에서만 플레이스토어에서 내려받을 수 있도록 하는 명세.

    AndroidManifest.xml 파일에 따로 추가하지 않아도 해당 기능을 사용할 때 시스템이 자동으로 부여한다.

    <uses-feature android:name="android.hardware.camera" android:required="true" />

    위의 기능 명세가 작성된 앱은 카메라가 없는 스마트폰에서는 다운로드할 수 없다.


    권한 수준

    일반 권한 (Normal Permission)

    개인정보의 노출이 직접적으로 일어나지 않는 정도의 권한으로, AndroidManifest.xml에 명세하여 권한 승인을 받는다.

    Permission Description
    ACCESS_NETWORK_STATE 네트워크 연결 상태 확인
    ACCESS_WIFI_STATE 와이파이 상태 확인
    BLUETOOTH 블루투스 상태 확인
    INTERNET 인터넷 네트워크 사용
    NFC NFC 사용
    SET_ALARM 알람 설정
    VIBRATE 진동 설정

    위험 권한 (Dangerous Permission)

    앱이 사용자의 개인정보와 관련된 데이터나 기능을 액세스하거나 다른 앱 및 기기의 작동에 영향을 줄 우려가 있는 권한으로, AndroidManifest.xml에 명세한 후 소스코드를 이용해 권한 승인을 받는다. (안드로이드 6 버전 이상)

    Permission Group Permission Description
    CALENDAR READ_CALENDAR 캘린더 읽기
    WRITE_CALENDAR 캘린더 쓰기
    CAMERA CAMAERA 카메라 사용
    CONTACTS READ_CONTACTS 주소록 읽기
    WRITE_CONTACTS 주소록 쓰기
    GET_ACCOUNTS 계정 정보 가져오기
    LOCATION ACCESS_FINE_LOCATION 위치 정보 사용
    ACCESS_COARSE_LOCACTION 위치 정보 사용
    MICROPHONE RECORD_AUDIO 마이크 사용
    PHONE READ_PHONE_STATE 폰 상태 정보 읽기
    READ_PHONE_NUMBERS 전화번호 가져오기
    CALL_PHONE 발신
    ANSWER_PHONE_CALLS 응답
    READ_CALL_LOG 전화 로그 읽기
    WRITE_CALL_LOG 전화 로그 쓰기
    ADD_VOICEMAIL 음성메일 추가
    USE_SIP SIP 사용
    PROCESS_OUTGOING_CALLS 통화 관련 Broadcast 수신
    SENSORS BODY_SENSORS 바디센서
    SMS SEND_SMS SMS 보내기
    RECEIVE_SMS SMS 받기
    READ_SMS SMS 읽기
    RECEIVE_WAP_PUSH WAP 수신
    RECEIVE_MMS MMS 받기
    STORAGE READ_EXTERNAL_STORAGE 저장소 읽기
    WRITE_EXTERNAL_STORAGE 저장소 쓰기

    같은 그룹에 속한 권한의 요청은 그룹 단위로 처리된다. 따라서 요청한 권한과 동일한 그룹 내의 다른 권한이 이미 부여된 상태라면, 시스템은 해당 권한을 즉시 부여한다.

    서명 권한 (Signature Permission)

    해당 권한을 사용하려는 앱이 권한을 정의하는 앱과 동일한 인증서로 서명된 경우 시스템이 자동으로 부여하는 권한이다. (뭔 말인지 모르겠음)


    위험 권한 처리

    build.gradle (:app)

    ...
    dependencies {
        implementation "androidx.activity:activity-ktx:1.4.0"
        implementation "androidx.fragment:fragment-ktx:1.4.1"
        ...
    }

    registerForActivityResult 관련 의존성 추가

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.pokycookie.permission">
    
        <uses-permission android:name="android.permission.CAMERA" />
        <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/Theme.Permission">
            <activity
                android:name=".MainActivity"
                android:exported="true">
                <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="android.permission.CAMERA" />로 카메라 권한 추가

    MainActivity.kt

    class MainActivity : AppCompatActivity() {
        val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
        lateinit var activityResult: ActivityResultLauncher<String>
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            activityResult = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
                if (isGranted) {
                    startProcess()
                } else {
                    finish()
                }
            }
    
            binding.btnCamera.setOnClickListener {
                activityResult.launch(Manifest.permission.CAMERA)
            }
        }
    
        fun startProcess() {
            Toast.makeText(this, "Camera On", Toast.LENGTH_SHORT).show()
        }
    }

    댓글