Android Studio) 퍼미션(Permission)

chaeyoung·2023년 1월 17일
0

Android Studio

목록 보기
5/13
post-thumbnail

퍼미션(Permission)

퍼미션? : Manifest에 들어가는 설정

  • 컴포넌트를 이용해 앱-앱 연동에서 <permission> 부여시 그 앱을 이용하는 앱은 <uses-permission>을 선언해야한다.

    <Permisson>

  • <Permisson>: 자신의 앱을 외부에서 이용할 때 권한을 부여, 권한을 가지고 들어올때만 실행 가능

    • <uses-permission>: <Permisson>이 선언된 앱을 이용하는 앱에 선언
    • 외부에서 이용한다면 인텐트를 발생시키면 된다.
    <activity android:name=".SomeActivity">
    	<intent-filter>
        	<action android:name="aaa"/>
            <category android:name="android.intent.category.DEFAULT"/>
        <intent-filter>
    </activity>
    
    /* 	permisson으로 보호하고 싶을 때 추가*/
    <permisson android:name="com.test.permission.Some_PERMISSOION"
    	android: label = "SOME Permission"
        android: description = "@string/permission"
        android: protectionLevel="normal"/>
    • name: 퍼미션 이름

    • Label, description: 퍼미션에 대한 설명(사용자에게 보이는 문자열)

    • protectionLevel: 보호 수준

      • normal < dangersous
      • signature: 동일한 키로 서명된 앱만 실행
      • signatureOrSystem: 안드로이드 시스템 앱, 동일키로 서명된 앱만 실행
    • 사용할 때

      <activity android:name=".SomeActivity"
      	android:permission="com.test.permission,SOME_PERMISSON">
         <intent-filter>
             <action android:name="aaa"/>
             <category android:name="android.intent.category.DEFAULT"/>
         <intent-filter>
      </activity>
      
      /* uses-permission */
      <uses-permission android:name="com.test.permission,SOME_PERMISSON">

protectionLevel 속성

  • "normal", "dangerous", "signature" 중 하나로 설정됨
    • "normal": 퍼미션으로 보호되는 기능이 사용자에게 위험 부담이 적다(uses-permission은 요구, 사용자에게 퍼미션 제공x)
      • 사용자에게 퍼미션 부여?: 엡을 실행했을 때 앱의 권한 설정과 같다. normal은 권환 화면이 나오지 않는다, dangerous는 시용자에게 권한을 부여할지 물어본다.
    • "signature": 외부 앱이 같은 키로 서명되어야 실행

시스템의 Permission

  • 앱-시스템에 선언: ex. 외부에서 파일을 읽거나 쓸 때
  • 파일 관련 코드: 시스템 자체에서 permission으로 보호하고 있어 <uses-permission> 선언
  • 이용빈도가 높은 시스템 퍼미션
    Permission
    ACCESS_FINE_LOCATION정확한 위치 정보 인덱스
    ACCESS_NETWORK_STATE네트워크에 대한 정보 엑세스
    ACCESS_WIFI_STATE와이파이 네트워크에 대한 정보 엑세스
    BATTERY_STATS베터리 통계 수집
    BLUETOOTH연결된 블루투스 장치에 연결
    BLUETOOTH_ADMIN블루투스 장치를 검색하고 페어링
    CALL_PHONE다이얼 UI 거치지 않고 전화 시작
    CARMERA카메라 장치에 엑세스
    INTERNET네트워크 연결
    READ_CONTACTS사용자의 연락처 데이터 읽기
    READ_EXTERNAL_STORAGE장치에 전화번호, 네트워크 정보, 통화상태 읽기
    READ_SNS메세지 읽기
    RECEIVE_BOOT_COMPLETED부팅 완료 시 수행
    RECEIVE_SNSsns 메세지 수신
    RECORD_AUDIO오디오 녹음
    SEND_SNS메세지 발신
    WRITE_CONTACTS사용자 연락처 데이터 쓰기
    WRITE_EXTERNAL_STORAGE외부 저장소에 파일 쓰기

