百川sdk----自己的WebViewClient不被执行

我在百川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", 0).getPath();
            var5.setAppCachePath(this.g);
            var5.setAllowFileAccess(true);
            var5.setAppCacheEnabled(true);
            if(CommonUtils.isNetworkAvailable(var1.getContext())) {
                var5.setCacheMode(-1);
            } else {
                var5.setCacheMode(1);
            }

            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 >= 21) {
                CookieManager.getInstance().setAcceptThirdPartyCookies(var1, true);
                int var10000 = d.e == null?-1:d.e.getIntValue("mixedContentMode", -1);
                int var8 = var10000;
                if(var10000 != -1) {
                    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(14)
    @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 如果变量名称、类型改变也可能失效,需要重新确定反射对象。  

时间: 2024-08-29 01:43:02

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

OpenWRT开发之——SDK

为了达到自己编写一个程序打包成ipk,并能在OpenWRT上运行的目的.我在网上找了些学习的资料. 本人参考的是:如何在OpenWRT上做开发 感谢该网友的耐心解答.虽然有现成的步骤,博主还是喜欢亲自实践一下,写下自己的实践过程. 第一步:生成SDK make menuconfig 选上 "Build the OpenWRT SDK" 在 trunk目录下,执行: $ make menuconfig 选择对应的"Target System"与"Target

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

android sdk安装HAXM发现不能正常执行 $ kextstat | grep intel 发现无进程执行 $ sudo kextload –b com.intel.kext.intelhaxm /Users/Frank/–b failed to load - (libkern/kext) not found; check the system/kernel logs for errors or try kextutil(8). /Users/Frank/com.intel.kext.i

常用的编译宏定义:可以让代码在不同的编译情况下执行

(1)__OPTIMIZE__  :用于release和debug的判断,当选择了__OPTIMIZE__  时,可以让代码在release时执行,在debug时不执行.示例如下: 1 2 3 4 5 #ifndef __OPTIMIZE__       //这里执行的是debug模式下   else     //这里执行的是release模式下   #endif (2)__i386__ 与 __x86_64__   :用于模拟器环境和真机环境的判断.满足该条件的代码只在模拟器下执行.示例代码如

在iOS中创建静态库

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用. 重用代码的最简单方法是简单的 拷贝/粘贴 源文件.然而,这种方法很快就会成为维护时的噩梦.因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步. 这就是静态库要拯救你的.一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享. 在本教程中,你将用两种方法亲手创建你自己的通用静态库. 为了获得最佳效果,你应该熟悉Objective-

Android性能优化之内存泄漏

综述 内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经不再使用的内存.那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会被系统回收,那这么以来便出现了内存泄漏的情况.在应用中内出现一次两次的内存泄漏获取不会出现什么影响,但是在应用长时间使用以后,若是存在大量的Activity无法被GC回收的话,最终会导致OOM的出现.那么我们在这就来分析一下导致内存泄漏的常见因素并且如何

android深度探索第二章

Android底层开发中首先要开发测试和调试Linux驱动,HAL程序库需要(1)JDK6或以上版本(2)Eclipse3.4或以上版本(3)ADT(4)CDT(5)Android SDK(6)Android NDK(7)交叉编译环境(8)Linux内核源代码(9)Android源代码(10)用于调试开发板的串口工具:minicom..第一步配置jdk环境,设置path变量,打开profile文件后输入 export PATH=.:/developer/jdk6/bin:$PATH,保存文件后在

《Android深度探索》(卷1)HAL与驱动开发读后感

第4章:源代码的下载和编译 本章主要介绍的是使用Git下载两套源代码,一套是安卓源代码,另一套Linux源代码.因为Android内核是基于Linux内核的,Android移植主要就是Linux内核的移植.而Linux内核的移植主要是Linux驱动的移植.所以为了开发和测试Linux驱动.需要在Linux下搭建两套开发环境.Android应用程序开发环境和Linux内核开发环境.本章的主要目的也就是介绍如何搭建这两种开发环境. 为了能够顺利进行Android的驱动开发,因此对这两种环境的搭建必须

iOS查错机制

转自: http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=404478233&idx=2&sn=ae55d4f70fce47c11958f0b8536f4370&scene=0#wechat_redirect 1.普通断点] 断点(Breakpoint)绝对是调试程序的第一大选择,也是掌握的基础技能.顾名思义,当程序运行到断点处时会暂停运行.比如断点打在11行,那么程序就会停在11行(注意:程序只运行到了前10行,第1

【转】高通平台android 环境配置编译及开发经验总结

原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流程分析 qcril 流程分析,设置sim卡锁 python scons 语法学习 Python 语言之 scons 工具流程分析: 1.2 搭建高通平台环境开发环境 高通and