Android集成三方浏览器之X5内核

13,280 阅读3分钟

很多应用开始采用 hybrid 开发模式,最近在做有关 webrtc 视频通讯的项目,也是使用 hybrid 开发。然而由于系统 WebView 的兼容性问题(Android 4.4 以前 webview 是基于 webkit ,4.4 及以后采用 chromium)。需要使用一款兼容性较好的内核「完美支持 webrtc」。

如今可以集成的浏览器内核主要有 腾讯X5服务 英特尔的CrossWalk 火狐Firefox_Focus Chromium

这一篇主要讲解腾讯 X5 浏览器的集成,不得不说官方文档 描述的东西太少,如果遇到问题可以去 X5论坛 搜索相关问题。

腾讯 X5 内核也是基于 chromium 的,相比原生的 WebView 而言,优化了用户的浏览体验。SDK 是通过共享使用用户手机上微信、手机QQ、QQ空间等软件已经下载好的 X5 内核。SDK 很小,且集成简单只需几行代码即可。

集成

先去官网下载 SDK 后将所需的 aarso 文件导入我们的工程。

x5内核暂时不提供64位的so文件,so可只保留"armeabi"文件夹,手机运行时会向下兼容。

导入SDK

modulebuild.gradle 中添加

 //sdk中只提供了armeabi的文件夹和对应so文件 
 ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips" 
        }
//添加aar文件
repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
      compile(name: '你的aar文件', ext: 'aar')
}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
初始化X5服务
//在application中初始化
@Override
    public void onCreate() {
        super.onCreate();
        
        //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
        QbSdk.PreInitCallback callback = new QbSdk.PreInitCallback() {
            @Override
            public void onViewInitFinished(boolean arg) {
                //x5內核初始化完成的回调,
                // true表示x5内核加载成功,
                // false表示x5内核加载失败,会自动切换到系统内核。
            }

            @Override
            public void onCoreInitFinished() {
            }
        };

        QbSdk.initX5Environment(getApplicationContext(), callback);
    }

在布局中添加 WebView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="3dp" />

    <com.tencent.smtt.sdk.WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>
初始化 Webview
public class MainActivity extends AppCompatActivity {
    private ProgressBar progressBar;
    private WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = findViewById(R.id.progressbar);
        webView = findViewById(R.id.webview);
        initWebView();
    }

    private void initWebView() {
        WebSettings settings = webView.getSettings();           //和系统webview一样
        settings.setJavaScriptEnabled(true);                    //支持Javascript 与js交互
        settings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通过JS打开新窗口
        settings.setAllowFileAccess(true);                      //设置可以访问文件
        settings.setSupportZoom(true);                          //支持缩放
        settings.setBuiltInZoomControls(true);                  //设置内置的缩放控件
        settings.setUseWideViewPort(true);                      //自适应屏幕
        settings.setSupportMultipleWindows(true);               //多窗口
        settings.setDefaultTextEncodingName("utf-8");            //设置编码格式
        settings.setAppCacheEnabled(true);
        settings.setDomStorageEnabled(true);
        settings.setAppCacheMaxSize(Long.MAX_VALUE);
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);       //缓存模式
        webView.setWebViewClient(new WebViewClient() {          

            @Override
            public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
                super.onPageStarted(webView, s, bitmap);
            }

            @Override
            public void onPageFinished(WebView webView, String s) {
                super.onPageFinished(webView, s);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                webView.loadUrl(url);
                return true;
            }

            @Override
            public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
//                super.onReceivedSslError(webView, sslErrorHandler, sslError);
                sslErrorHandler.proceed();//忽略SSL证书错误
            }
        });

        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView webView, String s, String s1, JsResult jsResult) {
                return super.onJsAlert(webView, s, s1, jsResult);
            }

            @Override
            public void onReceivedTitle(WebView webView, String s) {
                super.onReceivedTitle(webView, s);
            }

            @Override
            public void onProgressChanged(WebView webView, int progress) {
                super.onProgressChanged(webView, progress);
               		if(...){
               			...
                        progressBar.setProgress(progress); //设置进度条
                         ...
                    } else {
                   		 ...
                    }
                }
            }
        });
        webView.loadUrl("http://www.baidu.com");
//      webView.reload(); 刷新页面
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView != null && webView.canGoBack()) {
            webView.goBack();
            return true;
        } else {
            ...
        }
    }
}

总结

上述已经完成 X5 内核集成。首次使用可能还在下载 X5 内核而使用系统内核。如有特殊需求可以采用静态集成(集成以后无法更新 X5 内核是硬伤)。

提示

之前在使用 X5 内核时,声明了 RECORD_AUDIO 权限后麦克风依然采集不到声音,后来发现没有添加 <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

添加以后麦克风可以正常采集声音。此权限是修改音频设置。有更多疑问请在 X5论坛 释疑。

最后推荐几个检查 X5 内核是否成功加载的工具和网址。

  1. debugtbs
  2. TBS开发调试利器
  3. 检测小工具

最后

关于Crosswalk集成请跳转:

Android集成三方浏览器之Crosswalk