如何在运行时检查授权许可?

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

所以我问在运行如何检查授权许可

尼斯!

我刚发现我的需要,我们可以检查是否授予的权限:

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 // calendar task you need to do. } else { // permission denied, boo! Disable the // functionality that depends on this permission. } return; } // other 'switch' lines to check for other // permissions this app might request } } 

试试这个简单的请求代码
https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

 public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1; private boolean checkAndRequestPermissions() { int camera = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA); int storage = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); int loc = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION); int loc2 = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION); List listPermissionsNeeded = new ArrayList<>(); if (camera != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.CAMERA); } if (storage != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (loc2 != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION); } if (loc != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(android.Manifest.permission.ACCESS_COARSE_LOCATION); } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(this,listPermissionsNeeded.toArray (new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS); return false; } return true; } 

试试这个检查运行时权限:

 @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(); } } 

设置自定义提醒:

 private void alertView() { AlertDialog.Builder dialog = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogStyle); dialog.setTitle("Permission Denied") .setInverseBackgroundForced(true) //.setIcon(R.drawable.ic_info_black_24dp) .setMessage("Without those permission the app is unable to save your profile. App needs to save profile image in your external storage and also need to get profile image from camera or external storage.Are you sure you want to deny this permission?") .setNegativeButton("I'M SURE", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { dialoginterface.dismiss(); } }) .setPositiveButton("RE-TRY", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { dialoginterface.dismiss(); checkRunTimePermission(); } }).show(); } 
 fun hasPermission(permission: String): Boolean { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true // must be granted after installed. return mAppSet.appContext.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED } 

最好的描述是: http : //inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

对于简单的使用权限,你可以使用这个lib: http : //hotchemi.github.io/PermissionsDispatcher/

对于位置运行时权限

 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 } } 

您也可以通过下面的代码片段查询为向后兼容;

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

原来的(不是我的)post在这里

对于特殊权限,比如android.Manifest.permission.PACKAGE_USAGE_STATS使用的AppOpsManager
科特林

 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)) } 

您可以使用TedPermission库获得其他权限