在 Android Webview 的 navigator.geolocation.getCurrentPosition() 中出现“位置信息不可用”错误

Posted

技术标签:

【中文标题】在 Android Webview 的 navigator.geolocation.getCurrentPosition() 中出现“位置信息不可用”错误【英文标题】:Getting "Location information is Unavailable" error in navigator.geolocation.getCurrentPosition() in Android Webview 【发布时间】:2020-01-17 11:24:12 【问题描述】:

我目前正在使用 android studio 为 android 构建一个 webview 应用程序。我试图在 webview 中包装的网站实现了一个简单的地理定位系统,该系统跟踪用户的当前位置并存储纬度和经度。

我能够在桌面浏览器和移动浏览器中获得所需的结果,但不能在 webview 中获得。我在其他论坛上尝试了一些解决方案,但似乎没有任何解决方案。

我也试过this。我尝试了解决方案,但没有成功。

该项目是在 AngularJS 1.4.8 中构建的。我没有使用任何像 ionic 或 framework7 这样的框架。为了获取位置,我使用了 html5 Geolocation。

获取当前位置的我的 AngularJS 代码(在浏览器中运行良好):

$scope.getLocation = function () 
        if(navigator.geolocation)
                navigator.geolocation.getCurrentPosition(showPosition, showError);
                //alert("work");

             else  
                x.innerHTML = "Geolocation is not supported by this browser.";
                alert("Geolocation is not supported by this browser");
            
        

         function showPosition(position) 
            alert("position");
               var latitude_val ,longitude_val ;
               latitude_val = position.coords.latitude ;
               longitude_val = position.coords.longitude ;
               alert("lat"+latitude_val + "lon"+longitude_val)
            

            function showError(error) 
                var error;
                switch(error.code) 
                    case error.PERMISSION_DENIED:
                    error = "User denied the request for Geolocation."
                    break;
                    case error.POSITION_UNAVAILABLE:
                    error = "Location information is unavailable."
                    break;
                    case error.TIMEOUT:
                    error = "The request to get user location timed out."
                    break;
                    case error.UNKNOWN_ERROR:
                    error = "An unknown error occurred."
                    break;
                

                alert(error);
            

Android Studio 代码 (MainAcivity.java)

public class MainActivity extends AppCompatActivity 

private WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    setContentView(R.layout.activity_main);

    webView =(WebView)findViewById(R.id.webview);
    webView.setWebViewClient(new WebViewClient());

    WebSettings webSettings = webView.getSettings();

    webView.getSettings().setjavascriptEnabled(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setGeolocationEnabled(true);
    webView.getSettings().setGeolocationDatabasePath( getFilesDir().getPath() );

    // HTML5 API flags
    webView.getSettings().setAppCacheEnabled(true);
    webView.getSettings().setDatabaseEnabled(true);
    webView.getSettings().setDomStorageEnabled(true);


    webView.setWebChromeClient(new WebChromeClient() 
        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) 
            callback.invoke(origin, true, false);
        
    );



    webView.loadUrl("https://my.url");




@Override
public void onBackPressed() 
    if (webView.canGoBack()) 
        webView.goBack();
    
    else 
        super.onBackPressed();
    

Android 清单权限

<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" />

似乎位置参数总是为空,但我不知道为什么。

【问题讨论】:

你需要在运行时请求权限.. 你能告诉我怎么做吗?我真的被困在这里了...... 勾选这个问题,并添加您的应用所需的所有权限。***.com/questions/30549561/… 还要检查这个以获得多个权限***.com/questions/34342816/… 成功了!非常感谢:) 【参考方案1】:

根据documentation,从 Android 6 (API 23) 或更高版本开始,您需要实现运行时权限。

这里有一些answers 可以帮助您,了解如何提供运行时权限。 如果你想同时请求多个权限,可以关注这些answers。

【讨论】:

以上是关于在 Android Webview 的 navigator.geolocation.getCurrentPosition() 中出现“位置信息不可用”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Webview 的 navigator.geolocation.getCurrentPosition() 中出现“位置信息不可用”错误

如何在 Android WebView 中允许访问相机

有没有办法使用 webview.goBack 和 navigation.goBack 在反应原生 webview 中使用相同的按钮?

MUXC:Navigation 中是不是不支持 WebView

Xamarin。 WebView Progres

混合 WebView 导航和导航事件在 Xamarin 表单中没有响应