onRequestPermissionsResult не называют фрагмент, если она определена в оба фрагмента и активности


у меня есть фрагмент, в котором у меня есть recyclerview и установка данных в этом recyclerview с помощью адаптера recyclerview.

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

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

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

я использовал приведенный ниже код для вызова 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 фрагмента, когда я запрашиваю разрешение от фрагмента. Как я могу это сделать? Я делаю что-то неправильно здесь, Пожалуйста, помогите мне если у кого есть идеи здесь.

7 67

7 ответов:

отредактированный ответ, чтобы охватить более широкие вопросы

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

  1. в AppCompatActivity используйте метод ActivityCompat.requestpermissions
  2. в V4 фрагмент поддержки вы должны использовать requestpermissions
  3. Catch, если вы вызываете AppcompatActivity.requestpermissions в вашем фрагменте тогда обратный вызов придет к активности, а не к фрагменту
  4. обязательно позвоните super.onRequestPermissionsResult от действий onRequestPermissionsResult.

смотрите, если это поможет .

метод 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"

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

            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 был вызван во фрагменте.

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

}

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

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

для tragetSDK 28, проверка SDK (>23) и requestpermissions от фрагмента будет работать. The 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);
                    }

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

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