2017-02-09 43 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; 
} 

}