Android 如何在运行时检查授权权限?

Android 如何在运行时检查授权权限?,android,android-permissions,android-6.0-marshmallow,Android,Android Permissions,Android 6.0 Marshmallow,在Android M(预览版)中,用户可以选择特定的应用程序并检索特定的权限 所以我问如何在运行时检查授权权限?很好 我刚找到我的需要我们可以检查许可是否由以下人员授予: checkSelfPermission(Manifest.permission.READ_CONTACTS) 如有必要,请求权限 处理权限请求响应 最佳描述在: 对于简单使用权限,您可以使用此库:您还可以通过以下代码段作为向后兼容进行查询 int hasPermission = ContextCompat.checkSelf

在Android M(预览版)中,用户可以选择特定的应用程序并检索特定的权限

所以我问如何在运行时检查授权权限?

很好

我刚找到我的需要我们可以检查许可是否由以下人员授予:

checkSelfPermission(Manifest.permission.READ_CONTACTS)
如有必要,请求权限 处理权限请求响应 最佳描述在:


对于简单使用权限,您可以使用此库:

您还可以通过以下代码段作为向后兼容进行查询

int hasPermission = ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_CONTACTS);
if (hasPermission == PackageManager.PERMISSION_GRANTED) {
    //Do smthng
}

试试这个简单的请求代码

public static final int REQUEST\u ID\u MULTIPLE\u PERMISSIONS=1;
私有布尔校验和请求权限(){
int-camera=ContextCompat.checkSelfPermission(这是android.Manifest.permission.camera);
int storage=ContextCompat.checkSelfPermission(这是android.Manifest.permission.WRITE\u外部存储);
int loc=ContextCompat.checkSelfPermission(这是android.Manifest.permission.ACCESS\u位置);
int loc2=ContextCompat.checkSelfPermission(这是android.Manifest.permission.ACCESS\u FINE\u位置);
List ListPermissionsNeed=new ArrayList();
if(摄像头!=已授予PackageManager.PERMISSION){
添加(android.Manifest.permission.CAMERA);
}
if(存储!=已授予PackageManager.PERMISSION){
listPermissionsNeed.add(android.Manifest.permission.WRITE\u外部存储);
}
如果(loc2!=已授予PackageManager.权限){
添加(android.Manifest.permission.ACCESS\u FINE\u位置);
}
如果(loc!=已授予包装管理员权限){
添加(android.Manifest.permission.ACCESS\u位置);
}
如果(!ListPermissionsNeed.isEmpty())
{
ActivityCompat.requestPermissions(此,ListPermissionsNeed.toArray
(新字符串[listPermissionsNeeded.size()],请求\u ID\u多个\u权限);
返回false;
}
返回true;
}
权限(权限:字符串):布尔值{
if(Build.VERSION.SDK_INT
获取位置运行时权限

ActivityCompat.requestPermissions(this,new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d("yes","yes");

            } else {
                Log.d("yes","no");
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
        // other 'case' lines to check for other
        // permissions this app might request
    }
}

请尝试此检查运行时权限:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    checkRunTimePermission();
}
检查运行时权限:

private void checkRunTimePermission() {
    String[] permissionArrays = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE};

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        requestPermissions(permissionArrays, 11111);
    } else {
         // if already permition granted
        // PUT YOUR ACTION (Like Open cemara etc..)
    }
}
处理权限结果:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    boolean openActivityOnce = true;
    boolean openDialogOnce = true;
    if (requestCode == 11111) {
        for (int i = 0; i < grantResults.length; i++) {
            String permission = permissions[i];

            isPermitted = grantResults[i] == PackageManager.PERMISSION_GRANTED;

            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                // user rejected the permission
                boolean showRationale = shouldShowRequestPermissionRationale(permission);
                if (!showRationale) {
                    //execute when 'never Ask Again' tick and permission dialog not show
                } else {
                    if (openDialogOnce) {
                        alertView();
                    }
                }
            }
        }

        if (isPermitted)
            if (isPermissionFromGallery)
                openGalleryFragment();
    }
}
原贴(不是我的)

对于特殊权限,例如
android.Manifest.permission.PACKAGE\u USAGE\u STATS
used
apppsmanager

Kotlin

private fun hasPermission(permission:String, permissionAppOpsManager:String): Boolean {
    var granted = false
    if (VERSION.SDK_INT >= VERSION_CODES.M) {
        // requires kitkat
        val appOps = applicationContext!!.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager

        // requires lollipop
        val mode = appOps.checkOpNoThrow(permissionAppOpsManager,
                              android.os.Process.myUid(), applicationContext!!.packageName)

        if (mode == AppOpsManager.MODE_DEFAULT) {
            granted = applicationContext!!.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
        } else {
            granted = mode == AppOpsManager.MODE_ALLOWED
        }
    }

    return granted
}
代码中的任意位置:

