在 Android Webview 的 navigator.geolocation.getCurrentPosition() 中出现 "Location information is Unavailable" 错误
Getting "Location information is Unavailable" error in navigator.geolocation.getCurrentPosition() in Android Webview
我目前正在使用 android studio 为 android 构建一个 webview 应用程序。我试图在 webview 中包装的网站实现了一个简单的地理定位系统,该系统跟踪用户的当前位置并存储纬度和经度。
我能够在桌面浏览器和移动浏览器中获得所需的结果,但在 webview 中无法获得。我在其他论坛上尝试了一些解决方案,但似乎没有任何解决办法。
我也试过。我尝试了解决方案,但没有用。
该项目是在 AngularJS 1.4.8 中构建的。我没有使用任何框架,如 ionic 或 framework7。为了获取位置,我使用了 HTML5 地理定位。
我的 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 工作室代码 (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" />
位置参数似乎总是空的,但我不明白为什么。
根据 documentation,从 Android 6 (API 23) 或更高版本开始,您需要实施 运行 时间权限。
这里有一些 可以帮助您,以及如何提供 运行 时间许可。
如果你想同时请求多个权限,可以按照这些.
我目前正在使用 android studio 为 android 构建一个 webview 应用程序。我试图在 webview 中包装的网站实现了一个简单的地理定位系统,该系统跟踪用户的当前位置并存储纬度和经度。
我能够在桌面浏览器和移动浏览器中获得所需的结果,但在 webview 中无法获得。我在其他论坛上尝试了一些解决方案,但似乎没有任何解决办法。
我也试过
该项目是在 AngularJS 1.4.8 中构建的。我没有使用任何框架,如 ionic 或 framework7。为了获取位置,我使用了 HTML5 地理定位。
我的 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 工作室代码 (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" />
位置参数似乎总是空的,但我不明白为什么。
根据 documentation,从 Android 6 (API 23) 或更高版本开始,您需要实施 运行 时间权限。
这里有一些