【问题标题】:WebChromeClient.onGeolocationPermissionsShowPrompt() never called if locations are turned off如果位置被关闭,WebChromeClient.onGeolocationPermissionsShowPrompt() 永远不会被调用
【发布时间】:2012-04-24 19:59:34
【问题描述】:

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

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

【问题讨论】:

  • 我也面临同样的问题。一旦用户拒绝了位置权限,就永远不会调用 onGeolocationPermissionsShowPrompt。在用户卸载应用程序并重新安装后,这将再次调用。任何机构都可以提出一些解决方案吗?
  • callback.invoke 预计会完成流程,因此您应该调用invoke 撤销或授予这两个权限。否则,在卸载或清除应用程序之前,您将无法再次获得提示。

标签: android geolocation webchromeclient


【解决方案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应该会自动重新创建。

【讨论】:

    【解决方案2】:

    不确定这是否正是您要寻找的,但我只是调用了一个方法 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);      
           }   
        }
    

    【讨论】:

    • 我有一个这样的方法,问题是我想在 webview 中的页面请求当前位置时运行该方法,但 WebChromeClient 仅在位置时从页面获取请求已经开启,这违背了检测它的目的。不过还是谢谢。
    • 你也有webView.getSettings().setGeolocationEnabled(true)吗?
    【解决方案3】:

    你需要第二个和第三个参数是假的

    callback.invoke(origin, false, false);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 2013-10-12
      • 2012-03-27
      • 2013-08-29
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      相关资源
      最近更新 更多