Этот код ниже работает отлично. Я объясняю с помощью примера.
В моем случае я поместил проверки полномочий отдельно в класс утилиты и передал конкретные разрешения, которые мне нужно проверить из соответствующих классов. Это позволило повторно использовать файл утилиты проверки разрешений во всем приложении.
В приведенной ниже части кода показан вызов функции. В этом случае я запрашиваю разрешение android.Manifest.permission.READ_EXTERNAL_STORAGE
.
//the below call is from a fragment
@OnClick(R.id.button)//butterknife implementation
public void attachPressed() {
if (PermissionUtils.hasThisPermission(getContext(), android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
onAttachPressed();
} else {
PermissionUtils.isPermissionRequestNeeded(getActivity(), this, android.Manifest.permission.READ_EXTERNAL_STORAGE, PermissionUtils.REQUEST_GROUP_STORAGE);
}
}
В приведенном выше случае разрешения проверяется, если это разрешено функция onAttachPressed();
называется еще мы проверяем разрешение запроса.
Ниже приведен код, присутствующий в классе UTIL в моем случае PermissionUtils
public final class PermissionUtils {
public static final int REQUEST_GROUP_STORAGE = 1508;
private PermissionUtils() {
}
public static boolean hasThisPermission(Context context, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
} else {
return true;
}
}
public static boolean isPermissionRequestNeeded(Activity activity, Fragment fragment, String permission, int requestCode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !hasThisPermission(activity, permission)) {
final String[] permissions = new String[]{permission};
if (fragment == null) {
activity.requestPermissions(permissions, requestCode);
} else {
fragment.requestPermissions(permissions, requestCode);
}
return true;
}
return false;
}
}
И после запроса, если вы можете вызвать функцию из onRequestPermissionsResult
или иначе вам нужно будет нажать на кнопку еще раз для вызов функции.
Так просто называют его от onRequestPermissionsResult
//the below call is from a fragment
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PermissionUtils.REQUEST_GROUP_STORAGE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onAttachPressed();
} else {
Log.e("value", "Permission Denied, You cannot use local drive .");
}
}
Посмотрите здесь, это все, что вам нужно: https://developer.android.com/training/permissions/requesting.html –
Посмотрите на это http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en – Dory
Вы просматривали образцы в репозитории GitHub Google? –