val permissionAppOpsManager = AppOpsManager.OPSTR_GET_USAGE_STATS
val permission = android.Manifest.permission.PACKAGE_USAGE_STATS
val permissionActivity = Settings.ACTION_USAGE_ACCESS_SETTINGS

if (hasPermission(permission, permissionAppOpsManager)) {
    Timber.i("has permission: $permission")
    // do here what needs permission
} else {
    Timber.e("has no permission: $permission")
    // start activity to get permission
    startActivity(Intent(permissionActivity))
}
使用

可以获得的其他权限

将库包括在您的
build.gradle

dependencies{
    implementation 'com.karumi:dexter:4.2.0'
}
此示例请求
写入外部存储。

Dexter.withActivity(this)
                .withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .withListener(new PermissionListener() {
                    @Override
                    public void onPermissionGranted(PermissionGrantedResponse response) {
                        // permission is granted, open the camera
                    }

                    @Override
                    public void onPermissionDenied(PermissionDeniedResponse response) {
                        // check for permanent denial of permission
                        if (response.isPermanentlyDenied()) {
                            // navigate user to app settings
                        }
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                        token.continuePermissionRequest();
                    }
                }).check();

检查此答案

检查git中的以下库:

实施:

        allprojects {
            repositories {
                ...
                maven { url 'https://jitpack.io' }
            }
        }
        
        dependencies {
            implementation 'com.github.manoj140220:RuntimePermission:1.0.3'
        }
    
    
      
    
        new RuntimePermission({Current Class Object}, String[] , {ActvityContext});
          
          String[] : permission array.
          example  : String[] permissionArray = {Manifest.permission.CAMERA, Manifest.permission.BODY_SENSORS,...} 
    
    Implement : {PermissionNotify}
    
    interface notifier methods.
    
    @Override
    public void notifyPermissionGrant() {
        
    }
    
    @Override
    public void notifyPermissionDeny() {
         
    }

我试图建立一个简单的演示,我已经为它创建了一个库。通过简单的步骤很容易使用。它创建了一个小文档,介绍了在android中请求权限运行时的步骤。请记住,我们必须使用noHistory=false才能接收回调。如果您没有收到回拨,也请参阅。我浪费了几个小时才弄明白。我已经为它创建了一个库。通过简单的步骤很容易使用。很好的回应。我已经为它创建了一个库。通过简单的步骤很容易使用。工作完美!我试过这个样品,但它总是说安全exception@Vishali您是否也在清单中添加了权限?一旦检查正确,它将工作正常??它被分配到哪里
private fun hasPermission(permission:String, permissionAppOpsManager:String): Boolean {
    var granted = false
    if (VERSION.SDK_INT >= VERSION_CODES.M) {
        // requires kitkat
        val appOps = applicationContext!!.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager

        // requires lollipop
        val mode = appOps.checkOpNoThrow(permissionAppOpsManager,
                              android.os.Process.myUid(), applicationContext!!.packageName)

        if (mode == AppOpsManager.MODE_DEFAULT) {
            granted = applicationContext!!.checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
        } else {
            granted = mode == AppOpsManager.MODE_ALLOWED
        }
    }

    return granted
}
val permissionAppOpsManager = AppOpsManager.OPSTR_GET_USAGE_STATS
val permission = android.Manifest.permission.PACKAGE_USAGE_STATS
val permissionActivity = Settings.ACTION_USAGE_ACCESS_SETTINGS

if (hasPermission(permission, permissionAppOpsManager)) {
    Timber.i("has permission: $permission")
    // do here what needs permission
} else {
    Timber.e("has no permission: $permission")
    // start activity to get permission
    startActivity(Intent(permissionActivity))
}
dependencies{
    implementation 'com.karumi:dexter:4.2.0'
}
Dexter.withActivity(this)
                .withPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .withListener(new PermissionListener() {
                    @Override
                    public void onPermissionGranted(PermissionGrantedResponse response) {
                        // permission is granted, open the camera
                    }

                    @Override
                    public void onPermissionDenied(PermissionDeniedResponse response) {
                        // check for permanent denial of permission
                        if (response.isPermanentlyDenied()) {
                            // navigate user to app settings
                        }
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                        token.continuePermissionRequest();
                    }
                }).check();
        allprojects {
            repositories {
                ...
                maven { url 'https://jitpack.io' }
            }
        }
        
        dependencies {
            implementation 'com.github.manoj140220:RuntimePermission:1.0.3'
        }
    
    
      
    
        new RuntimePermission({Current Class Object}, String[] , {ActvityContext});
          
          String[] : permission array.
          example  : String[] permissionArray = {Manifest.permission.CAMERA, Manifest.permission.BODY_SENSORS,...} 
    
    Implement : {PermissionNotify}
    
    interface notifier methods.
    
    @Override
    public void notifyPermissionGrant() {
        
    }
    
    @Override
    public void notifyPermissionDeny() {
         
    }