标签:
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