定位技术

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
2015-06-17      0个评论    来源:飞跃 Ni Wo Ta  
收藏    我要投稿

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

  1. class MyAndroidWebViewClient extends WebViewClient {
  2. @Override
  3. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  4. // TODO
  5. }
  6. @Override
  7. public void onPageFinished(WebView view, String url) {
  8. // TODO
  9. }

[java] view plaincopy

  1. }
  2. webview.setWebViewClient(new MyAndroidWebViewClient ());

2.WebViewClient API详解

1)网页加载时机部分

[java] view plaincopy

  1. 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

  1. 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

  1. 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

  1. public void onLoadResource(WebView view, String url)

通知应用程序WebView即将加载url 制定的资源

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param url    即将加载的url 资源

[java] view plaincopy

  1. public WebResourceResponse shouldInterceptRequest(WebView view,
  2. String url)

通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param url    raw url 制定的资源

@return 返回WebResourceResponse包含数据对象,或者返回null

Tips

这个回调并不一定在UI线程执行,所以我们需要注意在这里操作View或者私有数据相关的动作。

如果我们需要改变网页的背景,或者需要实现网页页面颜色定制化的需求,可以在这个回调时机处理。

[java] view plaincopy

  1. public void onReceivedError(WebView view, int errorCode,
  2. 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

  1. public void onFormResubmission(WebView view, Message dontResend,
  2. Message resend)

如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param dontResent 当浏览器不需要重新发送数据时,可以使用这个参数。

@param resent 当浏览器需要重新发送数据时, 可以使用这个参数。

[java] view plaincopy

  1. public void doUpdateVisitedHistory(WebView view, String url,
  2. boolean isReload)

通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param url 当前正在访问的url

@ param isReload 如果是true 这个是正在被reload的url

[java] view plaincopy

  1. public void onReceivedSslError(WebView view, SslErrorHandler handler,
  2. 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

  1. public void onReceivedHttpAuthRequest(WebView view,
  2. 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

  1. 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

  1. public void onScaleChanged(WebView view, float oldScale, float newScale)

通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。

[java] view plaincopy

  1. public void onReceivedLoginRequest(WebView view, String realm,
  2. 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

  1. public void onProgressChanged(WebView view, int newProgress)

通知应用程序当前网页加载的进度。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

[java] view plaincopy

  1. 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

  1. public void onReceivedIcon(WebView view, Bitmap icon)

当前页面有个新的favicon时候,会回调这个函数。

参数说明:

@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param icon 当前页面的favicon

[java] view plaincopy

  1. public void onReceivedTouchIconUrl(WebView view, String url,
  2. 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

  1. public void onShowCustomView(View view, CustomViewCallback callback)

通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。

参数说明:

@param view 即将要显示的view

@param callback  当view 需要dismiss 则使用这个对象进行回调通知。

[java] view plaincopy

  1. public void onHideCustomView()

退出视频通知

[java] view plaincopy

  1. public boolean onCreateWindow(WebView view, boolean isDialog,
  2. 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

  1. private void createWindow(final Message msg) {
  2. WebView.WebViewTransport transport = (WebView.WebViewTransport) msg.obj;
  3. final Tab newTab = mWebViewController.openTab(null, Tab.this, true,
  4. true);
  5. transport.setWebView(newTab.getWebView());
  6. msg.sendToTarget();
  7. }

[java] view plaincopy

  1. public void onRequestFocus(WebView view)

webview请求得到focus,发生这个主要是当前webview不是前台状态,是后台webview。

[java] view plaincopy

  1. public void onCloseWindow(WebView window)

通知应用程序从关闭传递过来的webview并从view tree中remove。

[java] view plaincopy

  1. public boolean onJsAlert(WebView view, String url, String message,
  2. 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

  1. public boolean onJsConfirm(WebView view, String url, String message,
  2. JsResult result)

通知应用程序提供confirm 对话框。

参数说明同上onJsAlert

[java] view plaincopy

  1. public boolean onJsPrompt(WebView view, String url, String message,
  2. String defaultValue, JsPromptResult result)

通知应用程序显示一个prompt对话框。

Tips

必须调用result.confirm 方法如果应用程序接管这个方法。

[java] view plaincopy

  1. public boolean onJsBeforeUnload(WebView view, String url, String message,
  2. JsResult result)

通知应用程序显示一个对话框,让用户选择是否离开当前页面,这个回调是javascript中的onbeforeunload事件,如果客户端返回true,内核会认为客户端提供对话框。默认行为是return false。

参数说明和之前介绍的onJsAlert()相同。

[java] view plaincopy

  1. public void onExceededDatabaseQuota(String url, String databaseIdentifier,
  2. long quota, long estimatedDatabaseSize, long totalQuota,
  3. 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

  1. public void onReachedMaxAppCacheSize(long requiredStorage, long quota,
  2. WebStorage.QuotaUpdater quotaUpdater)

通知应用程序内核已经到达最大的appcache。

appcache是HTML5针对offline的一个数据处理标准。

[java] view plaincopy

  1. public void onGeolocationPermissionsShowPrompt(String origin,
  2. GeolocationPermissions.Callback callback)

当前页面请求是否允许进行定位。

GeolocationPermissions.Callback的使用

public void invoke(String origin, boolean allow, boolean retain);

参数说明:

@param origin 权限设置的源地址

@param allow 是否允许定位

@retain 当前的选择是否让内核记住。

[java] view plaincopy

  1. public void onGeolocationPermissionsHidePrompt()

[java] view plaincopy

  1. 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

  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  2. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

webview加载URL以及相关设置

[html] view plaincopy

  1. private void loadUrl(){
  2. browser.getSettings().setJavaScriptEnabled(true);
  3. browser.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
  4. browser.getSettings().setGeolocationEnabled(true);
  5. GeoClient geo = new GeoClient();
  6. browser.setWebViewClient(new PTCWebViewClient(this, browser));
  7. browser.setWebChromeClient(geo);
  8. String origin = "";
  9. geo.onGeolocationPermissionsShowPrompt(origin, this);
  10. browser.loadUrl("http://www.mytransport.sg");
  11. }

PTCWebViewClient.java

[java] view plaincopy

  1. public class PTCWebViewClient extends WebViewClient {
  2. private ProgressDialog pd;
  3. public PTCWebViewClient(Context con, final WebView web){
  4. pd = new ProgressDialog(con);
  5. pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
  6. pd.setTitle("MTC LTA");
  7. pd.setMessage("Loading, please wait...");
  8. pd.setIcon(R.drawable.icon);
  9. pd.setButton("Cancel", new ProgressDialog.OnClickListener(){
  10. @Override
  11. public void onClick(DialogInterface dialog, int which) {
  12. web.stopLoading();
  13. }
  14. });
  15. pd.setIndeterminate(false);
  16. pd.setCancelable(true);
  17. }
  18. @Override
  19. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  20. view.loadUrl(url);
  21. return true;
  22. }
  23. @Override
  24. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  25. super.onPageStarted(view, url, favicon);
  26. pd.show();
  27. }
  28. @Override
  29. public void onPageFinished(WebView view, String url) {
  30. super.onPageFinished(view, url);
  31. pd.dismiss();
  32. }
  33. }

GeoClient.java

[java] view plaincopy

  1. class GeoClient extends WebChromeClient {
  2. @Override
  3. public void onGeolocationPermissionsShowPrompt(String origin,
  4. Callback callback) {
  5. super.onGeolocationPermissionsShowPrompt(origin, callback);
  6. callback.invoke(origin, true, false);
  7. }
  8. }

我有一个网页的 WatchPosition 调用,在普通浏览器中工作正常。然而, dialog 从来没有请求 GPS 的权限显示当网页加载从 WebViewWebChromeClient 和 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();
时间: 2024-10-27 06:57:11

定位技术的相关文章

基于 WiFi 的室内定位技术

系统的拓扑结构 基于信号强度的定位技术(RSSI) 无线信号的信号强度随着传播距离的增加而衰减,接收方与发送方离得越近, 则接收方的信号强度就越强:接收方离发送方越远,则接收到的信号强度就越弱. 根据移动终端测量接收到的信号强度和已知的无线信号衰落模型,可以估算出收发方之间的距离,根据多个估算的距离值,可以计算出移动终端的位置.在室内环境下,AP 的信号覆盖范围一般在100米的范围以内,无线信号在传输过程中,接收信号的功率强度与传输距离存在着某种变化关 系,找出特定环境中的变化关系,就可以应用于

URL锚点HTML定位技术机制

一.锚点是什么 锚点就等同于火影中的“飞雷神之术”,我们先看百科中锚点的解释: 使用命名锚记可以在文档中设置标记,这些标记通常放在文档的特定主题处或顶部.然后可以创建到这些命名锚记的链接,这些链接可快速将访问者带到指定位置.创建到命名锚记的链接的过程分为两步.首先,创建命名锚记,然后创建到该命名锚记的链接. 再看看“飞雷神之术”的解释: 日本动漫<火影忍者>中时空术的一种,S级.利用标记完成空间穿梭. 都是做标记,然后快速定位.说不定AB(岸本齐史)也是个网页制作爱好者哦! 其实,关于锚点,我

好好说一说室内定位技术

室内定位技术进过了几十年的发展,从未像今天这样引起大家的关注,这无疑得益于VR技术在这几年的蓬勃发展,52VR的编辑们今天就梳理下已有的定位技术和手段,有哪些点值得我们参考和注意呢? 那么传统的室内定位技术有哪些呢? 室内无线定位技术可以这样分成三类: 近邻法 三边(角)测量法 模式匹配法. 近邻法: 最简单的方式,直接选定那个信号强度最大的AP的位置.纠正一个很容易被误导的地方,目前大多数手机中的定位方式为(GPS/AGPS.基站定 位.WiFi定位),这里的WiFi定位并不是位置指纹法,而是

无线定位技术

实现室内地图定位导航,需要解决哪些技术难题? 2015-06-18 15:00:00 来源: 知乎每日精选 跟贴 0 条 手机看新闻 Wi-Fi指纹定位是什么原理? 室内定位中的位置指纹法,简单来说,就是事先把各个位置上的信号特征(各Wi-Fi的信号强度)测量一遍,存入指纹数据库.定位的时候,将当前的信号特征与指纹库中的进行匹配,从而确定位置.下图是我本科毕设时画的示意图(AP就是WiFi,RP是离线采集选取的参考点): 离线阶段:记录下每个RP处测到的信号强度,每组数据(指纹)包含4个信号强度

四极管:室内定位技术(一)

国外微软.谷歌.苹果.诺基亚.博通.IndoorAtals.Qubulus等,研究室内定位这一技术解决方案,但是各自采用的技术定位有所不同. 在国内,也研究得如火如荼,863导航领域专家组组长.中科院院士周成虎表示,中国已经拥有了世界上领先室内定位技术能力,形成室内外亚米级厘米级.室内外由于3米的无缝定位导航能力. 在测绘行业的朋友们都知道,室外的定位技术已经非常成熟,室内定位虽然做得如火如荼,多方面还是从理论分析其可能性,还有待考证. 图片来源虎嗅网 这里四极管主要的关注点是室内定位技术.有博

【转载】HRTF音频3D定位技术综述

1. 序 您一定有过这样的经验:在一个炎热的夏夜,讨厌的蚊子在你的耳边飞舞.此时,没有比除掉这个祸害更急所的了,对吧?做到这一点,不必睁大了眼去找蚊子,只需依靠敏锐的听力,一样可以确定蚊子的方位,在漆黑之中也能给其以精确而致命的打击. 站在街头,有时候我们可以看见盲人无需牵引,也可跟随着路上的人群.对于盲人,想来这样不太安全:但不论如何,他们的行为是令人惊奇的肢体才能——聆听,当其被完全利用起来的时候,可以带给人很大的帮助. 实际上,不仅仅是我们的眼睛可以分辨物体的三维定位,我们的耳朵也能做到.

位置指纹(LF)定位技术简介-室内定位

    信号的多径传播对环境具有依赖性,呈现出非常强的特殊性.对于每个位置而言,该位置上信道的多径结构是惟一的,终端发射的无线电渡经过反射和折射,产生与周围环境密切相关的特定模式的多径信号,这样的多径特征可以认为是该位置的“指纹”.基站天线阵列检测信号的幅度和相位等特性,提取多径干扰特征参数,将该参数与预先存储在数据库中的指纹数据进行匹配,找出最相似的结果来进行定位.     位置指纹定位的实施一般可以分为两个阶段:第一阶段为训练/离线阶段,主要工作是采集所需定位区域各参考节点(RP,Refer

亚米级低成本室内定位技术的研究 智能三维空间建模和数据集成

信工论坛77期:主题:?The Holy Grail of Sub-meter Indoor Localization with Low-cost Infrastructure亚米级低成本室内定位技术的研究 时间:6月1日下午3:00??? 地点:教一楼201 ? Abstract:Despite?the?fact?that?people?spend?majority?of?their?time?indoor,?indoor?positioning?systems?(IPS)?only?have

css定位技术解析

css定位技术,在网页设计开发中有着很重要的作用.有许多的案例都可以用到它.比如说二级菜单,弹窗,图片轮播等等.现在我来总结一下它的使用. css定位属性是position,它有如下的几种属性值: 1:static:(默认值)无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. 2:relative:对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置. 3:absolute:对象脱离正常文档流,使用top,r

无线传感器网络中的节点定位技术

原文:http://www.cnblogs.com/dolphin0520/archive/2013/05/03/3056789.html 无线传感器网络的许多应用要求节点知道自身的位置信息,才能向用户提供有用的检测服务.没有节点位置信息的监测数据在很多场合下是没有意义的.比如,对于森林火灾检测.天然气管道监测等应用,当有事件发生时,人们关心的一个首要问题就是事件发生在哪里,此时如果只知道发生了火灾却不知道火灾具体的发生地点,这种监测没有任何实质的意义,因此节点的位置信息对于很多场合是至关重要的