Android Studio WebView无法询问用户的地理位置

cu6pst1q  于 2022-12-16  发布在  Android
关注(0)|答案(2)|浏览(156)

我一直在开发一个网站,并决定将其 Package 成一个应用程序,所以我使用Android Studio(Kotlin而不是java).我是非常新的,到目前为止,能够启动应用程序与我的网站,但无法从用户的位置,权限不会弹出.
通常浏览器会请求权限,但应用程序不会。我做了很多搜索,试图找到解决方案,最接近解决方案的是这个https://developer.android.com/training/location/permissions,但我非常新鲜,所有这些在我看来非常混乱,我试着粘贴代码,发现我需要为位置服务创建一些类,所以这将我带到https://thakkarkomal009.medium.com/update-location-in-background-using-foreground-service-android-7aee9de1a6d6链接,教程是我还是不太清楚。那个家伙让我创建类,我不知道在哪里创建类,android studio中的所有这些目录都让我很困惑。他也有一个指向他项目的链接,我就是看不懂所有这些文件。我在想,在MainActivity的Kotlin中,我只需要编写几行代码就可以获得用户对webview应用程序的位置权限,而不必通过这一切。
我的主活动.kt如下所示

package com.example.hav

import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val myWeb = findViewById<WebView>(R.id.myWebView)
        
        myWeb.webViewClient= WebViewClient()
        
        myWeb.apply{
            loadUrl("linktomywebsite.com")
            settings.javaScriptEnabled = true
            settings.setGeolocationEnabled(true)
        }
        
    }
}

我的AndroidManifest.xml看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hav">
    <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" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <application
        android:allowBackup="true"
        android:usesCleartextTraffic="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Hav">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name="dontknowwhattoputheresomeclass?"
            android:foregroundServiceType="location"
            android:exported="false" />
    </application>

</manifest>

我真的希望有一个更容易的解决这个问题,帮助noob解决它,请如果你有同样的问题之前

rjee0c15

rjee0c151#

您必须使用WebChromeClient()作为Webview客户端。并覆盖onGeolocationPermissionsShowPrompt(String origin,GeolocationPermissions.Callback回调)方法。如果用户尚未授予权限,则请求运行时权限。并调用

callback.invoke(origin, true, false);
tyky79it

tyky79it2#

您必须请求用户手动给予位置权限。有关详细信息,请查看官方文档请求权限。
从文档中我推断请求权限代码应该类似于下面的代码。

// Register the permissions callback, which handles the user's response to the
val requestPermissionLauncher =
    registerForActivityResult(RequestPermission()
    ) { isGranted: Boolean ->
        if (isGranted) {
            // Permission is granted. Continue the action or workflow in your app.
        } else {
            // Not Granted
        }
    }

检查是否授予权限,否则使用requestPermissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION)请求。

when {
    ContextCompat.checkSelfPermission(
            CONTEXT,
            Manifest.permission.ACCESS_FINE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED -> {
        // You can use the API that requires the permission.
        performAction(...)
    }
    shouldShowRequestPermissionRationale(...) -> {
        // In an educational UI, explain to the user why your app requires this
        // permission for a specific feature to behave as expected, and what
        // features are disabled if it's declined. In this UI, include a
        // "cancel" or "no thanks" button that lets the user continue
        // using your app without granting the permission.
        showInContextUI(...)
    }
    else -> {
        requestPermissionLauncher.launch(
            Manifest.permission.ACCESS_FINE_LOCATION)
    }
}

相关问题