我在百川sdk的旺旺群中,追问这个问题N多次,一直没有人答复,哎,凡事都要靠自己.....

1、先查看下百川sdk中,是怎么处理咱们传递过去的 WebViewClient

public class l implements WebViewService {
private static final String b = l.class.getSimpleName();
private static final String c;
private static final String d;
private String e;
public static boolean a;
private String f = "";
private String g;
private HashMap<String, String> h = new HashMap(); public l() {
} public void bindWebView(WebView var1, WebViewClient var2) {
if(var1 != null) {
a = false;
WebSettings var5 = var1.getSettings(); try {
var5.setJavaScriptEnabled(true);
} catch (Exception var7) {
;
} var5.setSavePassword(false);
var5.setUseWideViewPort(true);
var5.setLoadWithOverviewMode(true);
var5.setJavaScriptCanOpenWindowsAutomatically(false);
var5.setDomStorageEnabled(true);
this.g = var1.getContext().getApplicationContext().getDir("cache", ).getPath();
var5.setAppCachePath(this.g);
var5.setAllowFileAccess(true);
var5.setAppCacheEnabled(true);
if(CommonUtils.isNetworkAvailable(var1.getContext())) {
var5.setCacheMode(-);
} else {
var5.setCacheMode();
} var5.setBuiltInZoomControls(false);
StringBuilder var6 = new StringBuilder();
this.e = var5.getUserAgentString();
if(this.e != null) {
var6.append(this.e);
} if(!WebViewUtils.isLoginDowngraded()) {
var6.append(d);
} var6.append(c);
var5.setUserAgentString(var6.toString());
if(VERSION.SDK_INT >= ) {
CookieManager.getInstance().setAcceptThirdPartyCookies(var1, true);
int var10000 = d.e == null?-:d.e.getIntValue("mixedContentMode", -);
int var8 = var10000;
if(var10000 != -) {
var5.setMixedContentMode(var8);
}
} if(var2 == null) {
var1.setWebViewClient(new m(this));
} else {
var1.setWebViewClient(new n(this));
}
}
} public void releaseWebView(WebView var1) {
var1.getSettings().setUserAgentString(this.e);
d.m.removeCookies();
} protected static void a(String var0) {
if(!WebViewUtils.isLoginDowngraded()) {
try {
CookieManagerWrapper.INSTANCE.refreshCookie(var0);
} catch (Exception var1) {
AliSDKLogger.e("ui", "fail to refresh cookie", var1);
}
}
} static {
c = " AliApp(BC/" + ConfigManager.TAE_SDK_VERSION.toString() + ")";
d = " tae_sdk_" + ConfigManager.SDK_INTERNAL_VERSION;
a = false;
}
}

关键在 bindWebView(WebView var1, WebViewClient var2) 方法中 var2 做了些什么!!...

if(var2 == null) {
var1.setWebViewClient(new m(this));
} else {
var1.setWebViewClient(new n(this));
}

哇擦擦,只是用来判断,连基本的保存都没有。可想我的 WebViewClient  死的多惨。

既然百川不带咱们的 WebViewClient  玩,那就想想其他办法,它不带咱们玩,那就咱们带它玩吧....

那怎么玩呢?咱们的 WebViewClient 来包裹百川的 WebViewClient ,然后在通过 webView.setWebViewClient 方法把新的 WebViewClient  重新设置进去。  

具体实现如下

1、首先绑定百川的 WebView 服务

mWebViewService = AlibabaSDK.getService(WebViewService.class);
mWebViewService.bindWebView(webView, null);

2、通过反射从系统的 WebView 获得百川的 WebViewClient

