Не вызывать onRequestPermissionsResult из фрагмента - PullRequest
1 голос
/ 07 июля 2019

В моем проекте Android я использую этот код для проверки и запроса разрешений во время выполнения:

public class AgentsFragmentMapTab extends RootFragment implements  ActivityCompat.OnRequestPermissionsResultCallback 
{    
     //..
     private boolean checkAndRequestPermissions() {
            int internet = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.INTERNET);
            int loc = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION);
            int loc2 = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);
            List<String> listPermissionsNeeded = new ArrayList<>();
            if (internet != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.INTERNET);
            }
            if (loc != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
            }
            if (loc2 != PackageManager.PERMISSION_GRANTED) {
                listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
            }
            if (BuildConfig.DEBUG)
                Log.d(TAG, "checkAndRequestPermissions_listPermissionsNeeded(" + listPermissionsNeeded.size() + ")");
            if (!listPermissionsNeeded.isEmpty()) {
                ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), LOCATION_REQ_CODE);
                return false;
            }
            return true;
        }

        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

            if (requestCode == LOCATION_REQ_CODE) {

                } else {

                }
            }
        }

Этот код прекрасно отображает диалог разрешений.Но когда я нажимаю кнопку Разрешить или Запретить , метод onRequestPermissionsResult() не вызывается.Почему это не вызывается и как этого добиться?

Ответы [ 3 ]

0 голосов
/ 07 июля 2019

Изменить

 ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), LOCATION_REQ_CODE);

на:

requestPermissions(listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_CODE);

А также ContextCompat на ActivityCompat и getActivity() на getContext(), например:

int loc2 = ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION, LOCATION_REQ_CODE);
0 голосов
/ 07 июля 2019

Во-первых, сделайте это в родительском упражнении.

...
Fragment theFragment = 
     getSupportFragmentManager().findFragmentById(R.id.your_fragment_name);
...         

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case LOCATION_REQ_CODE: {
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                if(theFragment instanceof AgentsFragmentMapTab) 
                    ((AgentsFragmentMapTab)theFragment).passPermissionResult(true);

            } else {
                if(theFragment instanceof AgentsFragmentMapTab) 
                    ((AgentsFragmentMapTab)theFragment).passPermissionResult(false);
            }
            return;
        }
    }
}

Затем добавьте публичный метод в ваш фрагмент следующим образом:

public void passPermissionResult(boolean allowed) {
    if(allowed) {
        // ALLOW clicked
    }
    else {
        // DENY clicked
    }
}
0 голосов
/ 07 июля 2019

Как упомянуто в комментариях Переопределить onRequestPermissionsResult в родительском действии

Обязательно позвоните super.onRequestPermissionsResult из этого действия onRequestPermissionsResult

, после чего оно отправит вашим фрагментам, которые переопределят onRequestPermissionsResult

Отредактировано:

Вот что я сделал

Я назвал requestPermissions(StringOfPermissions,YourRequestCode);

внутри фрагмента

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

getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.container, BlankFragment.newInstance("",""))
            .disallowAddToBackStack()
            .commit();

Я переопределил onRequestPermissionsResult ():

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

внутри действия и фрагмент

когда я запросил фрагмент, он вошел в активность, а затем вошел во фрагмент

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...