背景:
最近项目中需要在APP中增加一个定位签到的功能。实现方式是通过WebView 加载一个网页,网页中集成了百度地图的定位功能。
问题描述:
定位功能在IOS上面是可以的,在Android机器上定位却是不行。
解决过程:
首先,Android WebView的基本 settings 等各种常规设置,都是有的,网上一大堆。这里列下我的:
private void webViewSettings() {
final WebSettings webSettings = contentWebView.getSettings();
//webview支持js脚本
webSettings.setJavaScriptEnabled(true);
//启用数据库
webSettings.setDatabaseEnabled(true);
//设置定位的数据库路径
String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
webSettings.setGeolocationDatabasePath(dir);
//启用地理定位
webSettings.setGeolocationEnabled(true);
//开启DomStorage缓存
webSettings.setDomStorageEnabled(true);
webSettings.setBlockNetworkImage(true);
//配置权限
contentWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
webSettings.setBlockNetworkImage(true);
} else {
}
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
});
contentWebView.loadUrl("");
}
2、Android6.0以后需要动态获取权限,以及回调
private void checkPermission() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(), "没有权限,请手动开启定位权限", Toast.LENGTH_SHORT).show();
// 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
} else {
webViewSettings();
}
}
//回调
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
//requestCode即所声明的权限获取码,在checkSelfPermission时传入
case 100:
BAIDU_READ_PHONE_STATE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//获取到权限,做相应处理
//调用定位SDK应确保相关权限均被授权,否则会引起定位失败
webViewSettings();
} else {
//没有获取到权限,做特殊处理
}
break;
default:
break;
}
}
3、清单文件中的主要权限设置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<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_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
---------------------------------------分割线----------------------------------问题来了-------------------------------
上面这三步处理完之后,按道理讲,应该可以了,但是,实际上,在Android -APP上 定位还是不准确的。查阅各类文章,发现是
//开启DomStorage缓存 webSettings.setDomStorageEnabled(true); //这个地方出的问题
必须在应用的build.gradle 里面设置:
targetSdkVersion 23
重新编译,之后,发现可以定位了。
到这里,还不算完,发现在一些华为手机下,启动应用,老是在最下面提示“全屏显示” 太膈应人 了。
解决方式,在AndroidManifest.xml中的Application节点下添加 如下代码:
<meta-data android:name="android.max_aspect" android:value="2.4" />
到这里 才算基本上解决了由于WebView加载百度定位的HTML出现的一系列问题。
此事告一段落。