2017-02-09 90 views
0
已經授予的用戶

我在下面的String數組定義的所有危險的權限:檢查,如果權限已被Android中

String[] perms = {Manifest.permission.READ_CONTACTS, 
         Manifest.permission.READ_PHONE_STATE, 
         Manifest.permission.CALL_PHONE, 
         Manifest.permission.MODIFY_PHONE_STATE}; 

然後檢查是否已授予他們我運行此:

for (int i = 0; i < perms.length; i++) { 
     if(ContextCompat.checkSelfPermission(this,perms[i])!=PackageManager.PERMISSION_GRANTED) 
     { 
      ActivityCompat.requestPermissions(this,perms, permsRequestCode); 
      break; 
     } 
    } 

由於某種原因,這不起作用。它要求獲得一次權限,然後如果手動將其從設置中禁用,則會多次出現對話框。

我該如何解決這個問題?

回答

2

據我所知,這應該是工作。但是你可以嘗試使用下面的函數。它有一個不同於你的方法。

String requiredPermission = "android.permission.READ_CONTACTS"; 
int checkVal = getContext().checkCallingOrSelfPermission(requiredPermission); 

現在可以檢查:

if (checkVal==PackageManager.PERMISSION_GRANTED){} 
5

使用此功能來檢查你想要的任何權限,單個或多個權限一次。

public class PermissionsUtils { 

public static final int REQUEST_PERMISSION_MULTIPLE = 0; 
public static final int REQUEST_PERMISSION_CAMERA = 1; 
public static final int REQUEST_PERMISSION_LOCATION = 2; 
public static final int REQUEST_WRITE_EXTERNAL = 3; 

public static boolean checkAndRequestPermissions(Activity activity) { 
    System.out.println("PermissionsUtils checkAndRequestPermissions()"); 

    int permissionCamera = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA); 
    int permissionLocation = ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION); 
    int permissionWriteExternal = ContextCompat.checkSelfPermission(activity, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE); 

    // Permission List 
    List<String> listPermissionsNeeded = new ArrayList<>(); 

    // Camera Permission 
    if (permissionCamera != PackageManager.PERMISSION_GRANTED) { 
     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) { 
      Toast.makeText(activity, "Camera Permission is required for this app to run", Toast.LENGTH_SHORT) 
        .show(); 
     } 
     listPermissionsNeeded.add(Manifest.permission.CAMERA); 
    } 

    // Read/Write Permission 
    if (permissionWriteExternal != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    } 

    // Location Permission 
    if (permissionLocation != PackageManager.PERMISSION_GRANTED) { 
     listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION); 
    } 

    if (!listPermissionsNeeded.isEmpty()) { 
     ActivityCompat.requestPermissions(activity, 
       listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), 
       REQUEST_PERMISSION_MULTIPLE); 
     return false; 
    } 

    return true; 
} 

/** 
* Requests the Camera permission. If the permission has been denied 
* previously, a SnackBar will prompt the user to grant the permission, 
* otherwise it is requested directly. 
*/ 
public static void requestCameraPermission(Activity activity) { 
    // Here, thisActivity is the current activity 
    // System.out.println("requestCameraPermission() INITIAL"); 
    // Toast.makeText(this, "requestCameraPermission() INITIAL", 
    // Toast.LENGTH_LONG).show(); 
    if (ContextCompat.checkSelfPermission(activity, 
      Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) { 
      // Toast.makeText(activity, "Camera permission is 
      // needed for this app to run ", 
      // Toast.LENGTH_SHORT).show(); 
      // System.out.println("requestCameraPermission() SHOW INFO"); 

      // Show an explanation to the user *asynchronously* -- don't 
      // block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 
      ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.CAMERA }, 
        REQUEST_PERMISSION_CAMERA); 

     } else { 
      // No explanation needed, we can request the permission. 
      // System.out.println("requestCameraPermission() ASK 
      // PERMISSION"); 

      ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.CAMERA }, 
        REQUEST_PERMISSION_CAMERA); 
     } 
     // Permission is granted 
    } else { 
     System.out.println("requestCameraPermission() PERMISSION ALREADY GRANTED"); 

    } 

} 

public static void requestLocationPermission(Activity activity) { 
    if (ContextCompat.checkSelfPermission(activity, 
      Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(activity, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 
      Toast.makeText(activity, "LOCATION permission is needed to display location info ", Toast.LENGTH_SHORT) 
        .show(); 
      // Show an explanation to the user *asynchronously* -- don't 
      // block this thread waiting for the user's response! After the 
      // user sees the explanation, try again to request the 
      // permission. 
      ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, 
        REQUEST_PERMISSION_LOCATION); 

      Toast.makeText(activity, "REQUEST LOCATION PERMISSION", Toast.LENGTH_LONG).show(); 

     } else { 
      // No explanation needed, we can request the permission. 

      ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, 
        REQUEST_PERMISSION_LOCATION); 
      Toast.makeText(activity, "REQUEST LOCATION PERMISSION", Toast.LENGTH_LONG).show(); 
      // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
     // Permission is granted 
    } else { 

    } 
} 

public static void requestWriteExternalPermission(Activity activity) { 
    if (ContextCompat.checkSelfPermission(activity, 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(activity, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
      Toast.makeText(activity, "Write permission is needed to create Excel file ", Toast.LENGTH_SHORT).show(); 
      // Show an explanation to the user *asynchronously* -- don't 
      // block this thread waiting for the user's response! After the 
      // user sees the explanation, try again to request the 
      // permission. 
      ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 
        REQUEST_WRITE_EXTERNAL); 

      Toast.makeText(activity, "REQUEST LOCATION PERMISSION", Toast.LENGTH_LONG).show(); 

     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 
        REQUEST_WRITE_EXTERNAL); 

     } 
    } 
} 

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

}