Запросить разрешения во время выполнения из v4.Fragment и выполнить обратный вызов в Fragment?

У меня странная проблема, которая вызывает конфликт. Мне пришлось переключиться на собственные Fragments чтобы исправить это, но есть ошибки.

Моя оригинальная проблема: у меня есть установка ящика для навигации с v4 Fragments. Чтобы запросить разрешение в одном из моих фрагментов, я вызываю ActivityCompat.requestPermissions(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION, 1); Свидание появляется очень хорошо, но когда я принимаю или отклоняю разрешение, ничего не происходит. Обратный вызов onRequestPermissionsResult() никогда не вызывается. Вместо этого он вызывает в Activity, к которому привязаны мои фрагменты. Мне бесполезно, мне нужен обратный вызов для работы во Фрагменте.

Имея это в виду, мне сказали, что мне нужно использовать FragmentCompat , но это работает только с native Fragments (v13+) , поэтому я изменил навигационный ящик для работы с родными фрагментами вместо библиотеки фрагментов поддержки v4. Однако , поскольку я использую AppCompatActivity, некоторые вещи не работают, например, addToBackStack() и возвращаются к предыдущему фрагменту.

Короче говоря, кто-нибудь знает, как я могу использовать v4.Fragment и все еще вызывать разрешение во Fragment и получить обратный вызов во Fragment ? Я чувствую, что это ошибка в Android, которая не была устранена, но я не 100%.

Дайте мне знать, если вам нужно увидеть мой код, это всего лишь стандартные методы, которые необходимы для разрешений времени выполнения, я хотел бы работать с фрагментами V4, хотя это не работает из моего понимания.

Такое поведение, по-видимому, присутствует в классе поддержки фрагмента v4 [ 1 ]. Реализации Activity / FragmentCompat существуют для людей, которые хотят использовать родные классы с расширенной функциональностью на уровнях API от 11 до 23.

Добавление этого в родительскую активность работает для меня:

 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); List<Fragment> fragments = getSupportFragmentManager().getFragments(); if (fragments != null) { for (Fragment fragment : fragments) { fragment.onRequestPermissionsResult(requestCode, permissions, grantResults); } } } 

Источник: https://code.google.com/p/android/issues/detail?id=189121#c5

Если вам нужно получить разрешениеResult в fragment v4 убедитесь, что вы используете

 Fragment.requestPermission(String[], int); 

вместо

 AppCompat.requestPermission(Activity, String[], int) 

Проверьте этот ответ!

Вы можете использовать эту часть кода

 requestPermissions(new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSION_REQUEST_CODE); 

В последнее время я столкнулся с такой же ситуацией, когда мне нужно было проверить разрешение внутри фрагмента поддержки и получить там обратный вызов.

Я смог использовать ContextCompat для checkSelfPermission а затем, как @NasaGeek, вызвал запрос android.support.v4.app.Fragment 's requestPermissions чтобы запросить разрешение, а затем получил обратный вызов onRequestPermissionsResult в v4 Fragment.

Надеюсь это поможет.

Благодарю.

V4.Fragment работает хорошо. У меня проблема с вложенным фрагментом v4.Fragment. Требуется разрешение, но обратный вызов onRequestPermissionsResult () никогда не вызывается во вложенном фрагменте!

Открыт выпуск

На данный момент наиболее устойчивое решение делает это вручную. Я сам решил это просто, уведомив дочерние фрагменты из родительских фрагментов.

 if (fragment.getParentFragment() != null) { Fragment parentFragment = fragment.getParentFragment(); try { ChildFragmentPermissionRegistry registry = (ChildFragmentPermissionRegistry) parentFragment; registry.registerPermissionListener((ChildFragmentPermissionCallback) fragment); parentFragment.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST_CODE); } catch (ClassCastException e) { Log.e(PermissionVerifier.class.getSimpleName(), e.getMessage()); } } else { fragment.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST_CODE); } 

Где родительский фрагмент реализует интерфейс ChildFragmentPermissionRegistry и регистрирует дочерний фрагмент,

 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (callback != null) { callback.onRequestPermissionsResult(requestCode, permissions, grantResults); callback = null; } } 

И дочерние фрагменты реализуют ChildFragmentPermissionCallback

И интерфейсы – вот что:

 public interface ChildFragmentPermissionCallback { void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults); } public interface ChildFragmentPermissionRegistry { void registerPermissionListener(ChildFragmentPermissionCallback callback); } 

Просто используйте requestPermission («ваше разрешение / s в строковом массиве», ваш код запроса) просто не нужно использовать Fragment.requestPermissons(String[],int );

Этот метод в вашем фрагменте вызывает requestPermissions android.support.v4.app.Fragment class ie

 public final void requestPermissions(@NonNull String[] permissions, int requestCode) { if (mHost == null) { throw new IllegalStateException("Fragment " + this + " not attached to Activity"); } mHost.onRequestPermissionsFromFragment(this, permissions, requestCode); }