2016-08-15 2 views
8

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

Диалог разрешения появляется каждый раз, когда пользователь нажимает «deny». Только нажав «никогда не спрашивать снова», он снова не появится снова. * При нажатии «allow» он работает хорошо - без проблем.

Есть ли способ отменить метод, который вызывается через один раз?

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
{ 
    ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.ACCESS_FINE_LOCATION }, LOCATION_PERMISSION_CUSTOM_REQUEST_CODE); 
} 


@Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     switch(requestCode) 
     { 
      case LOCATION_PERMISSION_CUSTOM_REQUEST_CODE: 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // permission was granted 
        MyManager.connect(); 
        return; 
       } else { 
        // permission denied 
        return; 
       } 
      default: 
       return; 
     } 
    } 
+0

, пожалуйста, внесите свой код –

+0

@GilMoshayof отредактировал это сообщение) thanks – BVtp

+0

Что происходит в MyManager.connect()? –

ответ

12

Проблема здесь, как вы упомянули в комментариях, является то, что код, который вызывает диалог разрешения запроса вызывается в методе onResume.

Когда разрешение на диалог запроса заканчивается, среда выполнения вызывает onResume о действии, которая вызвала его, как и любая деятельность, связанная с диалогом.

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

Перемещение этого запроса на разрешение на onCreate или какой-либо другой поток решит вашу проблему.

+3

Просто пояснения: «так же, как любой диалог» - это верно для диалога - боевая деятельность. Это неверно для «Диалога», поскольку «Диалог» не влияет на жизненный цикл активности. В этом случае диалоговое окно разрешений времени выполнения представляет собой диалоговое действие. – CommonsWare

+0

спасибо за это! отредактировал ответ. –

Смежные вопросы