2017-06-19 11 views
0

Androidのアクセス権を扱うコードをリファクタリングしようとしています。それは私が頭痛の多くを引き起こしている1つの面倒なUIのバグを除いて、うまく動作します。それは基本的にそれらを介してユーザによって既に付与されていない権限、サイクルのリストを取得し、それぞれを付与するようにユーザーに促しAndroidのアクセス許可複数のダイアログでのUIの問題

private void getPermissions() { 

    if (Build.VERSION.SDK_INT >= 23) { 

     List<String> permissionsNeeded = new ArrayList<String>(); 

     final List<String> permissionsList = new ArrayList<String>(); 
     if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_COARSE_LOCATION)) 
      permissionsNeeded.add(accessLocation); 
     if (!addPermission(permissionsList, android.Manifest.permission.READ_CONTACTS)) 
      permissionsNeeded.add(readContacts); 
     if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) 
      permissionsNeeded.add(readStorage); 
     if (!addPermission(permissionsList, Manifest.permission.CAMERA)) 
      permissionsNeeded.add(accessCamera); 

     if (permissionsList.size() > 0) { 
      if (permissionsNeeded.size() > 0) { 
       requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
         REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
      } 
     } 
    } 
} 

private void showMessageOK (int message, final String perm) { 

    if (shouldShowRequestPermissionRationale(perm)) { 

     new AlertDialog.Builder(CreateSessionActivity.this) 
       .setMessage(message) 
       .setTitle("Permission required") 
       .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 

         dialog.dismiss(); 
         requestPermissions(new String[] {perm}, 
           REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 

        } 
       }) 
       .create() 
       .show(); 
    } 
} 

private boolean addPermission(List<String> permissionsList, String permission) { 

    if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { 

     permissionsList.add(permission); 

     //check for rationale 
     if (!shouldShowRequestPermissionRationale(permission)) 
      return false; 
    } 
    return true; 
} 

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

    Map<String, Integer> perms = new HashMap<>(); 

    perms.put(android.Manifest.permission.ACCESS_COARSE_LOCATION, PackageManager.PERMISSION_GRANTED); 
    perms.put(android.Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED); 
    perms.put(android.Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); 
    perms.put(android.Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED); 
    // Fill with results 
    for (int i = 0; i < permissions.length; i++) 
     perms.put(permissions[i], grantResults[i]); 

    if (perms.get(accessLocation) != PackageManager.PERMISSION_GRANTED) { 

     showMessageOK(R.string.permdesc_access_location, 
       accessLocation); 
    } 

    if (perms.get(readContacts) != PackageManager.PERMISSION_GRANTED) { 

     showMessageOK(R.string.permdesc_read_contacts, 
       readContacts); 
    } 

    if (perms.get(readStorage) != PackageManager.PERMISSION_GRANTED) { 

     showMessageOK(R.string.permdesc_read_storage, 
       readStorage); 
    } 

    if (perms.get(accessCamera) != PackageManager.PERMISSION_GRANTED) { 

     showMessageOK(R.string.permdesc_access_camera, 
       accessCamera); 
    } 
} 

:ここでは、コードです。終了すると、許可されていない残りの権限がないかどうかが確認され、ユーザーに「再確認しない」と受け入れるか、選択しないと、その権限が必要な理由と許可しない結果が表示されます。

私の問題は、onRequestPermissionResult()のチェーンのif文で発生します。あなたが推測しているように、複数の許可条件が満たされている場合は、それぞれのダイアログでの下にが開きます。これにより、1つのダイアログクローズと次の表示との間に「ジャンプ」ダイアログ効果が生じます。私は、これと戦うためにcaseとif/elseif文を試しましたが、残りの許可ロジックに問題が生じます。

誰もがこれに対してクリーンな解決策を持っていますか?私は感謝されます。

+0

私見を、クリーンなソリューションは、すべての 'showMessageOK()'の呼び出しを取り除くことです。ユーザーはあなたが許可したことを知っています。許可を与えたことに感謝しないでください。許可が必要なものをユーザーが要求したものであれば何でもしてください。 – CommonsWare

+0

あなたが 'AndroidManifest'ファイルでも宣言しているすべてのアクセス権を確認してください – Benny

答えて

0

まあ、これは

if (Build.VERSION.SDK_INT >= 23) { 

    List<String> permissionsNeeded = new ArrayList<String>();    
    for(int i=0; i<4;i++){ 
      checkAndAsk(i); 
    } 
    if (permissionsList.size() > 0) { 
     if (permissionsNeeded.size() > 0) { 
      requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), 
        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); 
     } 
    } 
} 
//out of the get permissions method 
public void checkAndAsk(int i){ 
      switch(i){ 
       case 0: 
        if (!addPermission(permissionsList, android.Manifest.permission.ACCESS_COARSE_LOCATION)) 
         permissionsNeeded.add(accessLocation); 
        break; 
       case 1: 
        if (!addPermission(permissionsList, android.Manifest.permission.READ_CONTACTS)) 
         permissionsNeeded.add(readContacts); 
        break; 
       //You get the idea 
      } 
    } 

は基本的にあなたが要求されますどの許可のパラメータを渡すことで、権限を反復処理、クリーンなコードでないかもしれないが。パーミッションが許可または拒否されると、パーミッションが破られ、すべてが完了するまで2番目のパーミッションに移動します。

これは理論上はうまくいくはずです。

0

ただ、このコードを使用します

private void RequestAllPermissions() { 

     String[] PERMISSIONS = {Manifest.permission.CAMERA, Manifest.permission.RECEIVE_SMS, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET, Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_CONTACTS}; 

     if (!hasPermissions(this, PERMISSIONS)) { 
      ActivityCompat.requestPermissions(this, PERMISSIONS, REQUESTCODE_PERMISSION_ALL); 
     } else 

    } 

public static boolean hasPermissions(Context context, String... permissions) { 

     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { 
      for (String permission : permissions) { 
       if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { 
        return false; 
       } 
      } 
     } 
     return true; 

    } 


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

    switch (requestCode) { 
     case REQUESTCODE_PERMISSION_ALL: { 

      boolean allpermissiongranted = true; 
      if (grantResults.length > 0) { 
       for (int i = 0; i < permissions.length; i++) { 
        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) { 
         allpermissiongranted = false; 
         break; 
        } 
       } 
      } else 
       allpermissiongranted = false; 

      if (allpermissiongranted) { 
       //do task 

      } else { 

       new SweetAlertDialog(mContext, SweetAlertDialog.WARNING_TYPE) 
         .setTitleText("Permission Not Granted") 
         .setContentText("Kindly grant all requested permission to proceed.") 
         .setConfirmText("Request") 
         .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() { 
          @Override 
          public void onClick(SweetAlertDialog sDialog) { 
           sDialog.dismissWithAnimation(); 
           RequestAllPermissions(); 
          } 
         }) 
         .setCancelText("Exit") 
         .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() { 
          @Override 
          public void onClick(SweetAlertDialog sweetAlertDialog) { 
           sweetAlertDialog.dismissWithAnimation(); 
           finish(); 
          } 
         }) 
         .show(); 
      } 

     } 
    } 

} 
関連する問題