/** 获得隐藏成员变量mProvider中的WebViewClient */
public WebViewClient getProviderWebViewClient() {
WebViewClient webViewClient = null;
try {
Class<?> cls = this.getClass();
Method method = cls.getMethod("getWebViewProvider");
method.setAccessible(true);
Object object = method.invoke(this); // object => WebViewChromium implements WebViewProvider
Field field = object.getClass().getDeclaredField("mContentsClientAdapter");
field.setAccessible(true);
object= field.get(object); // object => WebViewContentsClientAdapter
field = object.getClass().getDeclaredField("mWebViewClient");
field.setAccessible(true);
object= field.get(object);
if (object instanceof WebViewClient) { webViewClient = (WebViewClient) object; }
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} finally { return webViewClient; }
}

3、将自己的WebViewClient 和百川的WebViewClient 结合

package com.emar.bcsdk;

import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient; /**
* Created by ak_star on 2016/6/2.
*/
public class MixBaiCWebViewClient extends WebViewClient {
private WebViewClient mMyselfClient = null; // 自己应用的WebViewClient
private WebViewClient mBaiCClient = null; // 百川WebViewClient public MixBaiCWebViewClient(WebViewClient myself, WebViewClient baiClient) {
mMyselfClient = myself;
mBaiCClient = baiClient;
} @Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
if (mBaiCClient != null) { mBaiCClient.onReceivedError(view, errorCode, description, failingUrl); }
if (mMyselfClient != null) { mMyselfClient.onReceivedError(view, errorCode, description, failingUrl); }
} @Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (mBaiCClient != null) { mBaiCClient.onPageStarted(view, url, favicon); }
if (mMyselfClient != null) { mMyselfClient.onPageStarted(view, url, favicon); }
} @Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (mBaiCClient != null) { mBaiCClient.onPageFinished(view, url); }
if (mMyselfClient != null) { mMyselfClient.onPageFinished(view, url); }
} @Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
boolean result = super.shouldOverrideUrlLoading(view, url);
if (mMyselfClient != null)
result = mMyselfClient.shouldOverrideUrlLoading(view, url);
if (mBaiCClient != null) {
if (!result) {
result = mBaiCClient.shouldOverrideUrlLoading(view, url);
} else { mBaiCClient.shouldOverrideUrlLoading(view, url); }
}
return result;
} @TargetApi()
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
super.onReceivedSslError(view, handler, error);
if (mBaiCClient != null) {
mBaiCClient.onReceivedSslError(view, handler, error);
} else if (mMyselfClient != null) {
mMyselfClient.onReceivedSslError(view, handler, error);
}
}
}

4、最后重新设置给 WebView

webView.setWebViewClient(new MixBaiCWebViewClient(client, baiCWebViewClient));

上述方案已经经过本人测试,可以实现 淘宝授权免登服务,同时也触发了自己的 WebViewClient 中的方法执行。

但毕竟此方案不是正规途径,有正规方法,还是用正规方法。

注意:1、此方法再升级百川sdk后,要重新检查是否仍然可行

        2、由于使用了反射,android sdk 如果变量名称、类型改变也可能失效,需要重新确定反射对象。  