사용자가 앱권한을 선택할 수 있을 경우

  • 사용자가 permission을 거부하는 상황을 고려해 프로그램 작성
    • PERMISSION_GRANTED: 퍼미션이 부여된 상태
    • PERMISSION_DENIED: 퍼미션이 부여되지 않은 상태
      if(ContextCompat.checkSelfPermission(this, 
      	Manifest,permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
       	// ...
       }
      • 코드로는 직접 퍼미션을 부여할 수 없다.
        • 대화 상자는 함수로 가능(허용/ 거부)
          void requestPermissions(Activity activity, String[] permissions, int requestCode)
          • 두번째 매개변수: 퍼미션 요청 이름
          • 세번째 매개변수: 상태코드 값(퍼미션 조정 결과)
        • 대화상자를 띄워 퍼미션 허용 여부를 묻는 코드
           ActivityCompat.requestPermission(this, 
           	new String[](Manifest.permission.READ_EXTERNAL_STORAGE},200)
              
           // 사용자의 퍼미션 조정이 끝나면 대화상자 닫히고 다음 함수 호출
           void onRequestPermissionsReult(int requestCode, 
           String[] permissions, int[] grantResults)
          • 두번째 매개변수: 요청한 퍼미션 이름
          • 세번째 매개변수: 사용자 조정 결과값

    파일에 읽고 쓰기

    외부 저장 공간 이용

    • 스마트폰에서 외부 저장공간을 제공하는지 판단:
      String state = Environment.getExternalStorageState();
      if (state.equals(Environment.MEDIA_MOUNTED){
      	if(state.equals(Environment.MEDIA_MOUNTED_READ_ONLY){
       		externalStorageReadable = true;
               externalStorageWritable = false;
       } else{
       		externalStorageReadable = true;
              externalStorageWritable = true;
       }
       else externalStroageReadable = externalStorageWritable = false;
      }
      • Environment.getExternalStorageState(): 외부 저장 공간에 대한 정보 획득
      • MEDIA_MOUNTED: 외부 저장공간을 제공한다는 의미
      • Environment.MEDIA_MOUNTED_READ_ONLY: 파일 읽고 쓰기 가능한지 판단

    • 매니페스트 설정도 필요
      	<manifest xmlns: android="http://schemas.android.com/apk/res/android"
          package="com.example.test">
           	<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
           	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        		<!--- 중략 -->
          </manifest>
      • 외부 메모리 공간에 파일쓰기: WRITE_EXTERNAL_STORAGE 퍼미션 선언
      • 파일 읽기: READ_EXTERNAL_STORAGE 퍼미션 선언

    • 파일 읽거나 쓰는 코드 작성
      • File tempFile = File.createTempFile("IMG", ".jpg", dir)
        • createTempFile(): 자동으로 파일명 중복되지 않게 부여(파일명, 파일확장자, 파일)
      • File file1 = new File(
         Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES),"a.jpg")
        • getExternalStoragePublicDirectory(): 스마트폰 공용 폴더 경로를 전달
        • 다양한 경로 존재
          경로
          Environment.DIRECTORY_ALAMS알림으로 사용할 오디오 파일 저장 폴더
          Environment.DIRECTORY_DCIM카메라로 촬영한 사진 저장 폴더
          Environment.DIRECTORY_DOWNLOADS다운로드한 파일 저장 폴더
          Environment.DIRECTORY_PICTURES이미지 파일 저장 폴더

    내부 저장 공간 이용

    • getFileDir()함수: 앱의 내부 저장 공간에 파일만들기 + 문자열 데이터 쓰기



SharedPreferences

SharedPreferences: 앱의 데이터를 영속적으로 저장하기 위한 클래스

  • 데이터베이스 관리 시스템(DBMS): key - value 형태로 저장

  • 저장 데이터: xml 파일 형식, SharedPreferences객체가 직접 파일 읽고써줌

  • SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);

    • getPreferences(): 별도 파일명 지정하지 않고 자동으로 액티비티 이름의 파일에 저장
    • 하나의 액티비티만을 위한 저장공간이 되어 다른 액티비티가 데이터 이용 x

  • SharedPreferences sharedPref = getSharedPreferences("my_pref",Context.MODE_PRIVATE); 
    • getSharedPreferences(): 파일명에 대한 정보를 매개변수로 저장, 해당이름의 xml파일 생성
    • 다른 액티비티/ 컴포넌트 들이 데이터 공유 가능(구분해 저장할 때 사용)

  • SharedPreferences sharedPref = PreferenceManager.getDefualtSharedPreferences(this); 
    • PreferenceManager.getDefualtSharedPreferences(): 앱 패키지명을 파일명으로 사용
  • SharedPreferences 객체 획득 시 지정 mode:

    mode
    MODE_PRIVATE자기 앱 내에서 사용, 외부 접근 불가
    MODE_WORLD_READABLE외부 앱에서 읽기 가능
    MODE_WORLD_WRITEABLE외부 앱에서 쓰기 가능

0개의 댓글