Как проверить разрешения на гранты во время выполнения?

В Android M (Preview) пользователь может выбрать конкретное приложение и получить определенное разрешение.

Поэтому я спрашиваю, как проверить разрешения на гранты во время выполнения ?

Ницца !!

Я только нашел свою потребность, мы можем проверить, разрешено ли разрешение:

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

Для простейших разрешений вы можете использовать эту библиотеку: 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 } } 

Вы также можете запросить, выполнив следующий fragment кода как обратно совместимый;

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

оригинал (не мой) сообщение здесь

Для специальных разрешений, таких как 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

использовать библиотеку Dexter

Включите библиотеку в свой build.gradle

 dependencies{ implementation 'com.karumi:dexter:4.2.0' } 

этот пример запрашивает WRITE_EXTERNAL_STORAGE.

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

проверьте этот ответ здесь

Давайте будем гением компьютера.