百川sdk----自己的WebViewClient不被执行的更多相关文章

  1. 百川sdk----自己的WebViewClient不被执行【废弃,新版本百川已修复此问题】

    我在百川sdk的旺旺群中,追问这个问题N多次,一直没有人答复,哎,凡事都要靠自己..... 1.先查看下百川sdk中,是怎么处理咱们传递过去的 WebViewClient public class l ...

  2. 转载 -- Cocoapod方式引入百川SDK -报错[!] Unable to find a specification for `xxx`

    [cocopad集成百川sdk官网] iOS需要填写BundleID .BundleID要是当前应用的BundleID.勾选淘宝登录基础包下载SDK. 注意事项:将下载的SDK中的身份图片yw_122 ...

  3. iOS 阿里百川SDK集成注意点

    百川SDK是阿里系OneSDK的终极版本,里面包含了所有的阿里系的基本所有的SDK,集成的时候你只需要勾选对应的你需要的模块,然后生成对应的SDK即可,百川主要是针对帮助APP开发者在各种场景下快速. ...

  4. 对于百川SDK签名验证的问题

    SDK是要在wantu.taobao.com生成的.而生成这个SDK其实是要上传一个apk,而这个上传其实就是取他的签名而已.验证就是那张yw222那张图片.重点是你上传的apk的签名是不是跟你的生成 ...

  5. 阿里百川SDK初始化失败 错误码是203

    由idea换到Androidstudio 了,结果报这个错,之前好好的啊!!! 设置问题:

  6. Installing vSphere SDK for Perl

    Installing vSphere SDK for Perl 你可以安装vSphere SDK 在Linux 或者Microsoft Windows 系统,或者 部署 VSphere Managem ...

  7. 第一部分:开发前的准备-第八章 Android SDK与源码下载

    第8章 Android SDK与源码下载 如果你是新下载的SDK,请阅读一下步骤了解如何设置SDK.如果你已经下载使用过SDK,那么你应该使用AVD Manager,来更新即可. 下面是构建Andro ...

  8. 01.ubuntu14.04安装HI3518EV200 SDK的过程

    转载,侵删 1.海思SDK安装编译 Hi3518EV200_SDK是基于Hi3518EV200_DMEB的软件开发包,包含了在Linux相关应用开发时使用的各种工具及其源代码,是用户开发中最基本的软件 ...

  9. yosemite开启HAXM硬件加速执行安卓虚拟机

    android sdk安装HAXM发现不能正常执行 $ kextstat | grep intel 发现无进程执行 $ sudo kextload –b com.intel.kext.intelhax ...

随机推荐

  1. Linux主机共享目录给Windows主机的方法

    Linux主机共享目录可以通过samba来实现 首先,来看下百科上关于samba的介绍: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Ser ...

  2. C# 图片的裁剪,两个图片合成一个图片

    图片的裁剪,两个图片合成一个图片(这是从网上摘的) /// <summary>         /// 图片裁剪,生成新图,保存在同一目录下,名字加_new,格式1.png  新图1_ne ...

  3. Rendering Problems:android.support.v7.internal.widget.ActionBarOverlayLayout 解决方法

    不知道是不是android studio安装不对的问题,每次新建项目都有这个问题. 临时解决方法是: 打开 styles.xml 在Theme.AppCompat.Light.DarkActionBa ...

  4. 高性能 Oracle JDBC 编程

    了解如何利用连接和语句池特性来提高 Oracle 驱动的 JDBC 程序的性能.作者:Yuli Vasiliev2009 年 4 月发布使用诸如连接池和语句池等池技术可以显著提高数据库密集型应用程序的 ...

  5. Oracle表的建立条件

    约束:1.非空约束a.字段不能为nullb.null 不等于 ''空字符串,oracle不允许把''写入到非空字符串型字段中2.主键约束a.指定某一列或某几列为主键列b.主键列必须具有非空约束c.主键 ...

  6. bzoj3504: [Cqoi2014]危桥

    题意:给出一个图,有的边可以无限走,有的只能走两次(从一头到另一头为一次),给定两个起点以及对应的终点以及对应要走几个来回,求判断是否能完成. 先来一个NAIVE的建图:直接限制边建为容量1,无限制为 ...

  7. Monkey for iOS(CrashMonkey4IOS)

    CrashMonkey4IOS介绍 支持真机测试.模拟器测试 支持收集系统日志(Systemlog).崩溃日志(Crashlog).instrument行为日志 支持测试报告截图,绘制行为轨迹 支持测 ...

  8. UILabel多种字体

    UILabel *label = [[UILabel alloc] init]; label.text = @"UILabel多种字体"; UIFont *font = [UIFo ...

  9. C#获取一个目录下的所有文件名

    今天在做图像训练的时候发现需要把一大堆图片进行处理再读进分类器,本来是用C++写的,结果发现并不会,于是就用回了我最爱的C#,结果棒棒哒. 代码如下,简单粗暴,比网上C++的语法好看多了 using ...

  10. 再读C++线程池

    最近仔细看了一下https://github.com/henkel/threadpool代码,总体感觉非常精巧,使用了 boost库的bind function完成了线程池与业务端的完全解耦:所有的任 ...