繁体   English   中英

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

[英]Android Studio WebView Unable to ask user for their geolocation

我一直在开发一个网站并决定将其包装到一个应用程序中,所以我使用的是 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 应用程序的位置权限,而不必经历所有这些。

我的 MainActivity.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>

我真的希望有一个更简单的解决方案来解决这个问题,如果你以前遇到过同样的问题,请帮助新手解决它

您必须请求用户手动授予位置权限。 查看官方文档Request Permissions以获取更多信息。

从文档中我推断请求权限代码应该是这样的。

// 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)
    }
}

你必须使用

WebChromeClient()

作为 Webview 客户端。 并覆盖

onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) method. 

如果用户尚未授予权限,则询问运行时权限。 并调用

callback.invoke(origin, true, false);    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM