标签

Android 44

Android Network security configuration Android 网络配置 Android Camera Preview gradlew 源码分析 Android 动态修改菜单 Android RelativeLayout 之 Gravity 的使用 Android Studio Gradle Download Error Android加载子View 【转】Android打开与关闭软键盘 Android EditText软键盘显示隐藏以及“监听” Android mipmap文件夹 Android 用命令行更新SDK Android Service学习之AIDL, Parcelable和远程服务 Android 5.0设备中,Notification小图标是白色的 Android最佳实践 Android Keystore 文件的密码修改 Android Studio 中加载so库文件 Android 中方法重载遇到的问题 ListView & RecyclerView Google Volley如何缓存HTTP请求文件 Creating logs in Android applications Advanced Android TextView TextView高亮URL地址解析 TextView 高亮URL地址,并实现跳转 Best practices in Android development Android Sdk Manager无法更新问题解决办法 Android ViewPager滑动事件 Google Volley 网络请求框架(一) Andorid UI注入工具的使用(ButterKnife) Android 项目中出现的奇葩bug, 数据NullPointExcption Android Drawable Animation Android 图片的毛玻璃效果 Android之使用Log打印日志 使用Fidder来拦截Android发送的HTTP请求 Android之Webview使用 Android之Notification的使用(二) Android之Notification的使用(一) Android Keyboard Show&Hiden Android 粘贴板的使用 Android中使用.9.png 使用Fidder来拦截Android发送的HTTP请求 Andorid JUnit 单元测试 Activity之间的切换动画 Android ListView中Adapter的使用

Android之Webview使用

2014年10月13日

Android之Webview使用

HTML页面是一个非常重要的角色,不仅是在PC端,在移动端也是非常重要的。

今天使用Webview来显示一个H5页面,其中就有地图页面。如果你经常使用浏览器, 你会发现,浏览器在使用定位信息的时候,需要相关权限,当然,有好的提示用户是一个 必不可少的步骤。

问题

用Webview加载map的时候,使用地理位置,提示用户授权。

解决办法

先看代码:

@Override
public void onGeolocationPermissionsShowPrompt(
        final String origin,
        final GeolocationPermissions.Callback callback) {
    DebugLog.d(TAG, "[onGeolocationPermissionsShowPrompt]");
    showLocalRemidPopupWindow(origin, new GeoListener() {
        @Override
        public void onRefused() {
            callback.invoke(origin, false, false);
        }

        @Override
        public void onSharedLocation() {
            callback.invoke(origin, true, false);
        }
    });
}

private void showLocalRemidPopupWindow(final String title, final GeoListener callback) {
    String saved = PreferencesUtil.getString(this, title, "");
    if (!TextUtils.isEmpty(saved)) {
        if (saved.equals("true")){
            if (callback != null) {
                callback.onSharedLocation();
            }
        } else if (saved.equals("false")){
            if (callback != null){
                callback.onRefused();
            }
        }
        return;
    }
    if (mGeoPopupWindow == null){
        View view = LayoutInflater.from(this).inflate(R.layout.geo_popup_window, null);
        this.mGeoTitleTv = (TextView) view.findViewById(R.id.geo_title);
        this.mGeoSaveCb = (CheckBox) view.findViewById(R.id.geo_save_share_preference);
        this.mRefusedBtn = (Button) view.findViewById(R.id.refused_btn);
        this.mShareLocationBtn = (Button) view.findViewById(R.id.share_btn);
        this.mGeoPopupWindow = new PopupWindow(view,
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT, false);
    }
    this.mGeoTitleTv.setText(String.format(getString(R.string.geo_title), title));
    this.mGeoSaveCb.setChecked(true);
    this.mRefusedBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            saveSharePrefrence(title, false);
            if (callback != null) {
                callback.onRefused();
            }
            mGeoPopupWindow.dismiss();
        }
    });
    this.mShareLocationBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            saveSharePrefrence(title, true);
            if (callback != null) {
                callback.onSharedLocation();
            }
            mGeoPopupWindow.dismiss();
        }
    });
    this.mGeoPopupWindow.showAtLocation(mWebView, Gravity.BOTTOM, 0, 0);
}

当浏览器在调用地理位置信息,webView就会触发onGeolocationPermissionsShowPrompt这个方法的调用。 那浏览器中是如何调用地理位置信息的呢?这里我也去查看了一点点资料,大概了解了一下, 代码如下:

//通过navigator.geolocation对象获取地理位置信息
//常用的navigator.geolocation对象有以下三种方法:
//获取当前地理位置
navigator.geolocation.getCurrentPosition(
        success_callback_function,
        error_callback_function,
        position_options)
//持续获取地理位置
navigator.geolocation.watchPosition(
        success_callback_function,
        error_callback_function,
        position_options)
//清除持续获取地理位置事件
navigator.geolocation.clearWatch(watch_position_id)  

当然仅仅是重写onGeolocationPermissionsShowPrompt这个方法是不行的。 还要对webSetting进入相关设置,具体内容,源码 中有写相关代码。

WebSettings常用方法

setAllowFileAccess 启用或禁止WebView访问文件数据

setBlockNetworkImage 是否显示网络图像

setBuiltInZoomControls 设置是否支持缩放

setCacheMode 设置缓冲的模式

setDefaultFontSize 设置默认的字体大小

setDefaultTextEncodingName 设置在解码时使用的默认编码

setFixedFontFamily 设置固定使用的字体

setJavaSciptEnabled 设置是否支持Javascript

setLayoutAlgorithm 设置布局方式

setLightTouchEnabled 设置用鼠标激活被选项

setSupportZoom 设置是否支持变焦

WebViewClient常用方法

doUpdate VisitedHistory 更新历史记录

onFormResubmission 应用程序重新请求网页数据

onLoadResource 加载指定地址提供的资源

onPageFinished 网页加载完毕

onPageStarted 网页开始加载

onReceivedError 报告错误信息

onScaleChanged WebView发生改变

shouldOverrideUrlLoading 控制新的连接在当前WebView中打开

WebChromeClient常用方法

onCloseWindow 关闭WebView

onCreateWindow 创建WebView

onJsAlert 处理Javascript中的Alert对话框

onJsConfirm处理Javascript中的Confirm对话框

onJsPrompt处理Javascript中的Prompt对话框

onProgressChanged 加载进度条改变

onReceivedlcon 网页图标更改

onReceivedTitle 网页Title更改

onRequestFocus WebView显示焦点

最后结果

result

参考资料

  1. Android WebView常见问题及解决方案汇总
  2. android webview geolocation
  3. 利用HTML5开发Android
  4. Android WebView


友情链接: Hiro's Blog | Junjun's Blog