android H5无法定位问题

在实际项目中遇到的问题,webview加载h5页面,h5页面使用的是navigator.geolocation.getCurrentPosition方法获取位置信息,在android 4.4设备上能够正常定位,但是在android 7.0设备上无任何响应.将解决的过程大体做个记录~~~

前端定位代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 通过浏览器获取定位
*/
function getGPS() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
longitude = position.coords.longitude;
latitude = position.coords.latitude;
convert2amap(longitude, latitude, "");
}, onError);
} else {
alert("提示:您的客户端不支持获取定位信息,请升级或联系管理员!");
}
}
function onError(error) {
switch (error.code) {
case 1:
alert("位置服务被拒绝");
break;
case 2:
handleH5ForIOS10();
// alert("暂时获取不到位置信息");
break;
case 3:
alert("获取信息超时");
break;
case 4:
alert("未知错误");
break;
default:
alert(JSON.stringify(error));
break;
}
}

配置权限

1
2
3
<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_GPS" />

在 WebChromeClient 中实现的方法

1
2
3
4
5
public void onGeolocationPermissionsShowPrompt(final String origin, final Callback callback) {
//一般会向用户给出一个请求定位权限的弹窗。第二个 boolean 类型的参数表示是否授予网页定位权限;而第三个 boolean 类型的参数则表示是否保留这个权限状态
callback.invoke(origin, true, true);
super.onGeolocationPermissionsShowPrompt(origin, callback);
}

webview设置

1
2
3
4
5
6
7
String databasePath = getContext().getApplicationContext()
.getDir("database", Context.MODE_PRIVATE).getPath();
settings.setDatabaseEnabled(true);
settings.setDatabasePath(databasePath);
settings.setGeolocationDatabasePath(databasePath);
settings.setDomStorageEnabled(true);
settings.setGeolocationEnabled(true);

log

1
I/test: http://xx.xx.xx.xx:8088/app/attendance/js/sign_ec.js?201801311435: Line 153 : getCurrentPosition() and watchPosition() no longer work on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details.

其实log中已经明确给出了参考信息,访问Chromium Projects,获取到最关键的信息:就是需要页面支持https的访问(http不安全).在配置了https以后,问题得到解决!
备注: android 6.0 以后,需要动态的获取位置或者存储权限,代码就不贴出来了~~,需要的自行处理.

0%