Android 6.0 권한 사용 설명

9267 단어 android
전재 출처 표시:http://blog.csdn.net/listeners_Gao/article/details/53606845
개술
안 드 로 이 드 7.0 이 발표 되면 서 안 드 로 이 드 6.0 의 보급 속도 가 빠르게 올 라 갔 고, 현재 안 드 로 이 드 6.0 의 시장 점유 율 은 15.2% 이다.(구체 적 인 데 이 터 는 안 드 로 이 드 정보 센터 를 볼 수 있 습 니 다. 안 드 로 이 드 개발 자 데 이 대회 가 열 린 후부 터 많은 사이트 가 있 습 니 다. 우리 개발 자 들 이 직접 방문 할 수 있 습 니 다. 사다 리 를 오 르 지 않 아 도 됩 니 다. 국내 개발 자 들 에 게 큰 복음 입 니 다.이 때, 우 리 는 새로운 버 전의 SDK 의 변화 에 적합 해 야 더 나 은 응용 프로그램 이 실 행 될 수 있 습 니 다. 6.0 의 변화 에 대해 서 는 홈 페이지 의 이 글 을 참고 할 수 있 습 니 다: Android 6.0 변경. 이 글 은 주로 Android 6.0 실행 시 권한 (Runtime Permissions) 에 대해 소개 합 니 다.
여기 서 홈 페이지 의 두 편의 글 을 추천 합 니 다. 왜냐하면 공식 문서 가 가장 과학적 이기 때 문 입 니 다.
  • 시스템 권한 사용
  • 권한 최 적 방법
  • 2. 런 타임 권한
    Android 6.0 (API 레벨 23) 에서처음에 사용 자 는 설치 할 때 권한 을 부여 하 는 것 이 아니 라 실행 할 때 권한 을 부여 하기 시 작 했 습 니 다. 이 방법 은 설치 과정 을 간소화 할 수 있 고 사용 자 는 응용 기능 에 대해 더 많은 통 제 를 할 수 있 습 니 다. 6.0 이하 의 경우 우리 가 응용 프로그램 을 설치 할 때 기본적으로 권한 을 부여 합 니 다. 사용자 도 이러한 권한 이 무슨 소 용이 있 는 지 모 르 고 묵묵히 참 을 수 밖 에 없습니다.새로운 권한 체 제 는 이러한 문 제 를 잘 해결 할 수 있 습 니 다. Google 은 새로운 권한 을 정상 권한 과 위험 권한 으로 나 눕 니 다.
  • 정상 권한: 정상 권한 은 응용 프로그램 이 샌 드 박스 외부 데이터 나 자원 에 접근 해 야 하지만 사용자 의 프라이버시 나 다른 응용 프로그램 에 대한 조작 위험 이 적은 영역 을 포함 합 니 다. 예 를 들 어 시간 대 를 설정 하 는 권한 은 정상 권한 입 니 다. 성명 기 를 사용 하려 면 시스템 은 자동 으로 응용 프로그램 에 권한 을 부여 합 니 다. 홈 페이지 의 정상 권한 목록 을 참고 하 십시오.
  • 위험 권한: 위험 권한 은 사용자 의 프라이버시 정보 와 관련 된 데이터 활성 자원 이나 사용자 가 저장 한 데이터 활성 에 영향 을 미 칠 수 있 는 영역 을 포함 합 니 다. 예 를 들 어 사용자 의 연락 처 를 읽 는 것 은 위험 권한 에 속 합 니 다. 위험 권한 이 필요 하 다 면 사용 자 는 명확 하 게 응용 프로그램 에 권한 을 부여 해 야 합 니 다. 사실 저 희 는 개발 중 입 니 다.위험 권한 만 잘 처리 하면 정상 권한 의 처리 방식 은 이전 과 같 습 니 다. 위험 권한 그림 을 붙 입 니 다.
  • 위 에 있 는 위험 권한 을 보면 위험 권한 이 그룹 으로 나 뉘 어 져 있 음 을 알 수 있 습 니 다. 그룹 을 나 누 는 것 이 우리 의 권한 에 영향 을 줄 수 있 습 니까? 확실히 영향 을 줍 니 다. 만약 당신 의 앱 이 Android 6.0 이상 의 기기 에서 실행 된다 면 (targetSdkVersion > = 23 아래 에 자세히 설명 합 니 다)"권한 부여 메커니즘 은 이 렇 습 니 다. 만약 당신 이 어떤 위험 권한 을 신청 했다 면, 만약 당신 의 앱 이 이미 사용자 에 게 같은 그룹의 위험 권한 을 부여 받 았 다 고 가정 하면, 시스템 은 즉시 권한 을 부여 할 것 이 며, 대화 상 자 를 꺼 내 서 권한 을 부여 하지 않 을 것 입 니 다. 예 를 들 어, 당신 의 앱 은 이미 CONTACTS 권한 제한 그룹의 READ CONTACTS 에 권한 을 수 여 했 습 니 다. 당신 의 앱 이 WRITE CONTACTS 권한 을 신청 할 때 시스템 은직접 권한 을 부여 합 니 다. 또한, 신청 시 Dialog 를 팝 업 하 는 텍스트 설명 도 하나의 권한 이 아 닌 전체 권한 그룹 에 대한 설명 입 니 다. 여기 서 주의해 야 할 것 은 팝 업 하 는 Dialog 는 시스템 이 제공 하 는 것 입 니 다. 저 희 는 맞 춤 형 제작 을 할 수 없습니다.
    3. 권한 이 적당 하 다.
    우선 저 희 는 이전 방식 에 따라 전 화 를 걸 수 있 는 권한 (전화 걸 기 권한) 을 신청 하고 Android 6.0 (targetSdkVersion > = 23) 핸드폰 에서 테스트 합 니 다.
    //                 
    
    
    // Button      ,  Intent    
    Intent intent = new Intent(Intent.ACTION_CALL);
    intent.setData(Uri.parse("tel:" + phoneNumber));
    startActivity(intent);      //        。(android studio 2.2.2  )  AS       。
    

    App 을 실행 하고 전화 걸 기 버튼 을 누 르 면 App 이 무 너 진 것 을 발견 할 수 있 습 니 다... 아래 에 이상 원인 도 를 붙 입 니 다.
    그림 에서 보 듯 이 Security Exception 권한 이 이상 하기 때 문 입 니 다. 이 이상 을 해결 하 는 방법 은 두 가지 가 있 습 니 다.
  • android studio 에서 build. gradle (module: app) 파일 을 열 고 targetSdkVersion 의 버 전 번 호 를 23 이하 로 수정 하면 이 이상 을 해결 할 수 있 습 니 다. 기 존 규칙 을 계속 사용 하 십시오. 사용 자 는 설치 할 때 모든 권한 을 받 아들 여야 합 니 다. 설치 후 app 에 그 권한 이 있 습 니 다!
  • 안 드 로 이 드 가 제공 하 는 관련 API 를 사용 하여 권한 검 사 를 하여 이 이상 을 피 합 니 다.
  • 그러나 '정서' 가 있 는 프로그램 원숭이 로 서 우 리 는 어떻게 첫 번 째 로 이렇게 낮은 방법 으로 문 제 를 해결 할 수 있 습 니까? 다음은 안 드 로 이 드 가 제공 하 는 관련 API 를 사용 하여 이상 을 처리 합 니 다.
  • 우선 명세서 파일 에 전 화 를 걸 수 있 는 권한 을 신청 하 는데 이 단 계 는 필수 적 이다.
    
    
  • Button 의 클릭 이벤트 에서 전 화 를 걸 기 전에 먼저 Activity Compat. checkSelfPermission () 방법 으로 전화 걸 기 권한 이 있 는 지 확인 합 니 다.이 때 PERMISSION DENIED 값 을 되 돌려 준다 면 코드 를 볼 수 있 는 권한 을 수 동 으로 요청 해 야 합 니 다.
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
        /**
         *         
         *        ,      Context;
         *                    ;
         *       requestCode,           。
         *       requestPermissions         ,             ,                  。
         */
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
    } else {
        //   ,           
        mLoginPresenter.call(this);
    }
    
  • Activity 에서 onRequestPermissions Result 방법 을 다시 쓰 고 요청 권한 의 리 셋 을 처리 합 니 다. 먼저 requestCode 가 당신 의 신청 에 위치 한 것 을 검증 한 다음, grantResults 가 신청 에 대응 하 는 결 과 를 검사 합 니 다. 이 배열 은 신청 할 때의 두 번 째 권한 문자열 배열 에 대응 합 니 다. 두 개의 권한 을 동시에 신청 하면 grantResults 의 length 는 2 로 각각 두 개의 권한 을 기록 합 니 다.제 한 된 신청 결과. 신청 이 성공 하면 당신 의 일 을 할 수 있 습 니 다.
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mLoginPresenter.call(this);
                } else {
                    Toast.makeText(this, "         ", Toast.LENGTH_LONG).show();
                }
                break;
        }
    }
    

  • 신청 권한 의 기본 절 차 는 위 와 같 습 니 다. 진실 을 추구 하지 않 았 습 니 다. 다음은 진실 을 살 펴 보 겠 습 니 다. 위의 그림...
    사용자 가 인증 을 거부 하면 다음 탄 상자 에 서 는 '알림 하지 않 기' 가 있 습 니 다.이 옵션 을 사용 하면 앱 이 나중에 인증 을 계속 요청 하 는 것 을 방지 할 수 있 습 니 다. 만약 이 옵션 이 인증 을 거부 하기 전에 사용자 에 게 선택 되 었 다 면 다음 에 다시 전 화 를 걸 때 Dialog 는 알림 을 하지 않 습 니 다. 앱 은 아무것도 하지 않 습 니 다. 이것 은 사용자 에 게 매우 나 쁜 경험 입 니 다. 나중에 처리 방법 을 알려 드 리 겠 습 니 다.
    주의: 휴대 전화 마다 알림 방식 이 다 를 수 있 습 니 다. 아래 쌀 휴대 전화 에 있 는 힌트 를 보 세 요.
    4. 더욱 우아 한 처리 권한 알림 문제
    사용자 가 인증 을 거부 하면 다음 탄 상자 에 서 는 '알림 하지 않 기' 가 있 습 니 다.앱 이 나중에 인증 을 계속 요청 하 는 것 을 방지 하기 위 한 옵션 입 니 다. 이 옵션 이 인증 을 거부 하기 전에 선택 되 었 습 니 다. 다음 에 이 권한 을 위해 requestPermissions 를 요청 할 때 대화 상자 가 나타 나 지 않 습 니 다. 결 과 는 앱 이 아무것도 하지 않 습 니 다. 이것 은 매우 나 쁜 사용자 체험 이 될 것 입 니 다. 사용자 가 작업 을 했 지만 응답 을 받 지 못 할 것 입 니 다. 이 경우 잘 처리 해 야 합 니 다. request 요청 중 입 니 다.Permissions 전에 요청 권한 을 보 여 주 는 힌트 가 activity 의 shouldShowRequestPermission Rationale 방법 을 통 해 필요 한 지 확인 해 야 합 니 다. 이 방법 이 true 로 돌아 가면 사용자 가 권한 을 거부 한 적 이 있 음 을 표시 합 니 다. 이 때 메시지 알림 상 자 를 쳐 서 권한 을 요청 한 이 유 를 밝 히 고 권한 을 부여 해 야 합 니 다. 코드 는 다음 과 같 습 니 다.
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)) {
                showSecurityMessage("          ,    ,       。", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCompat.requestPermissions(LoginActivity.this,
                                new String[]{Manifest.permission.CALL_PHONE},
                                1);
                    }
                });
                return;
            }
            /**
             *         
             *        ,      Context;
             *                    ;
             *       requestCode,           。
             *       requestPermissions         ,             ,                  。
             */
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);
        } else {
            //   ,    
            mLoginPresenter.call(this);
        }   
    
    private void showSecurityMessage(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(this)
                .setMessage(message)
                .setPositiveButton(" ", okListener)
                .setNegativeButton(" ", null)
                .create()
                .show();
    }
    

    주: 한 번 에 여러 권한 을 요청 할 때 권한 이 없 는 설명 을 추가 하 는 것 을 잊 지 마 세 요.
    효과 그림:
    5. 호 환 라 이브 러 리 를 사용 하여 이전 버 전 을 호 환 합 니 다.
    이 코드 는 안 드 로 이 드 6.0 이상 에서 실행 되 는 데 문제 가 없 지만 API 23 이전 에는 안 됩 니 다. 그런 방법 이 없 기 때 문 입 니 다. 거 친 방법 은 버 전 을 검사 하 는 것 입 니 다.
    if (Build.VERSION.SDK_INT >= 23) {
        // Marshmallow+
    } else {
        // Pre-Marshmallow
    }
    

    그러나 너무 복잡 합 니 다. 여기 서 우 리 는 v4 호 환 라 이브 러 리 를 사용 할 수 있 습 니 다. 이것 에 대해 호 환 을 한 적 이 있 습 니 다. 다음 과 같은 함수 로 대체 할 수 있 습 니 다.
  • ContextCompat. checkSelfPermission () 권한 수 여 를 받 은 함 수 는 PERMISSION GRANTED 로 돌아 갑 니 다. 그렇지 않 으 면 PERMISSION DENIED 로 돌아 갑 니 다. 모든 버 전에 서 이 렇 습 니 다.
  • Activity Compat. requestPermissions () 이 방법 은 M 이전 버 전에 서 호출 되 었 습 니 다. OnRequestPermissions ResultCallback 은 직접 호출 되 었 고 정확 한 PERMISSION GRANTED 또는 PERMISSION DENIED 를 가지 고 끝 났 습 니 다.
  • Activity Compat. shouldShowRequestPermission Rationale () 이 함수 가 M 전에 호출 되면 false 로 영원히 돌아 갑 니 다.
  • v4 패키지 의 이 세 가지 방법 으로 모든 버 전 을 완벽 하 게 호 환 합 니 다! 이 방법 은 추가 적 인 인자 인 Context or Activity 가 필요 합 니 다. 다른 것 은 별 다른 것 이 없습니다. 위의 두 가지 방법 은 Fragment 에서 도 사용 할 수 있 습 니 다. v13 호 환 패키지: Fragment Compat. requestPermissions () and Fragment Compat. shouldShowRequestPermissionale ()activity 효과 와 같 습 니 다.
    6. 3 자 오픈 소스 라 이브 러 리 사용
    위 코드 는 실제 개발 에 있어 서 매우 번 거 롭 습 니 다. 신청 한 권한 만 위험한 권한 이 므 로 검 사 를 받 아야 합 니 다. 물론 직접 포장 해서 사용 하기에 편리 합 니 다. 다음은 github 에서 star 수가 가장 많은 Permissions 라 이브 러 리 입 니 다. 개발 중 에 직접 사용 할 수 있 습 니 다.
  • RxPermissions
  • easypermissions

  • 참고 글:https://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

    좋은 웹페이지 즐겨찾기