首页 > 解决方案 > 在 webview 中获得地理定位权限后 GPS 未打开?

问题描述

帮助!我完全被我的 webview 应用程序困住了。我的 webview 应用程序中的网站页面显示了带有用户当前位置的 Google 地图。但我不知道为什么我的代码不能正常工作?当用户进入应用程序时,我的 webview 请求地理定位权限,但是在授予地理定位权限后,GPS 没有打开,G-maps 什么也没有显示?在 app-info >> 权限 >> 位置是允许的。在 chrome 浏览器中,这一切都很完美,但在我的 webview 应用程序中没有任何反应,

   class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    ActivityCompat.requestPermissions(
        this, arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        ), 0
    )


    val UrlWindow: WebView = findViewById(R.id.UrlWindow)
    UrlWindow.webViewClient = object : WebViewClient (){
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            if (url != null) {
                view?.loadUrl(url)
            }
            return true
        }
    }

    UrlWindow.settings.javaScriptCanOpenWindowsAutomatically = true
    UrlWindow.settings.databaseEnabled = true
    UrlWindow.setWebChromeClient(object : WebChromeClient() {
        override fun onGeolocationPermissionsShowPrompt(
            origin: String,
            callback: GeolocationPermissions.Callback
        ) {
            callback.invoke(origin, true, false)
        }
    })

    UrlWindow.settings.javaScriptEnabled = true
    UrlWindow.settings.setGeolocationEnabled(true)
    UrlWindow.loadUrl("https://mywebsite.com")

}

override fun onBackPressed() {
    if (UrlWindow.canGoBack()) {
        UrlWindow.goBack()
    } else {
        super.onBackPressed()
    }
}

}

和我的清单

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:usesCleartextTraffic="true"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

欢迎任何帮助!

标签: javascriptandroidkotlinwebviewgeolocation

解决方案


一旦您在OnRequestPermissionResult回调中获得权限结果,请执行 webview 的初始化。

override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
       //Do the permission check here
       initializeWebView()

    }

此外,推荐的步骤是,

  1. 首先检查权限
  2. 如果没有获得所需的许可,请请求他们。
  3. OnRequestPermissionResult在回调中获得权限状态后,执行基于权限的任务。

推荐阅读