Подтвердить что ты не робот

OnRequestPermissionsResult не вызывается в фрагменте, если он определен как в фрагменте, так и в действии

У меня есть фрагмент, в котором у меня есть recyclerview и настройка данных в этом recyclerview с использованием адаптера recycliewiew.

Теперь у меня есть кнопка в элементе списка адаптеров, на который мне нужно проверить разрешение READ_EXTERNAL_STORAGE в android для новой модели разрешения в android.

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

Я прошел MyFragment.this как параметр в адаптере и вызывая метод фрагмента нажатием кнопки в адаптере.

Я использовал приведенный ниже код для вызова requestPermission в фрагменте.

if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED)){
       requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                ConstantVariables.READ_EXTERNAL_STORAGE);
    }

Я переопределил метод onRequestPermissionsResult в фрагменте, используя приведенный ниже код:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case ConstantVariables.READ_EXTERNAL_STORAGE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, proceed to the normal flow.
                startImageUploading();
            } else {}

Но он не получает вызов, а не этот метод onRequestPermissionsResult вызывает вызов.

Я также определяю один и тот же метод onRequestPermissionsResult в родительской активности фрагмента и вызывается.

Я не могу удалить действие onRequestPermissionsResult, но хочу вызвать метод фрагмента onRequestPermissionsResult, когда я запрашиваю разрешение от фрагмента. Как я могу это сделать? Я делаю что-то неправильно здесь, пожалуйста, помогите мне, если у кого есть идея здесь.

4b9b3361

Ответ 1

Отредактированный ответ для охвата более широких проблем

Я думаю, вы запутываете метод для фрагмента и активности. Имел аналогичный вопрос мой проект в прошлом месяце. Проверьте, есть ли у вас, наконец, следующее:

  • В AppCompatActivity используйте метод ActivityCompat.requestpermissions
  • В фрагменте поддержки v4 вы должны использовать requestpermissions
  • Поймать, если вы вызываете AppcompatActivity.requestpermissions в свой фрагмент, тогда обратный вызов будет активирован, а не фрагмент
  • Обязательно вызывайте super.onRequestPermissionsResult из действия onRequestPermissionsResult.

Посмотрите, помогает ли это.

Ответ 2

Я запросил разрешение на местоположение у фрагмента, и во фрагменте мне нужно было изменить это:

            ActivityCompat.requestPermissions(getActivity(), new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

на это:

            requestPermissions(new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

затем во фрагменте был вызван onRequestPermissionsResult.

Ответ 3

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

FragmentCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            ConstantVariables.READ_EXTERNAL_STORAGE);

Сначала нужно добавить зависимость support-v13:

implementation "com.android.support:support-v13:$supportLibVersion"

Ответ 4

private void showContacts() {
 if (getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
         != PackageManager.PERMISSION_GRANTED) {
     requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
             PERMISSIONS_REQUEST_READ_STORAGE);
 } else {
     doShowContacts();
 }
}

 @Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions,
     int[] grantResults) {
 if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     doShowContacts();
 }
 }

изменить разрешение

Ответ 5

Этот принятый ответ не работает для меня, поэтому я нашел свое собственное решение, объясненное ниже:

1. Сначала я создал метод во фрагменте:

public static void MyOnRequestPermissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
        if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "Permission: true");
        } else {
            Log.d(TAG, "permission: false");
        }
}

2. И затем вызвали его из своей основной деятельности:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(requestCode ==1){
        SignupFragment.MyOnRequestPermissionResult(requestCode, permissions, grantResults);
    }
}

И это работает...

Ответ 6

Убедитесь, что оба PERMISSION_REQUEST_CODE в onRequestPermissionsResult и внутри вашего Fragment содержат одно и то же значение.

Ответ 7

Для tragetSDK 28, проверка SDK (> 23) и запрос разрешения от фрагмента будут работать. ActivityCompat.requestPermissions терпит неудачу (если вы установите код запроса ниже 65536, появится диалоговое окно разрешения, и если пользователь разрешит разрешение, разрешения будут предоставлены, но обратный вызов не произойдет. Но если вы установите значение выше 65536, ActivityCompat.requestPermissions будет немедленно провалиться. Я не знаю причины этой логики. Может быть ошибка или преднамеренное).

Рабочий код:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }

Ответ 8

Эта проблема была фактически вызвана NestedFragments. В основном большинство фрагментов мы расширили HostedFragment, который, в свою очередь, расширяет CompatFragment. Наличие этих вложенных фрагментов вызвало проблемы, которые в конечном итоге были решены другим разработчиком проекта.

Он занимался некоторыми низкоуровневыми вещами, такими как переключение бит, чтобы получить эту работу, поэтому я не слишком уверен в конечном решении