博客轉載請標明出處:http://blog.csdn.net/nmyangmo/article/details/73105712
Android 5.0明確指出其webview是支持webRTC的,但是在國內各大廠商的定製下。。咳咳,算了,說多了都是淚啊~!
一怒之下我的webview內核換成了crosswalk。換完之後直接被暴擊,APP體積增加了40M啊!!!
不過沒辦法了webRTC功能和好處還是很誘人啊,這裏就不多說了。讓我們看crosswalk吧。
Crosswalk官方網址: https://crosswalk-project.org/
Crosswalk 下載地址: https://crosswalk-project.org/documentation/downloads.html
或者: https://download.01.org/crosswalk/releases/crosswalk/
**我下載的是: crosswalk-23.53.589.4.aar 這個版本,兼容x86和arm類型的CPU.
集成方法:1、設置grade外部庫爲libs,拷貝aar文件到libs**
repositories {
flatDir {
dirs 'libs'
}
}
2、關聯crosswalk庫
compile(name: 'crosswalk-23.53.589.4', ext: 'aar')
crosswalk的使用方法基本和webview一樣,只不過叫XWalkView
需要注意的是需要繼承XWalkActivity
重寫oncreate(),onXWalkReady()方法。加載網頁和配置都在crosswalk準備好後進行(onXWalkReady方法中)。關於XWalkView配置和webview基本相同,可以參考webview對XWalkView進行配置
XWalXWalkSettings mWebSettings = mWebView.getSettings();
mWebSettings.setSupportZoom(true);//支持縮放
mWebSettings.setBuiltInZoomControls(true);//可以任意縮放
mWebSettings.setLoadWithOverviewMode(true);
mWebSettings.setUseWideViewPort(true);////將圖片調整到適合webview的大小
// mWebSettings.setDefaultTextEncodingName("utf-8");
mWebSettings.setLoadsImagesAutomatically(true);
// mWebSettings.setMixedContentMode()
//調用JS方法.安卓版本大於17,加上註解 @JavascriptInterface
mWebSettings.setJavaScriptEnabled(true);//支持JS
WebView中的setwebViewClient(webViewClient)對應XWalkView中的setResourceClient(new XWalkResourceClient(mWebView)方法
mWebView.setResourceClient(new XWalkResourceClient(mWebView) {
//=========HTML5定位==========================================================
//需要先加入權限
//<uses-permission android:name="android.permission.INTERNET"/>
//<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
//<uses-permission android:name=
// "android.permission.ACCESS_COARSE_LOCATION"/>
@Override
public boolean shouldOverrideUrlLoading(XWalkView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onReceivedSslError(XWalkView view, ValueCallback<Boolean> callback, SslError error) {
super.onReceivedSslError(view, callback, error);
}
@Override
public void onLoadFinished(XWalkView view, String url) {
super.onLoadFinished(view, url);
}
@Override
public void onLoadStarted(XWalkView view, String url) {
super.onLoadStarted(view, url);
}
@Override
public void onProgressChanged(XWalkView view, int progressInPercent) {
super.onProgressChanged(view, progressInPercent);
}
@Override
public void onReceivedClientCertRequest(XWalkView view, ClientCertRequest handler) {
super.onReceivedClientCertRequest(view, handler);
}
@Override
public void onDocumentLoadedInFrame(XWalkView view, long frameId) {
super.onDocumentLoadedInFrame(view, frameId);
}
@Override
public void onReceivedHttpAuthRequest(XWalkView view, XWalkHttpAuthHandler handler, String host, String realm) {
super.onReceivedHttpAuthRequest(view, handler, host, realm);
}
@Override
public void onReceivedLoadError(XWalkView view, int errorCode, String description, String failingUrl) {
super.onReceivedLoadError(view, errorCode, description, failingUrl);
}
@Override
public void onReceivedResponseHeaders(XWalkView view, XWalkWebResourceRequest request, XWalkWebResourceResponse response) {
super.onReceivedResponseHeaders(view, request, response);
}
}
);
WebView中的setWebChromeClient(webChromeClient)對應XWalkView中的setUIClient(new XWalkUIClient(mWebView)方法
mWebView.setUIClient(new XWalkUIClient(mWebView) {
@Override
public void onPageLoadStarted(XWalkView view, String url) {
super.onPageLoadStarted(view, url);
}
@Override
public boolean onJsAlert(XWalkView view, String url, String message, XWalkJavascriptResult result) {
return super.onJsAlert(view, url, message, result);
}
@Override
public void onScaleChanged(XWalkView view, float oldScale, float newScale) {
super.onScaleChanged(view, oldScale, newScale);
}
@Override
public void onPageLoadStopped(XWalkView view, String url, LoadStatus status) {
super.onPageLoadStopped(view, url, status);
}
});
當然爲了避免關閉xWalkView引起內存泄露的問題,我們選擇了動態加載這個view.
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mWebView = new XWalkView(getApplicationContext());
mWebView.setLayoutParams(params);
mLayout.addView(mWebView);
因爲webRTC需要錄音我們還需要動態的申請權限(查看Demo)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO},
3332);
} else {
//
mWebView.loadUrl(mUrl);
}
} else {
mWebView.loadUrl(mUrl);
}
Demo還有網絡監聽NetReceiver和來電監聽PhoneCallReceiver,這裏不再贅述,感興趣可以查看Demo源碼
博客轉載請標明出處:http://blog.csdn.net/nmyangmo/article/details/73105712