Android 6.0 위 챗 권한 설정 모방

Android 6.0 버 전 은 프로그래머 형제 에 게 가장 불 친절 한 것 은 권한 의 문제 입 니 다.동적 권한 의 설정 은 저 를 괴 롭 혔 습 니 다.현재 대부분 6.0 권한 설정 에 관 한 프레임 워 크 는 여러 권한(Easy Permissions)을 한꺼번에 방문 하 는 것 입 니 다.이렇게 해서 발생 하 는 문 제 는 우리 가 세 가지 권한 을 신청 하면 사용자 가 그 중의 한 가지 만 동의 하 는 것 입 니 다.다음 에 재 신청 권한 은 세 가지 로 한꺼번에 신청 하 는 것 이 불편 합 니 다.사용자 에 게 불 친절 합 니 다.우연히 안 드 로 이 드 원숭이 의 이 글 을 발 견 했 습 니 다.
http://sunjiajia.com/2016/04/19/android-m-permissions/
이 를 바탕 으로 수정 을 하면 원 하 는 효과 가 실 현 됩 니 다.사용자 에 게 권한 열기 안내)
다음은 저장 공간,전화,카메라 권한 을 예 로 들 면
사진 잘 못 만 들 었 어 요.이해 해 주세요.
这里写图片描述
这里写图片描述
권한 추가
   
   
   
권한 처리 도구 클래스

package com.fly.permissiondemo;
/*
 *
 * *
 * * * ===================================
 * * * Copyright (c) 2016.
 * * *   :   
 * * *   :@   
 * * *   :http://sunjiajia.com
 * * * Github:https://github.com/opengit
 * * *
 * * *   **:            ,          。
 * * * ===================================
 * *
 * *
 *
 */

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;

import java.util.ArrayList;
import java.util.List;

/**
 *        :
 *     API23, Android M         use permissions ,              。
 * <p/>
 * ***                 :
 * *****1.   Activity,         ;
 * *****2.         , 2   :
 * ********1).  Allow   ,           ,      ;
 * ********2).  Deny   ,     Activity        Permisssions       。
 * *****3.    Deny   ,        Activity,       ,         ,      “dont ask me again”:
 * ********1).       “dont ask me again” checkbox,           Dialog  Snackbar                  ;
 * ********2).            ,    Allow,           ,      ;
 * ********3).            ,    Deny,     Activity        Permisssions       。
 */
public class PermissionsUtil {

 //    、   
 public static final int REQUEST_STATUS_CODE = 0x001;
 public static final int REQUEST_PERMISSION_SETTING = 0x002;

 //       ,           ,      Androidmanifest.xml   。
 public static String[] PERMISSIONS_GROUP_SORT = {
  Manifest.permission.READ_EXTERNAL_STORAGE,
  Manifest.permission.CALL_PHONE,
  Manifest.permission.CAMERA
 };

 private static PermissionCallbacks callbacks;

 public interface PermissionCallbacks {

 void onPermissionsGranted();//    

 void onPermissionsDenied(int requestCode, List<String> perms);

 }

 public static void checkAndRequestPermissions(final Activity activity, PermissionCallbacks callback) {
 if (Build.VERSION.SDK_INT >= 23) {
  callbacks = callback;
  //   list,            
  ArrayList<String> denidArray = new ArrayList<>();

  //   PERMISSIONS_GROUP,            denidArray
  for (String permission : PERMISSIONS_GROUP_SORT) {
  int grantCode = ActivityCompat.checkSelfPermission(activity, permission);
  if (grantCode == PackageManager.PERMISSION_DENIED) {
   denidArray.add(permission);
  }
  }

  //             0,          
  if (denidArray.size() > 0) {
  //            ,             
  ArrayList<String> denidArrayNew = new ArrayList<>();
  denidArrayNew.add(denidArray.get(0));
  //  denidArray        ,      requestPermissions     
  String[] denidPermissions = denidArrayNew.toArray(new String[denidArrayNew.size()]);
  requestPermissions(activity, denidPermissions);
  } else {
  //   
  callbacks.onPermissionsGranted();
  }

 }
 }

 /**
 *   shouldShowRequestPermissionRationale          :
 * ***1).          ,     false;
 * ***2).        ,  Deny ,    shouldShowRequestPermissionRationale(),   true;
 * ***3).        ,  Deny ,    “dont ask me again”    ,    shouldShowRequestPermissionRationale() ,  false;
 * ***4).        ,              ,   shouldShowRequestPermissionRationale(),  false。
 */
 public static boolean showRationaleUI(Activity activity, String permission) {
 return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
 }

