当前位置: 首页 > 知识库问答 >
问题:

没有足够的地理位置权限Android Webview

伯彦君
2023-03-14

晚上好我正在使用Webview在Android上制作跟踪应用程序。我遇到了问题,因为该系统在该位置附近运行良好。我试过Grishma Ukani先生的一些方法(非常感谢)。

package com.example.webview;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
* A minimal WebView app with HTML5 geolocation capability
*
* @author David M. Chandler
*/
public class GeoWebViewActivity extends Activity {

/**
 * WebViewClient subclass loads all hyperlinks in the existing WebView
 */
public class GeoWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // When user clicks a hyperlink, load in the existing WebView
        view.loadUrl(url);
        return true;
    }
}

/**
 * WebChromeClient subclass handles UI-related calls
 * Note: think chrome as in decoration, not the Chrome browser
 */
public class GeoWebChromeClient extends WebChromeClient {
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
            GeolocationPermissions.Callback callback) {
        // Always grant permission since the app itself requires location
        // permission and the user has therefore already granted it
        callback.invoke(origin, true, false);
    }
}

WebView mWebView;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mWebView = (WebView) findViewById(R.id.webView1);
    // Brower niceties -- pinch / zoom, follow links in place
    mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    mWebView.getSettings().setBuiltInZoomControls(true);
    mWebView.setWebViewClient(new GeoWebViewClient());
    // Below required for geolocation
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setGeolocationEnabled(true);
    mWebView.setWebChromeClient(new GeoWebChromeClient());
    // Load google.com
    mWebView.loadUrl("http://www.google.com");
}

@Override
public void onBackPressed() {
    // Pop the browser back stack or exit the activity
    if (mWebView.canGoBack()) {
        mWebView.goBack();
    }
    else {
        super.onBackPressed();
    }
}
}

一切顺利,没有错误。但仍然无法获得设备位置/权限,然后这些信息就会出现在android studio上

E/cr_LocationProvider:从系统注册位置更新时捕获安全异常应用程序没有足够的地理定位权限E/cr_LocationProvider: newError可用的应用程序没有足够的地理定位权限。

然后我试图修改链接从不够的地理定位权限,并把这个修改我的公共类GeoWebViewActive扩展活动

private static final int REQUEST_FINE_LOCATION = 1;
private String mGeolocationOrigin;
private GeolocationPermissions.Callback mGeolocationCallback;

public class GeoWebChromeClient extends WebChromeClient {
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
                                                   GeolocationPermissions.Callback callback) {
        // Geolocation permissions coming from this app's Manifest will only be valid for devices with
        // API_VERSION < 23. On API 23 and above, we must check for permissions, and possibly
        // ask for them.
        String perm = Manifest.permission.ACCESS_FINE_LOCATION;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
                ContextCompat.checkSelfPermission(GeoWebViewActivity.this, perm) == PackageManager.PERMISSION_GRANTED) {
            // we're on SDK < 23 OR user has already granted permission
            callback.invoke(origin, true, false);
        } else {
            if (!ActivityCompat.shouldShowRequestPermissionRationale(GeoWebViewActivity.this, perm)) {
                // ask the user for permission
                ActivityCompat.requestPermissions(GeoWebViewActivity.this, new String[] {perm}, REQUEST_FINE_LOCATION);

                // we will use these when user responds
                mGeolocationOrigin = origin;
                mGeolocationCallback = callback;
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST_FINE_LOCATION:
                boolean allow = false;
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // user has allowed this permission
                    allow = true;
                }
                if (mGeolocationCallback != null) {
                    // call back to web chrome client
                    mGeolocationCallback.invoke(mGeolocationOrigin, allow, false);
                }
                break;
        }
    }
}

但有一些错误:

  1. 错误:(67,66)错误:找不到符号类非空

任何帮助和建议的另一种方法将非常感激。

共有1个答案

祖麻雀
2023-03-14

您需要导入nonNull注释。

添加import javax。注释。非空对于你的导入,你可以在类的顶部找到它们
您的类可能在一个包中,您需要在GeoWebChromeClient类中声明该包。请注意,您有一行包com。实例网络视图 位于GeoWebViewActivity类的顶部,指示该类位于内/com/example/webview。如果不再是内部类,则需要在GeoWebChromeClient中使用类似的包行。

 类似资料:
  • 我使用GoogleAPI php客户端库访问网站管理员工具数据。当我想列出网站地图时,它出现了致命错误:未捕获的异常“Google\u Service\u exception”(403)用户没有足够的网站权限。另见:https://support.google.com/webmasters/answer/2451999.'我将服务帐户电子邮件地址添加为我网站的限制用户,但错误仍然存在。 最后我找到

  • 问题内容: 我正在寻找良好的PHP地理位置服务,因此当我启动我的应用程序时,我可能会遇到类似以下情况: 以纬度和经度值检索用户的位置。 问题答案: 地理定位将需要在浏览器中完成,因为服务器(即PHP)将永远无法找到大部分相关数据。在浏览器中进行地理定位的主要API是Google的API,但是作为开发人员,您无需使用该API。您将使用标准化的浏览器API(尽管目前仅少数浏览器支持)。 对于在服务器端

  • 我们的对象存储前面有一个nginx,用于缓存大型对象。对象的大小可达100GB。nginx缓存最大大小设置为约3.5TB。 当大对象请求激增且磁盘很快填满时,nginx会遇到磁盘空间不足错误。我期望缓存管理器根据LRU清除项目,并为新元素腾出空间,但这并没有发生。 我可以用一个简单的测试用例重现这个问题: 配置: 代理缓存路径/tmp/缓存级别=1:2键缓存区域=256m非活动=2d最大大小=16

  • Jenkins2.176.4-3轧制 Gradle 4.3.1 问题领域:给定单个Gradle任务的并行运行(或者它可以是任何简单的操作),尤其是在运行基于Jenkinsfile的管道的并发运行时 突然间,我在Jenkins日志页面中发现了这个错误,以前从未见过这个错误(在Jenkins中也没有发现这个错误的stackoverflow帖子)。 错误:java。lang.IllegalArgumen

  • 问题内容: 我正在尝试使用RestTemplate这样执行URL- 但是每次我遇到这样的错误- 我在做什么错以及如何解决? 更新:- 我也尝试过使用该网址,但它对我没有用。我刚刚更换用 更新2 这是代码- 错误是- 问题答案: 似乎没有办法忽略它。而是根据您的值生成一个(不使用double )。 并使用需要使用的重载方法。

  • 我目前正在尝试创建带有python文件和大量额外软件包的docker映像。txt。 当我运行命令“sudo docker build-t XXX”时软件包被一个接一个地下载和安装,直到我收到一个错误:“由于环境错误,无法安装软件包:[Errno 28]设备上没有剩余空间” 我已经做了“sudo docker system prune”的原子选项,所有过去的docker镜像都被删除了。 此外,“su