2

我有一个 WebView,它加载一个具有基于位置的功能的页面和一个覆盖了 onGeolocationPermissionsShowPrompt() 的 WebChromeClient。启用位置服务时,为页面启用位置可以正常工作。

问题是,如果用户的位置被关闭,我想提示他们打开它,但如果它被关闭,我从不点击 onGeolocationPermissionsShowPrompt()。是否仅在位置可用时才调用此函数?

4

3 回答 3

1

一种解决方案是不保留权限(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应该自动重新创建。

于 2020-08-21T08:19:46.727 回答
0

不确定这是否正是您要寻找的,但我只是调用了一个方法 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);      
       }   
    }
于 2012-04-24T20:07:16.013 回答
0

您需要第二个和第三个参数为假

callback.invoke(origin, false, false);
于 2021-08-30T14:55:55.027 回答