-
안드로이드 앱 개발 연습 - 7 | PermissionArchive/캡스톤디자인 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() } }