我一直在开发一个网站,并决定将其包装成一个应用程序,所以我使用Android Studio (Kotlin不是java)。我对它很陌生,到目前为止,我能够启动应用程序与我的网站,但无法从用户那里获得位置,权限不会弹出。
正常情况下浏览器会请求许可,但app不会。我做了很多搜索试图找到一个解我得到的最接近的解是这个https://developer.android.com/training/location/permissions,但我是个新手所有这些看起来让我很困惑,我试着粘贴代码,发现我需要为位置服务创建一些类,所以这给我带来了这个链接https://thakkarkomal009.medium.com/update-location-in-background-using-foreground-service-android-7aee9de1a6d6和教程对我来说仍然不清楚。这家伙告诉我创建类,我不知道在哪里创建类,android studio中的所有这些目录让我很困惑。他也有一个链接到他的项目,我只是不能理解所有这些文件。我在想,在kotlin在MainActivity我只需要写几行代码来获得用户的位置权限的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>
我真的希望这个问题有一个更简单的解决方案,如果你以前有同样的问题,请帮助新手解决。
你必须使用
WebChromeClient()
作为Webview客户端。重写
onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) method.
询问运行时权限,如果用户尚未授予权限。并调用
callback.invoke(origin, true, false);
您必须手动请求用户给予位置权限。查看官方文档请求权限获取更多信息。
从文档中我推断请求权限代码应该是这样的:
// 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)
}
}