Android 6.0動的権限

6058 ワード

ここでは、
*1.          (      )*
*2.        ,         *

先に説明してから例をあげる
            ,Android6.0  ,   APP             ,             ,        ,             ,      ,                          。
  • 知っておくべきこと
  • 権限に関連する2つの変数:
    PackageManager.PERMISSION_GRANTED = 0     //      ;
    PackageManager.PERMISSION_DENIED  = -1    //       ;
    
  • 実行権限検出の3つの方式:
        
         :
      public static int checkSelfPermission(Activity activity,String writeContacts) {
          return PermissionChecker.checkSelfPermission(activity, writeContacts);
      }
    
         :
      public static int checkSelfPermission(Activity activity,String writeContacts) {
          return ContextCompat.checkSelfPermission(WelcomeActivity.this,Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED);
      }
    
         :
      public static boolean checkSelfPermission() {
          PackageManager pm = this.getPackageManager();
          for (String auth : authBaseArr) {
            //  ,             ,   false,             
            if (pm.checkPermission(auth, this.getPackageName()) != PackageManager.PERMISSION_GRANTED) {
          return false;
            }
          }
          return true;
      }
    
    
  • オープン権限を要求するポップアップ表示:
    ActivityCompat.requestPermissions(mactivity, new String[] { CALL_PHONE ,CAMERA },REQUEST_CODE);
    
    注意:一度に複数の権限を要求するとバグが発生し、そのセカンダリ権限ポップアップに権限が付与されていないものがある場合、コードを再実行すると、ユーザーに最初の権限を取得する必要があることをずっと提示するだけであるが、この場合、ユーザーに許可をクリックさせると、依然として最初の権限を開くように要求する(実際には後ろの権限を開く必要がある)、だから毎回1つの権限だけ頼むのが妥当!!!例えば、
       private void baiduPermission() {
           boolean canInitBaidu = true;
           //     
           if (android.os.Build.VERSION.SDK_INT >= 23) {
             pm = this.getPackageManager();
             if (pm.checkPermission(authBaseArr[0], this.getPackageName())
             != PackageManager.PERMISSION_GRANTED) {
           requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
               authBaseRequestCode);
           canInitBaidu = false;
             }
    
             if (pm.checkPermission(authBaseArr[1], this.getPackageName())
             != PackageManager.PERMISSION_GRANTED) {
           requestPermissions(new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
               authBaseRequestCode);
           canInitBaidu = false;
             }
           }
             if (canInitBaidu) {
           initLoc();
             }
         }
    
  • と書くことができます.
  • 権限要求結果傍受:
    @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
       @NonNull int[] grantResults) {
       if (requestCode == BaiDuRequest && grantResults.length > 0 && grantResults[0]==-1){
           UtilsW.showMessageOKCancel(mactivity, "    ",
               "                “XXX”  ,           ,          。", null);
       } 
    }
    
    注意:grantResultsが使用する.length>0は、2つのrequestPermissions(new String[{XXX},RequestCode)が同時に存在することを防止するためである.呼び出されたcrashの問題はgrantResults[0]==-1(つまりgrantResults[0]==PackageManager.PERMISSION_DENIED)で、ユーザーがこの権限を拒否したことを示していますが、複数の権限を申請する場合はどうすればいいのでしょうか.私たちは最初の成功後に申請することができます.以下の通りです.
    @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
       @NonNull int[] grantResults) {
       if (requestCode == BaiDuRequest && grantResults.length > 0 && grantResults[0]==-1){
           UtilsW.showMessageOKCancel(mactivity, "    ",
               "                “  ” “  ”  ,           ,          。", null);
       } else if (ACCESS_FINE_LOCATION.equalsIgnoreCase(permissions[0]) && grantResults.length > 0 && grantResults[0]== 0) {
           ActivityCompat.requestPermissions(mactivity, new String[] {WRITE_EXTERNAL_STORAGE },BaiDuRequest);
       }
    }
    
  • 非Android 6.0バージョンの携帯電話はAndroidManifestにあります.xmlでは、直接権限を設定する(例えば、アプリを起動すると、ポップアップウィンドウがユーザーに権限を与えるように提示します.両者は重複していますが、誰が私たちのAndroidをますます親切にしていますか.
  • shouldShowRequestPermissionRationaleの役割:
  • 初めて権限を要求したとき、ユーザーは拒否しました.次:s h o u l d S h o w RequestPermissionRationale()はtrueを返し、なぜこの権限が必要なのかの説明を表示する必要があります.
  • 2 2 2回目の権限要求時にユーザが拒否し、「注意しない」オプションを選択した場合:shouldShowRequestPermissionRationale()はfalse
  • に戻る
  • デバイスのポリシーは、現在のアプリケーションがこの権限を取得することを禁止します:s h u l d ShowRequestPermissionRationale()はfalse注意を返します:上の:2回目の要求権限の時、やっと“注意していません”のオプションがあって、もしユーザーがずっと拒否して、“注意していません”のオプションを選択していないならば、次回の要求権限の時、引き続き“注意していません”のオプション
  • があります
  • アプリケーションの例:DeviceIDを取得するには、
  • のような多くの方法があります.
      /**
       *   DeviceId (IMEI  )
       *     DeviceId  : http://blog.csdn.net/u014651216/article/details/50767326 
       */
       public static String getDeviceID(Activity activity) {
         return ((TelephonyManager)activity.getSystemService(activity.TELEPHONY_SERVICE)).getDeviceId();
      }
    
    しかし、直接このように呼び出すとエラーが発生します.
    SecurityException: getDeviceId: Neither user 10282 nor current process has android.permission.READ_PHONE_STATE.
    
    電話の状態を読み取る動的権限があるかどうかを判断してから、この権限を申請する必要があります.以下のようにします.
      //             
     if (Utils.checkSelfPermission(this,READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
         Utils.showMessageOKCancel(this,"  :


    : , “ ” , “ ” 。", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); // , intent.setData(Uri.parse("package:" + getPackageName())); startActivity(intent); } }); return ;
    または権限を直接再申請します.
     int permissionNum = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);  //          
     if (permissionNum != PackageManager.PERMISSION_GRANTED) { //       
         ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_STATE);
     }  //             ,       ,           
    

    .