标签:
1,
// @Override
// public void onGeolocationPermissionsShowPrompt(final String origin,
// final GeolocationPermissions.Callback callback) {
// AlertDialog.Builder builder = new AlertDialog.Builder(Vkpedia.this);
// builder.setMessage("Allow to access location information?");
// OnClickListener dialogButtonOnClickListener = new OnClickListener() {
//
// public void onClick(DialogInterface dialog, int clickedButton) {
// if (DialogInterface.BUTTON_POSITIVE == clickedButton) {
// callback.invoke(origin, true, true);
// } else if (DialogInterface.BUTTON_NEGATIVE == clickedButton) {
// callback.invoke(origin, false, false);
// }
// }
//
// @Override
// public void onClick(View v) {
// // TODO Auto-generated method stub
//
// }
// };
// builder.setPositiveButton("Allow", (android.content.DialogInterface.OnClickListener) dialogButtonOnClickListener);
// builder.setNegativeButton("Deny", (android.content.DialogInterface.OnClickListener) dialogButtonOnClickListener);
// builder.show();
// super.onGeolocationPermissionsShowPrompt(origin, callback);
// Log.i("onGeolocationPermissionsShowPrompt", "onGeolocationPermissionsShowPrompt");
// }
2,
// @Override
// public void onGeolocationPermissionsShowPrompt(String origin,
// GeolocationPermissions.Callback callback) {
// super.onGeolocationPermissionsShowPrompt(origin, callback);
// callback.invoke(origin, true, false);
// }
3,
随着移动设备的激增,LBS(Location Based Service)已然成为趋势,其最关键的还是获取设备的位置信息。native代码获取位置信息轻轻松松可以搞定,实际上网页获取位置信息也不是那么困难。
在HTML5中,提供了一套定位用户信息的接口,当然这个位置信息是通过客户端,准确说是浏览器获取的。
注意,位置信息属于个人隐私的范围,只有经过用户同意之后才能获取到信息。
使用getCurrentPosition()方法来请求位置信息。
下面是一个很简单的示例,来展示用户位置信息的经度和纬度。
lineos:false
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 36 37 38 39 40 41 42 |
<!DOCTYPE html>
<html>
<body>
<p id="demo">Click the button to get your coordinates:</p>
<button onclick="getLocation()">Try It</button>
<script>
var x = document.getElementById("demo");
function getLocation() {
console.info("getLocation working")
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition,showError);
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}
function showPosition(position) {
x.innerHTML="Latitude: " + position.coords.latitude + "<br>Longitude: " + position.coords.longitude;
}
function showError(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
x.innerHTML = "User denied the request for Geolocation."
break;
case error.POSITION_UNAVAILABLE:
x.innerHTML = "Location information is unavailable."
break;
case error.TIMEOUT:
x.innerHTML = "The request to get user location timed out."
break;
case error.UNKNOWN_ERROR:
x.innerHTML = "An unknown error occurred."
break;
}
}
</script>
</body>
</html>
|
上述部分参考自html5_geolocation w3cschool,更多高级操作请访问左侧链接。
lineos:false
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 36 37 38 |
final WebView webView = new WebView(this);
addContentView(webView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) );
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setGeolocationEnabled(true);
settings.setGeolocationDatabasePath(getFilesDir().getPath());
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onGeolocationPermissionsHidePrompt() {
super.onGeolocationPermissionsHidePrompt();
Log.i(LOGTAG, "onGeolocationPermissionsHidePrompt");
}
@Override
public void onGeolocationPermissionsShowPrompt(final String origin,
final Callback callback) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setMessage("Allow to access location information?");
OnClickListener dialogButtonOnClickListener = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int clickedButton) {
if (DialogInterface.BUTTON_POSITIVE == clickedButton) {
callback.invoke(origin, true, true);
} else if (DialogInterface.BUTTON_NEGATIVE == clickedButton) {
callback.invoke(origin, false, false);
}
}
};
builder.setPositiveButton("Allow", dialogButtonOnClickListener);
builder.setNegativeButton("Deny", dialogButtonOnClickListener);
builder.show();
super.onGeolocationPermissionsShowPrompt(origin, callback);
Log.i(LOGTAG, "onGeolocationPermissionsShowPrompt");
}
});
webView.loadUrl("file:///android_asset/geolocation.html");
|
原因是你没有设置setGeolocationDatabasePath,按照上面例子设置即可。
当GPS_PROVIDER和NETWORK_PROVIDER有一者可用,定位服务就可以用,当两者都不能用时,即定位服务不可以用。
注意PASSIVE_PROVIDER不能作为定位服务可用的标志。因为这个provider只会返回其他Provider提供的位置信息,自己无法定位。
lineos:false
1 2 3 4 5 6 7 |
private void testGeolocationOK() {
LocationManager manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
boolean gpsProviderOK = manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean networkProviderOK = manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
boolean geolocationOK = gpsProviderOK && networkProviderOK;
Log.i(LOGTAG, "gpsProviderOK = " + gpsProviderOK + "; networkProviderOK = " + networkProviderOK + "; geoLocationOK=" + geolocationOK);
}
|
我们只需要发送一个简单的隐式intent即可启动位置设置界面
lineos:false
1 2 |
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); |
4,
private WebViewwebView = null;
private WebSettingswebSettings = null;
private void initWeb() {
webView = (WebView)this.findViewById(R.id.webView_load);
webView.getSettings().setJavaScriptEnabled(true);
loadURL(urlStr);
setClient();
webSettings =webView.getSettings();// 网页设置默认属性
webView.setInitialScale(39);// 适应竖屏
webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);// 去掉底部和右边的滚动条
// webSettings.setRenderPriority(RenderPriority.HIGH);// 提高渲染优先级
webSettings.setJavaScriptEnabled(true);// 设置是否可以交互Javascript
webSettings.setAllowFileAccess(true);// 启用或禁止WebView访问文件数据
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);// 设置显示模式
webSettings.setDefaultZoom(ZoomDensity.MEDIUM);// 适应屏幕
// webView.getSettings().setUseWideViewPort(true);// 是否任意比例缩放
webView.getSettings().setLoadWithOverviewMode(true);// 缩放至屏幕的大小
// webView.getSettings().setUseWideViewPort(true);// 是否任意比例缩放
webSettings.setBuiltInZoomControls(false);// 设置是否支持缩放
// webSettings.setSupportZoom(false);// 设置是否支持变焦,仅支持双击缩放
webSettings.setNeedInitialFocus(false);// 设置是否可以访问文件
// webSettings.setBlockNetworkImage(true);// 加载图片放在最后加载渲染
// webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//
// 设置缓存模式
webSettings.setCacheMode(webSettings.LOAD_NO_CACHE);// 不使用缓存
webView.addJavascriptInterface(new Scan2(),"mMap"); // 这里的名称就是在页面window.fxl.testFunction()所取的别名
webView.addJavascriptInterface(new Scan2(),"phone"); // 这里的名称就是在页面window.fxl.testFunction()所取的别名
//关键setGeolocationEnabled
webView.getSettings().setGeolocationEnabled(true);
}
private void setClient() {
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onGeolocationPermissionsShowPrompt(String origin,
android.webkit.GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
super.onGeolocationPermissionsShowPrompt(origin, callback);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情。比如说客户端 需要显示网页加载的进度、网页加载发生错误等等事件。 WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处 理。WebViewClient 主要提供网页加载各个阶段的通知,比如网页开始加载onPageStarted,网页结束加载onPageFinished 等;WebChromeClient主要提供网页加载过程中提供的数据内容,比如返回网页的title,favicon等。
版权声明:本文为博主原创文章,未经博主允许不得转载。
不做过多解释代码全贴在下面。
首先想要用到手机的LBS功能,必须在androidManifest.xml中请求权限.
PTCWebViewClient.java
我有一个网页的 WatchPosition 调用,在普通浏览器中工作正常。然而, dialog 从来没有请求 GPS 的权限显示当网页加载从 WebView 与 WebChromeClient 和 onGeolocationPermissionsShowPrompt 永远不会调用。
public class GeoWebChromeClient extends WebChromeClient {
public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
Log.d("geolocation permission", "permission >>>"+origin);
callback.invoke(origin, true, false);
}
}
public class GeoWebViewClient extends WebViewClient {
@Override
public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// When user clicks a hyperlink, load in the existing WebView
view.loadUrl(url);
return true;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView Browser = (WebView) findViewById(R.id.Browser);
WebSettings webSettings = Browser.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setAppCacheEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setGeolocationEnabled(true);
Browser.setWebViewClient(new GeoWebViewClient());
Browser.setWebChromeClient(new GeoWebChromeClient());
Browser.loadUrl("http://192.168.1.102/");
}
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<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_FINE_LOCATION" />
onGeolocationShowPrompt 实际上并不显示提示本身,它是只是获取页面请求你地理位置时调用的方法。你会需要创建您自己提示用户喜欢如下所示 (放在里面的 onGeolocatioonShowPrompt 方法):
final boolean remember = true;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Locations");
builder.setMessage(origin + " Would like to use your Current Location").setCancelable(true).setPositiveButton("Allow",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int id) {
// origin, allow, remember
callback.invoke(origin, true, remember);
}
})
.setNegativeButton("Don‘t Allow",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int id) {
// origin, allow, remember
callback.invoke(origin, false, remember);
}
});
AlertDialog alert = builder.create();
alert.show();
标签:
原文地址:http://www.cnblogs.com/augustone/p/5134509.html