 /**
 *                     ,       “dont ask me again”,        Permission       
 */
 public static void requestPermissions(Activity activity, String[] permissions) {
 ActivityCompat.requestPermissions(activity, permissions, REQUEST_STATUS_CODE);
 }

 /**
 *     ,App       :
 * ***      shouldShowRequestPermissionRationale          ,        App      ,       Dialog SnackBar   
 */
 public static boolean isAppFirstRun(Activity activity) {
 SharedPreferences sp = activity.getSharedPreferences("config", Context.MODE_PRIVATE);
 SharedPreferences.Editor editor = sp.edit();

 if (sp.getBoolean("first_run", true)) {
  editor.putBoolean("first_run", false);
  editor.commit();
  return true;
 } else {
  editor.putBoolean("first_run", false);
  editor.commit();
  return false;
 }
 }
}

사용 방법:
시작 페이지 AppStart 에서 첫 페이지 를 돌 릴 때 호출

 PermissionsUtil.checkAndRequestPermissions(AppStart.this, new PermissionsUtil.PermissionCallbacks() {
   @Override
   public void onPermissionsGranted() {
   //            
   toMainActivity();
   }

   @Override
   public void onPermissionsDenied(int requestCode, List<String> perms) {

   }

  });

이것 은 AppStart 에서 의 리 셋 입 니 다.현재 의 처리 방법 은 매번 제 시 된 권한 신청 의 리 셋 결과 에 따라 대응 하 는 권한 을 처리 하고 처리 가 끝 날 때마다 한 번 씩 반복 하 는 것 입 니 다.
“PERMISSIONS_GROUP_SORT'는 모든 권한 이 가 져 올 때 까지'onPermissions Granted()'에서 이동 할 수 있 도록 모든 권한 을 순환 처리 합 니 다.이렇게 처리 하면 다음 시작 시 얻 지 못 한 권한 을 직접 물 어 볼 수 있 습 니 다.

 @Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);

 if (requestCode == PermissionsUtil.REQUEST_STATUS_CODE) {

  if (permissions[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE)) {//    
  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//  
   PermissionsUtil.checkAndRequestPermissions(this, new PermissionsUtil.PermissionCallbacks() {
   @Override
   public void onPermissionsGranted() {
    toMainActivity();
   }

   @Override
   public void onPermissionsDenied(int requestCode, List<String> perms) {

   }

   });//  
  } else {//   -    
   createLoadedAlertDialog("   -  -"+ getString(R.string.app_name) +"-           ,     App  ");
  }
  }

  if (permissions[0].equals(Manifest.permission.CALL_PHONE)) {//    
  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//  
   PermissionsUtil.checkAndRequestPermissions(this, new PermissionsUtil.PermissionCallbacks() {
   @Override
   public void onPermissionsGranted() {
    toMainActivity();
   }

   @Override
   public void onPermissionsDenied(int requestCode, List<String> perms) {

   }

   });
  } else {//   -    
   createLoadedAlertDialog("   -  -" + getString(R.string.app_name) + "-         ,     App  ");
  }
  }

  if (permissions[0].equals(Manifest.permission.CAMERA)) {//    
  if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {//  
   //       
   toMainActivity();
  } else {//   -    
   createLoadedAlertDialog("   -  -"+ getString(R.string.app_name) +"-          ,     App  ");
  }
  }
 }

 }

설 정 된 권한 그룹 에 몇 가지 권한 이 있 으 면 이 반전 에서 몇 가지 판단 을 써 서 해당 하 는 우호 적 인 알림 정 보 를 처리 해 야 합 니 다.단일 처리 만 해 야 합 니 다.이런 방식 은 사용자 와 계속 송 아 지 를 잡 아 당 기 는 것 을 피 할 수 있 습 니 다.간단 하고 거 친 알림 으로 사용자 에 게 권한 을 가 져 다 주 고 사용자 가 따 르 지 않 으 면 직접 설정 을 뛰 어 넘 으 면 책임 을 지고 응용 프로그램 을 종료 합 니 다.
다음은 git 주소https://git.oschina.net/feiyangwei/PermissionDemo.git
이 방안 은 아직 보완 이 필요 합 니 다.만약 에 사용자 가 응용 프로그램 을 열 었 을 때 안에 수정 권한 을 설정 하면 저 는 이 권한 의 수정 을 어떻게 감청 하 는 지 잘 모 르 겠 습 니 다.위 챗 은 응용 프로그램 을 직접 다시 열 면 권한 을 다시 얻 을 수 있 습 니 다.아 는 신 이 있 으 면 토론 할 수 있 습 니 다. 。 
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기