Android 如何在运行时检查授权权限?
在Android M(预览版)中,用户可以选择特定的应用程序并检索特定的权限 所以我问如何在运行时检查授权权限?很好 我刚找到我的需要我们可以检查许可是否由以下人员授予: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
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
usedapppsmanager
:
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() {
}