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

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

如今可以集成的浏览器内核主要有 腾讯X5服务 英特尔的CrossWalk 火狐精简版浏览器Firefox Focus 还有最重要的 google 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 super.shouldOverrideUrlLoading(webView, url);
            }

            @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

猜你喜欢

转载自juejin.im/post/5b4eab58e51d45179c7a0c35