WebChromeClient.onGeolocationPermissionsShowPrompt() никогда не вызывается, если местоположения отключены

У меня есть WebView, который загружает страницу с функциями, основанными на местоположении, и WebChromeClient с переопределением onGeolocationPermissionsShowPrompt(). Включение определения местоположения для страницы работает нормально, когда службы определения местоположения включены.

Проблема в том, что если местоположение пользователя отключено, я хочу предложить им включить его, но если оно отключено, я никогда не нажимаю onGeolocationPermissionsShowPrompt(). Эта функция вызывается только в том случае, если местоположение доступно?


person dwemthy    schedule 24.04.2012    source источник
comment
Я также сталкиваюсь с той же проблемой. После того, как пользователь откажет в разрешении на размещение, onGeolocationPermissionsShowPrompt никогда не вызывается. Это снова вызовет после того, как пользователь удалит приложение и переустановит его. Может ли какой-нибудь орган предложить какое-то решение по этому поводу?   -  person Rajeev Sahu    schedule 08.05.2018
comment
Ожидается, что callback.invoke завершит поток, поэтому вы должны вызвать invoke как отозванные, так и предоставленные разрешения. В противном случае вы не будете получать подсказки снова, пока не удалите или не очистите приложение.   -  person cuasodayleo    schedule 20.09.2019


Ответы (2)


Одно из решений — не сохранять разрешение (используйте false в качестве третьего параметра в callback). Это может привести к чрезмерному запросу разрешений, поэтому локальное сохранение результата решает эту проблему:

class MyWebChromeClient : WebChromeClient() {

    private var givenPermissions: Set<String> = emptySet()

    override fun onGeolocationPermissionsShowPrompt(origin: String, callback: GeolocationPermissions.Callback) {
        val onResult = { allow: Boolean -> callback(origin, allow, false) }
        when {
            origin in givenPermissions -> checkSystemPermission { granted ->
                if (!granted) givenPermissions -= origin
                onResult(granted)
            }
            else -> askForPermission { allow ->
                when (allow) {
                    false -> onResult(false)
                    true -> checkSystemPermission { granted ->
                        if (granted) givenPermissions += origin
                        onResult(granted)
                    }
                }
            }
        }
    }

    private fun askForPermission(callback: (Boolean) -> Unit) {
        // ask for permission
    }

    private fun checkSystemPermission(callback: (Boolean) -> Unit) {
        // check/ask for system permission
    }

}

Если системное разрешение отозвано, WebChromeClient должно быть воссоздано автоматически.

person petter    schedule 21.08.2020

Не уверен, что это именно то, что вы ищете, но я просто вызываю метод CheckEnableGPS()

//Method for turning GPS on if it isn't
    private void CheckEnableGPS(){    
    String provider = Settings.Secure.getString(getContentResolver(),      
    Settings.Secure.LOCATION_PROVIDERS_ALLOWED);       
    if(!provider.equals(""))
    {           
      //GPS Enabled        
    Toast.makeText(ShowMapActivity.this, "GPS Enabled: " + provider,          Toast.LENGTH_LONG).show();       
    }
    else
    {        
    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);           startActivity(intent);      
       }   
    }
person ZeroSkittles    schedule 24.04.2012
comment
У меня есть такой метод, проблема в том, что я хочу запустить этот метод, когда страница в веб-просмотре запрашивает текущее местоположение, но WebChromeClient только когда-либо получает запрос со страницы, если местоположение уже включено, что противоречит цели обнаружения его. Спасибо хоть. - person dwemthy; 25.04.2012
comment
У вас также есть webView.getSettings().setGeolocationEnabled(true)? - person David Chandler; 25.04.2012