Var*_*Rao 16 android android-permissions
我在String数组中定义了所有危险权限,如下所示:
String[] perms = {Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CALL_PHONE,
Manifest.permission.MODIFY_PHONE_STATE};
Run Code Online (Sandbox Code Playgroud)
然后检查它们是否已被授予我运行:
for (int i = 0; i < perms.length; i++) {
if(ContextCompat.checkSelfPermission(this,perms[i])!=PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this,perms, permsRequestCode);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这不起作用.它请求一次权限,然后如果我从设置中手动禁用它,它会多次调出对话框.
我该如何解决?
Thr*_*ian 18
使用此选项可以检查所需的任何权限,一次性是单个权限还是多个权限.
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;
}
Run Code Online (Sandbox Code Playgroud)
}
Sho*_*war 16
据我所知,这应该是有效的.但您可以尝试使用以下有效的功能.它有一个与你不同的方法.
String requiredPermission = "android.permission.READ_CONTACTS";
int checkVal = getContext().checkCallingOrSelfPermission(requiredPermission);
Run Code Online (Sandbox Code Playgroud)
现在你可以查看:
if (checkVal==PackageManager.PERMISSION_GRANTED){}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17733 次 |
| 最近记录: |