美文网首页
[Mtk][M0] 浏览器保存离线页面失败

[Mtk][M0] 浏览器保存离线页面失败

作者: 灰灰手记 | 来源:发表于2016-09-28 20:57 被阅读243次
    说明:

    下面将要说的MtkBrwoser,是指在vender/mediatek目录下的Browser应用。


    现象:

    在使用MtkBrowser浏览网页时,选择 Save for offline reading 功能,提示 Failed to save web page.

    MTK解决方法1

    优点:安全,不用担心修改 GMS,影响 CTS 测试,也不用担心 MtkBrowser 有什么别的问题了,一劳永逸。
    缺点:Chrome 的可定制性太差,客户不一定接受。

    4、MTK 基于 L 平台的解决方法:
    修改:
    vendor\google\apps\WebViewGoogle\Android.mk
    注释掉前面提到的代码:
    #LOCAL_OVERRIDES_PACKAGES :=webview

    修改:
    /frameworks/base/core/java/android/webkit/WebViewFactory.java
    getWebViewPackageName 方法,修改为:

    public static String getWebViewPackageName() {
            //return AppGlobals.getInitialApplication().getString(
            //        com.android.internal.R.string.config_webViewPackageName);
    
            Application initialApplication = AppGlobals.getInitialApplication();
            if(initialApplication.getPackageName().equals("com.android.browser")){
                return "com.android.webview";
            } else{
                return initialApplication.getString(com.android.internal.R.string.config_webViewPackageName);
            }
    }
    

    优点:MTK 提供的方法,可靠性相对较高。而且有 HTMLViewer 乱码现象时,只需要多加一个判断,包名写 HTMLViewer 的包名就好。
    缺点:可能影响 CTSGTS 测试。
    PS:经验证不可行,至少在 M 平台不可行。

    5、自己的方法:
    在上述第 4MTK 的方法的基础上,接着修改:
    \frameworks\base\core\java\android\webkit\WebView.java

    插入如下 START 和 END 标识的代码即可。

    private void initChromiumClassIfNeccessary() {
            if (mCls != null) {
                return;
            }
            try {
                Application initialApplication = AppGlobals.getInitialApplication();
                if (initialApplication == null) {
                    throw new ReflectiveOperationException("Applicatin not found");
                }
                String packageName = initialApplication.getString(
                        com.android.internal.R.string.config_webViewPackageName);
    
                /// START. By Xia.Fei, 20160929. Save for offline reading.
                String callerPkgName = initialApplication.getPackageName();
                Log.e("XIAFEI", "WV >> initChromiumClassIfNeccessary, callerPkgName = "+callerPkgName);
                if(callerPkgName.equals("com.android.browser")){
                    packageName = "com.android.webview";
                }
                /// END. By Xia.Fei, 20160929. Save for offline reading.
    
                Context webViewContext = initialApplication.createPackageContext(packageName,
                        Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
                initialApplication.getAssets().addAssetPath(
                        webViewContext.getApplicationInfo().sourceDir);
                ClassLoader clazzLoader = webViewContext.getClassLoader();
    
                String className = "com.android.webview.chromium.WebViewChromium";
                mCls = Class.forName(className, true, clazzLoader);
            } catch (android.content.pm.PackageManager.NameNotFoundException ex) {
                Log.e(LOGTAG, "get Webview Class Exception->" + ex);
            } catch (ReflectiveOperationException ex) {
                Log.e(LOGTAG, "get Webview Class Exception->" + ex);
            }
        }
    

    缺点:未验证是否影响 CTSGTS
    PS:参考上面第 4 点修改之后,需要 Clean 编译。

    相关文章

      网友评论

          本文标题:[Mtk][M0] 浏览器保存离线页面失败

          本文链接:https://www.haomeiwen.com/subject/muckyttx.html