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,
WebView处理网页位置请求
技术小黑屋 发表于 2014年10月01日 17:23 | Hits: 3082
随着移动设备的激增,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> |
示例阐述
- 检测getLocation方法是否可用
- 如果可以调用getCurrentPosition方法,否则提示浏览器不支持
- 如果getCurrentPosition获取信息成功,返回一个坐标系的对象,并将这个对象作为参数传递到showPosition方法,如果失败,调用showError方法,并将错误码作为showError方法的参数。
- showPosition方法展示经度和纬度信息
- showError方法用来处理请求错误
上述部分参考自html5_geolocation w3cschool,更多高级操作请访问左侧链接。
WebView如何返回给网页
大致操作步骤
- 在manifest中申请android.permission.ACCESS_FINE_LOCATION 或 android.permission.ACCESS_COARSE_LOCATION 权限。两者都有更好。
- 设置webivew开启javascript功能,地理定位功能,设置物理定位数据库路径
- 在onGeolocationPermissionsShowPrompt处理物理位置请求,常用的是提示用户,让用户决定是否允许。
使用的API
- android.permission.ACCESS_FINE_LOCATION 通过GPS,基站,Wifi等获取精确的 位置信息。
- android.permission.ACCESS_COARSE_LOCATION 通过基站,Wifi等获取错略的 位置信息。
- onGeolocationPermissionsShowPrompt 位置信息请求回调,通常在这里弹出选择是否赋予权限的对话框
- GeolocationPermissions.Callback.invoke(String origin, boolean allow, boolean remember)决定是否真正提供给网页信息,可根据用户的选择结果选择处理。
实现代码
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"); |
疑问解答
I/SqliteDatabaseCpp(21863): sqlite returned: error code = 14
原因是你没有设置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,
- android webview 获取Geolocation
-
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);
}
}
- 5,
-
Android WebView 开发详解(二)
2014-10-17 18:02 22236人阅读 评论(15) 收藏 举报
分类:
Android(21) 客户端(11)
版权声明:本文为博主原创文章,未经博主允许不得转载。
转载请注明出处 http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao
概览:
Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情。比如说客户端 需要显示网页加载的进度、网页加载发生错误等等事件。 WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处 理。WebViewClient 主要提供网页加载各个阶段的通知,比如网页开始加载onPageStarted,网页结束加载onPageFinished 等;WebChromeClient主要提供网页加载过程中提供的数据内容,比如返回网页的title,favicon等。
1.WebViewClient的基本使用
创建WebViewClient实例并设置到WebView对象中,具体代码参考如下:
[java] view plaincopy
- class MyAndroidWebViewClient extends WebViewClient {
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- // TODO
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- // TODO
- }
[java] view plaincopy
- }
- webview.setWebViewClient(new MyAndroidWebViewClient ());
2.WebViewClient API详解
1)网页加载时机部分
[java] view plaincopy
- public boolean shouldOverrideUrlLoading(WebView view, String url)
当加载的网页需要重定向的时候就会回调这个函数告知我们应用程序是否需要接管控制网页加载,如果应用程序接管,并且return true意味着主程序接管网页加载,如果返回false让webview自己处理。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 即将要被加载的url
@return true 当前应用程序要自己处理这个url, 返回false则不处理。
Tips
(1) 当请求的方式是"POST"方式时这个回调是不会通知的。
(2) 当我们访问的地址需要我们应用程序自己处理的时候,可以在这里截获,比如我们发现跳转到的是一个market的链接,那么我们可以直接跳转到应用市场,或者其他app。
[java] view plaincopy
- public void onPageStarted(WebView view, String url, Bitmap favicon)
当
内核开始加载访问的url时,会通知应用程序,对每个main frame这个函数只会被调用一次,页面包含iframe 或者framesets
不会另外调用一次onPageStarted,当网页内内嵌的frame 发生改变时也不会调用onPageStarted。参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 即将要被加载的url
@param favicon 如果这个favicon已经存储在本地数据库中,则会返回这个网页的favicon,否则返回为null。
Tips:
(1) iframe 可能不少人不知道什么含义,这里我解释下,iframe 我们加载的一张,下面有很多链接,我们随便点击一个链接是即当前host的一个iframe.
(2) 有个问题可能是开发者困惑的,onPageStarted和shouldOverrideUrlLoading 在网页加载过程中这两个函数到底哪个先被调用。
当我们通过loadUrl的方式重新加载一个网址时候,这时候会先调用onPageStarted再调用
shouldOverrideUrlLoading,当我们在打开的这个网址点击一个link,这时候会先调用
shouldOverrideUrlLoading
再调用onPageStarted。不过shouldOverrideUrlLoading不一定每次都被调用,只有需要的时候才会被调用。[java] view plaincopy
- public void onPageFinished(WebView view, String url)
当内核加载完当前页面时会通知我们的应用程序,这个函数只有在main frame情况下才会被调用,当调用这个函数之后,渲染的图片不会被更新,如果需要获得新图片的通知可以使用@link WebView.PictureListener#onNewPicture。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 即将要被加载的url
[java] view plaincopy
- public void onLoadResource(WebView view, String url)
通知应用程序WebView即将加载url 制定的资源
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 即将加载的url 资源
[java] view plaincopy
- public WebResourceResponse shouldInterceptRequest(WebView view,
- String url)
通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url raw url 制定的资源
@return 返回WebResourceResponse包含数据对象,或者返回null
Tips
这个回调并不一定在UI线程执行,所以我们需要注意在这里操作View或者私有数据相关的动作。
如果我们需要改变网页的背景,或者需要实现网页页面颜色定制化的需求,可以在这个回调时机处理。
[java] view plaincopy
- public void onReceivedError(WebView view, int errorCode,
- String description, String failingUrl)
当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param errorCode 错误号可以在WebViewClient.ERROR_* 里面找到对应的错误名称。
@param description 描述错误的信息
@param failingUrl 当前访问失败的url,注意并不一定是我们主url
Tips
在onReceiveError我们可以自定义网页的错误页面。
[java] view plaincopy
- public void onFormResubmission(WebView view, Message dontResend,
- Message resend)
如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param dontResent 当浏览器不需要重新发送数据时,可以使用这个参数。
@param resent 当浏览器需要重新发送数据时, 可以使用这个参数。
[java] view plaincopy
- public void doUpdateVisitedHistory(WebView view, String url,
- boolean isReload)
通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 当前正在访问的url
@ param isReload 如果是true 这个是正在被reload的url
[java] view plaincopy
- public void onReceivedSslError(WebView view, SslErrorHandler handler,
- SslError error)
当网页加载资源过程中发现SSL错误会调用此方法。我们应用程序必须做出响应,是取消请求handler.cancel(),还是继续请求handler.proceed();内核的默认行为是handler.cancel();
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param handler 处理用户请求的对象。
@param error SSL错误对象
Tips
内核会记住本次选择,如果下次还有相同的错误,内核会直接执行之前选择的结果。
[java] view plaincopy
- public void onReceivedHttpAuthRequest(WebView view,
- HttpAuthHandler handler, String host, String realm)
通知应用程序WebView接收到了一个Http auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param handler 用来响应WebView请求的对象
@param host 请求认证的host
@param realm 认真请求所在的域
[java] view plaincopy
- public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)
提供应用程序同步一个处理按键事件的机会,菜单快捷键需要被过滤掉。如果返回true,webview不处理该事件,如果返回false, webview会一直处理这个事件,因此在view 链上没有一个父类可以响应到这个事件。默认行为是return false;
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param event 键盘事件名
@return 如果返回true,应用程序处理该时间,返回false 交有webview处理。
[java] view plaincopy
- public void onScaleChanged(WebView view, float oldScale, float newScale)
通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。
[java] view plaincopy
- public void onReceivedLoginRequest(WebView view, String realm,
- String account, String args)
通知应用程序有个自动登录的帐号过程
参数说明:
@param view 请求登陆的webview
@param realm 账户的域名,用来查找账户。
@param account 一个可选的账户,如果是null 需要和本地的账户进行check, 如果是一个可用的账户,则提供登录。
@param args 验证制定参数的登录用户
3.WebChromeClient 基本使用
4. WebChromeClient API详解
创建WebChromeClient实例并设置到WebView对象中,具体代码参考如下:
[java] view plaincopy
- public void onProgressChanged(WebView view, int newProgress)
通知应用程序当前网页加载的进度。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
[java] view plaincopy
- public void onReceivedTitle(WebView view, String title)
当document 的title变化时,会通知应用程序
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param title document新的title
Tips
这个函数调用时机不确定,有可能很早,有可能很晚,取决于网页把title设置在什么位置,大多数网页一般把title设置到页面的前面,因此很多情况会比较早回调到这个函数。
[java] view plaincopy
- public void onReceivedIcon(WebView view, Bitmap icon)
当前页面有个新的favicon时候,会回调这个函数。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param icon 当前页面的favicon
[java] view plaincopy
- public void onReceivedTouchIconUrl(WebView view, String url,
- boolean precomposed)
通知应用程序 apple-touch-icon的 url
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url apple-touch-icon 的服务端地址
@param precomposed 如果precomposed 是true 则touch-icon是预先创建的
Tips
如果应用程序需要这个icon的话, 可以通过这个url获取得到 icon。
[java] view plaincopy
- public void onShowCustomView(View view, CustomViewCallback callback)
通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。
参数说明:
@param view 即将要显示的view
@param callback 当view 需要dismiss 则使用这个对象进行回调通知。
[java] view plaincopy
- public void onHideCustomView()
退出视频通知
[java] view plaincopy
- public boolean onCreateWindow(WebView view, boolean isDialog,
- boolean isUserGesture, Message resultMsg)
请求创建一个新的窗口,如果我们应用程序接管这个请求,必须返回true,并且创建一个新的webview来承载主窗口。
如果应用程序不处理,则需要返回false,默认行为和返回false表现一样。
参数说明:
@param view 请求创建新窗口的webview
@param isUserGesture 如果是true,则说明是来自用户收拾操作行为,比如用户点击链接
@param isDialog true 请求创建的新窗口必须是个dialog,而不是全屏的窗口。
@param resultMsg 当webview创建时需要发送一个消息。WebView.WebViewTransport.setWebView(WebView)
Tips 具体例子如下:
[java] view plaincopy
- private void createWindow(final Message msg) {
- WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;
- final Tab newTab = mWebViewController.openTab(null, Tab.this, true,
- true);
- transport.setWebView(newTab.getWebView());
- msg.sendToTarget();
- }
[java] view plaincopy
- public void onRequestFocus(WebView view)
webview请求得到focus,发生这个主要是当前webview不是前台状态,是后台webview。
[java] view plaincopy
- public void onCloseWindow(WebView window)
通知应用程序从关闭传递过来的webview并从view tree中remove。
[java] view plaincopy
- public boolean onJsAlert(WebView view, String url, String message,
- JsResult result)
通知应用程序显示javascript alert对话框,如果应用程序返回true内核认为应用程序处理这个消息,返回false,内核自己处理。
参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。
@param url 当前请求弹出javascript 对话框webview 加载的url地址。@param message 弹出的内容信息
@result 用来响应用户的处理。
Tips
如果我们应用接管处理, 则必须给出result的结果,result.cancel,result.comfirm必须调用其中之后,否则内核会hang住。
[java] view plaincopy
- public boolean onJsConfirm(WebView view, String url, String message,
- JsResult result)
通知应用程序提供confirm 对话框。
参数说明同上onJsAlert
[java] view plaincopy
- public boolean onJsPrompt(WebView view, String url, String message,
- String defaultValue, JsPromptResult result)
通知应用程序显示一个prompt对话框。
Tips
必须调用result.confirm 方法如果应用程序接管这个方法。
[java] view plaincopy
- public boolean onJsBeforeUnload(WebView view, String url, String message,
- JsResult result)
通知应用程序显示一个对话框,让用户选择是否离开当前页面,这个回调是javascript中的onbeforeunload事件,如果客户端返回true,内核会认为客户端提供对话框。默认行为是return false。
参数说明和之前介绍的onJsAlert()相同。
[java] view plaincopy
- public void onExceededDatabaseQuota(String url, String databaseIdentifier,
- long quota, long estimatedDatabaseSize, long totalQuota,
- WebStorage.QuotaUpdater quotaUpdater)
通知应用程序webview内核web sql 数据库超出配额,请求是否扩大数据库磁盘配额。默认行为是不会增加数据库配额。
参数说明:
@param url 触发这个数据库配额的url地址
@param databaseIdentifier 指示出现数据库超过配额的标识。
@param quota 原始数据库配额的大小,是字节单位bytes
@param estimatedDatabaseSize 到达底线的数据大小 bytes
@param totalQuota 总的数据库配额大小 bytes
@param quotaUpdater 更新数据库配额的对象,可以使用 quotaUpdater.updateQuota(newQuota);配置新的数据库配额大小。
[java] view plaincopy
- public void onReachedMaxAppCacheSize(long requiredStorage, long quota,
- WebStorage.QuotaUpdater quotaUpdater)
通知应用程序内核已经到达最大的appcache。
appcache是HTML5针对offline的一个数据处理标准。
[java] view plaincopy
- public void onGeolocationPermissionsShowPrompt(String origin,
- GeolocationPermissions.Callback callback)
当前页面请求是否允许进行定位。
GeolocationPermissions.Callback的使用
public void invoke(String origin, boolean allow, boolean retain);
参数说明:
@param origin 权限设置的源地址
@param allow 是否允许定位
@retain 当前的选择是否让内核记住。
[java] view plaincopy
- public void onGeolocationPermissionsHidePrompt()
[java] view plaincopy
- public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)
这个回调是私有回调, 当页面需要请求打开系统的文件选择器,则会回调这个方法,比如我们需要上传图片,请求拍照,邮件的附件上传等等操作。
如果不实现这个私有API,则上面的请求都将不会执行。
有问题欢迎讨论。
6,
android: 如何开启webview的LBS功能
标签: androidcallbackstringurlbrowserdialog
2011-07-22 17:00 3411人阅读 评论(0) 收藏 举报
版权声明:本文为博主原创文章,未经博主允许不得转载。
不做过多解释代码全贴在下面。
首先想要用到手机的LBS功能,必须在androidManifest.xml中请求权限.
[html] view plaincopy
- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
webview加载URL以及相关设置
[html] view plaincopy
- private void loadUrl(){
- browser.getSettings().setJavaScriptEnabled(true);
- browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
- browser.getSettings().setGeolocationEnabled(true);
- GeoClient geo = new GeoClient();
- browser.setWebViewClient(new PTCWebViewClient(this, browser));
- browser.setWebChromeClient(geo);
- String origin = "";
- geo.onGeolocationPermissionsShowPrompt(origin, this);
- browser.loadUrl("http://www.mytransport.sg");
- }
PTCWebViewClient.java
[java] view plaincopy
- public class PTCWebViewClient extends WebViewClient {
- private ProgressDialog pd;
- public PTCWebViewClient(Context con, final WebView web){
- pd = new ProgressDialog(con);
- pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
- pd.setTitle("MTC LTA");
- pd.setMessage("Loading, please wait...");
- pd.setIcon(R.drawable.icon);
- pd.setButton("Cancel", new ProgressDialog.OnClickListener(){
- @Override
- public void onClick(DialogInterface dialog, int which) {
- web.stopLoading();
- }
- });
- pd.setIndeterminate(false);
- pd.setCancelable(true);
- }
- @Override
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- view.loadUrl(url);
- return true;
- }
- @Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- super.onPageStarted(view, url, favicon);
- pd.show();
- }
- @Override
- public void onPageFinished(WebView view, String url) {
- super.onPageFinished(view, url);
- pd.dismiss();
- }
- }
GeoClient.java
[java] view plaincopy
- class GeoClient extends WebChromeClient {
- @Override
- public void onGeolocationPermissionsShowPrompt(String origin,
- Callback callback) {
- super.onGeolocationPermissionsShowPrompt(origin, callback);
- callback.invoke(origin, true, false);
- }
- }
我有一个网页的 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" />
解决方法 1:
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();