
很多應(yīng)用開始采用 hybrid 開發(fā)模式,最近在做有關(guān) webrtc 視頻通訊的項(xiàng)目,也是使用 hybrid 開發(fā)。然而由于系統(tǒng) WebView 的兼容性問題(Android 4.4 以前 webview 是基于 webkit ,4.4 及以后采用 chromium)。需要使用一款兼容性較好的內(nèi)核「完美支持 webrtc」。
如今可以集成的瀏覽器內(nèi)核主要有 騰訊X5服務(wù) 英特爾的CrossWalk 火狐Firefox_Focus Chromium
這一篇主要講解騰訊 X5 瀏覽器的集成,不得不說官方文檔 描述的東西太少,如果遇到問題可以去 X5論壇 搜索相關(guān)問題。
騰訊 X5 內(nèi)核也是基于 chromium 的,相比原生的 WebView 而言,優(yōu)化了用戶的瀏覽體驗(yàn)。SDK 是通過共享使用用戶手機(jī)上微信、手機(jī)QQ、QQ空間等軟件已經(jīng)下載好的 X5 內(nèi)核。SDK 很小,且集成簡單只需幾行代碼即可。
集成
先去官網(wǎng)下載 SDK 后將所需的 aar 和 so 文件導(dǎo)入我們的工程。
x5內(nèi)核暫時(shí)不提供64位的so文件,so可只保留"armeabi"文件夾,手機(jī)運(yùn)行時(shí)會(huì)向下兼容。
導(dǎo)入SDK
在 module 的 build.gradle 中添加
//sdk中只提供了armeabi的文件夾和對應(yīng)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服務(wù)
//在application中初始化
@Override
public void onCreate() {
super.onCreate();
//搜集本地tbs內(nèi)核信息并上報(bào)服務(wù)器,服務(wù)器返回結(jié)果決定使用哪個(gè)內(nèi)核。
QbSdk.PreInitCallback callback = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg) {
//x5內(nèi)核初始化完成的回調(diào),
// true表示x5內(nèi)核加載成功,
// false表示x5內(nèi)核加載失敗,會(huì)自動(dòng)切換到系統(tǒng)內(nèi)核。
}
@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(); //和系統(tǒng)webview一樣
settings.setJavaScriptEnabled(true); //支持Javascript 與js交互
settings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通過JS打開新窗口
settings.setAllowFileAccess(true); //設(shè)置可以訪問文件
settings.setSupportZoom(true); //支持縮放
settings.setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件
settings.setUseWideViewPort(true); //自適應(yīng)屏幕
settings.setSupportMultipleWindows(true); //多窗口
settings.setDefaultTextEncodingName("utf-8"); //設(shè)置編碼格式
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證書錯(cuò)誤
}
});
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); //設(shè)置進(jìn)度條
...
} 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 {
...
}
}
}
總結(jié)
上述已經(jīng)完成 X5 內(nèi)核集成。首次使用可能還在下載 X5 內(nèi)核而使用系統(tǒng)內(nèi)核。如有特殊需求可以采用靜態(tài)集成(集成以后無法更新 X5 內(nèi)核是硬傷)。
提示
之前在使用 X5 內(nèi)核時(shí),聲明了 RECORD_AUDIO 權(quán)限后麥克風(fēng)依然采集不到聲音,后來發(fā)現(xiàn)沒有添加
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
添加以后麥克風(fēng)可以正常采集聲音。此權(quán)限是修改音頻設(shè)置。有更多疑問請?jiān)?X5論壇 釋疑。
最后推薦幾個(gè)檢查 X5 內(nèi)核是否成功加載的工具和網(wǎng)址。
最后
關(guān)于Crosswalk集成請?zhí)D(zhuǎn):
Android集成三方瀏覽器之Crosswalk