一.https网页资源加载问题


若网站资源文件也是https协议,会导致加载异常

解决方案也很简单,但是网上大部分教程都建议重写onReceivedSslError,粗暴的忽略报错

不仅解决不了问题,还会导致app被检测,其实设置一下资源混合设置即可


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}



二.获取定位


实现也挺简单,就是重写onGeolocationPermissionsShowPrompt方法赋予定位权限

但坑实在是太多了,非常不建议使用


最好的解决方案还是通过交互接口,从移动端获取位置



先说一下几个坑(T▽T)

1.资源文件中不要给webview标签加属性,设置一下长宽就可以了

2.Manifest中,webview的activity不要使用硬件加速,launchMode也不要设置

3.手机时间格式调为24小时制 (这个太坑了,找到地老天荒)

4.申请定位的链接协议必须为https


接下来直接上代码,赋权限的时候最好检查一下有没有定位权限,我用的XXPermissions


WebSettings webSettings = webView.getSettings();
webSettings.setDomStorageEnabled(true);
webSettings.setAppCacheEnabled(true);
webSettings.setDatabaseEnabled(true);
String databasePath = context.getDir("database", Context.MODE_PRIVATE).getPath();
webSettings.setDatabasePath(databasePath);
webSettings.setGeolocationDatabasePath(databasePath);
webSettings.setGeolocationEnabled(true);
webView.setWebChromeClient(webChromeClient);

private WebChromeClient webChromeClient = new WebChromeClient() {

  @Override public void onGeolocationPermissionsShowPrompt(String origin,
      GeolocationPermissions.Callback callback) {
    
    if (XXPermissions.isHasPermission(context, Permission.Group.LOCATION)) {
      callback.invoke(origin, true, true);//允许
    } else {
      XXPermissions.with(activity)
          .permission(Permission.Group.LOCATION)
          .request(new OnPermission() {
            @Override public void hasPermission(List<String> granted, boolean isAll) {
              Logs.d(TAG, "hasPermission-isAll=" + isAll);
              if (isAll) {
                callback.invoke(origin, true, true);//允许
              }
            }

            @Override public void noPermission(List<String> denied, boolean quick) {

              new ShowMessageDialog(context).setDialogShow("温馨提示",
                  "您未开启定位权限,可能会导致系统异常,是否跳转设置界面开启?", "确定",
                  new ShowMessageDialog.onYesOnclickListener() {
                    @Override public void onYesClick() {
                      XXPermissions.gotoPermissionSettings(context);
                    }
                  }, "取消", new ShowMessageDialog.onNoOnclickListener() {
                    @Override public void onNoClick(Dialog dialog) {
                      ToastTools.showToast(context, "未获取到APP正常运行所必须的权限,请稍后重试。");
                      callback.invoke(origin, false, false);
                      dialog.dismiss();
                    }
                  });
            }
          });
    }
  }

  
};



三.关于WebChromeClient和WebViewClient的设置问题


这个两个兄弟只能设置一次,重复设置会把前一个覆盖掉

所有设置之前先全局搜一下,指不定哪里就会有一个

个人网站运营不易ヾ(◍°∇°◍)ノ゙如果有帮到你赞助一下吧

Kevin博客
  • 最新评论
  • 总共0条评论