안드로이드 프로그래밍/[ Android Framework ]

[ Android ] 04. Permission 설정하기

kim.svadoz 2020. 8. 12. 11:17
반응형

Permission

마시맬로 버전 이후부터는 퍼미션 등록뿐 아니라, 사용자가 사용하기 전 퍼미션 안내 및 등록 및 직접 설정

종류

  • 일반권함

  • 위험권한

    액티비티를 실행하거나 버튼을 누르거나 어떤 기능을 사용할 때 권한에 대한 처리를 할 수 있도록 구현

  • 사용 메소드

    • checkSelfPermission : 퍼미션의 현재 상태를 확인하는 메소드

      - PERMISSION_DENIED : 퍼미션이 부여되지 않은 상태
      - PERMISSION_GRANTED : 퍼미션이 부여되지 있는 상태
    • requestPermissions : (checkSelfPermission : PERMISSION_DENIED )권한이 체크되어 있지 않은 경우에 권한을 요청하는 메시지를표시

      (이 메소드 이외에도 제공되는 메소드는 여러개임)

    • onRequestPermissionsResult : requestPermission의 결과로 호출되는 메소드

      // 퍼미션 설정 정보를 매개변수로 넘긴다.
      int requestCode : 퍼미션 요청할 때 넘긴 요청코드
      String[] permissions : 요청퍼미션 목록
      int[] grantResults :퍼미션 설정 성공 결과
  • 처리 순서

    1. 현재 사용하려고 하는 권한이 설정되어 있는지 체크

      => checkSelfPermission 을 이용

    2. 1번에서 리턴값이 PERMISSION_DENIED 인 경우 사용자가 권한을 설정할 수 있도록 메시지를 표시

      => requestPermissions

    3. 요청 처리 후 자동으로 호출되는 메소드를 통해 다음에 어떤 처리를 할 것인지 정의

      • 권한 성공 : 기능이 실행되도록
      • 권한 실패 : Preference를 통해 설정할 수 있도록 Activity를 이동하거나 안내 메시지 출력

사용자 정의 Permmision

<uses-permission android:name="com.exam.permission.JAVA_PERMISSION" /> // 뷰에 대한 권한 설정 ((사용자))
<uses-permission android:name="android.permission.INTERNET"/> // 인터넷 권한 설정(( 일반 ))
<uses-permission android:name="android.permission.CAMERA"/> // 카메라 권한 설정 (( 위험 ))

<application android:usesCleartextTraffic="true" /> // 문자열 통신 text에 대한 설정
  • 권한을 테스트할 때는 번거롭더라도 앱을 삭제하고 다시 실행하기
public class RuntimePermissionTest extends AppCompatActivity {
    //퍼미션의 상태를 저장할 변수
    boolean permission_state; //초기값 false
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_runtime_permission_test);
        // 1. Permission 먼저 체크
        if(ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED){
            permission_state = true;
            printToast("권한이 설정되었습니다.");
        }else{
            permission_state = false;
            printToast("권한을 설정해야 합니다.");
            // 2. 권한이 없는 경우 권한을 설정하는 메시지를 띄운다.
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
                    1000);
        }
    }

    // 3. requestPermissions의 메시지창에서 선택한 후 호출되는 메소드
    //  결과를 리턴 - 결과에 따라 다르게 처리할 수 있도록 구현
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==1000 && grantResults.length>0){ //권한의 성공설정에 대한 결과가 있다는 의미
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                permission_state = true;
                printToast("권한 설정 마무리 완료~");
            }else{
                printToast("권한 설정을 하지 않았으므로 기능으 사용할 수 없습니다.");
            }
        }
    }

    public void printToast(String msg){
        Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
    }

    public void runCamera(View v){
        if(permission_state){
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivity(intent);
        }else{
            printToast("권한을 설정해야 기능을 사용할 수 있습니다.");
            //권한을 설정할 수 있는 Activity로 자동 이동되도록
            //(사용자로 하여금 권한을 다시 설정할 수 있도록 만들기)
        }

    }
}
반응형