2017-06-19 69 views
0

我想重構一段代碼,處理Android權限。它工作正常,除了一個令人討厭的UI bug導致我很多頭痛。下面的代碼:Android權限用戶界面問題與多個對話框

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」語句發生。您可能會猜到,如果多個權限條件爲真,那麼每個對話框將打開下面的當前現有的對話框。這導致一個對話框關閉和下一個顯示之間的「跳躍」對話效果。我已經嘗試過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 
      } 
    } 

基本上你傳遞一個參數,它允許您將要求通過權限進行迭代。一旦許可被批准/拒絕,它就會中斷,轉移到第二個許可,直到全部完成。

理論上這應該起作用。

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(); 
      } 

     } 
    } 

}