棉花糖权限应该仅在尚未授予时询问

Marshmallow permissions should ask only if not already granted

我正在开发一个需要多个权限的应用程序,所以我添加了它并做了 marshmallow 代码,但问题是当我在 marshmallow 中重新打开一个应用程序时它总是请求权限,我只想问如果它没有被授予。

请帮我编写代码,在此先感谢!

权限系统已更改。但是这里有一个很好的解释如何正确处理它。

https://developer.android.com/training/permissions/requesting.html

这样,如果用户授予权限,对话框只会打开一次。如果他拒绝,您可以选择在下次请求许可时显示解释。

他们还有一个值得一读的最佳实践部分:

https://developer.android.com/training/permissions/best-practices.html

public Boolean marshmallowPermission(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (checkPermission()) {
            Toast.makeText(this,"Permission already granted.", Toast.LENGTH_SHORT).show();
        } else {
            requestPermission();
            //marshmallowRequest();
        }
    }
    return true;
}
@TargetApi(Build.VERSION_CODES.M)
public boolean checkPermission(){

    int phone= checkSelfPermission(android.Manifest.permission.CALL_PHONE);
    if (phone == PackageManager.PERMISSION_GRANTED ){
        return true;
    } else {
        return false;
    }
}

@TargetApi(Build.VERSION_CODES.M)
private void requestPermission(){

    if (shouldShowRequestPermissionRationale(android.Manifest.permission.CALL_PHONE)){

        Toast.makeText(this," Permission must be needed which allows you to access an app. Please allow  in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", this.getPackageName(), null);
        intent.setData(uri);
        this.startActivity(intent);

    } else {

        requestPermissions(new String[]{android.Manifest.permission.CALL_PHONE},101);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 101:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(this,"Permission Granted, Now you can access an app.",Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(this,"Permission Denied, You cannot access call.", Toast.LENGTH_LONG).show();

            }
            break;
    }
}

只需检查权限,必要时才请求。

的帮助下检查权限
checkSelfPermission(Manifest.permission.READ_CONTACTS)

检查权限是否已经授予

if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant

    return;
}

然后处理权限

@Override
public void onRequestPermissionsResult(int requestCode,
    String permissions[], int[] grantResults) {
switch (requestCode) {
    case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            // permission was granted, yay! do the

        } else {
            // permission denied, Disable the
            // functionality that depends on this permission.
        }
        return;
    }
}}

按照以下步骤操作:

  • 创建一组您需要访问的权限。
  • 通过group/array检查是否授予权限

示例代码供您参考:

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;

以上代码稍后将检查您的权限组,将这些全部传递一次

int PERMISSION_ALL = 1; 
//create all permissions array
String[] PERMISSIONS = {Manifest.permission.READ_CONTACTS, //all your permissions};

//Now check whether permissions are granted or not
if(!hasPermissions(this, PERMISSIONS)){
   ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}

希望这对你有用。