1. 程式人生 > >Android為TV端助力之Webview與JS雙向交互

Android為TV端助力之Webview與JS雙向交互

對話框 request wid settings edt 由於 rip 信息 eval

package com.hhzt.iptv.adservice;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.ViewGroup;
import android.webkit.ConsoleMessage;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;

import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

/**
* Created by Administrator on 2019-04-16.
*/

public class AdActivity extends Activity {

private WebView mWebView;

private WebSettings mWebSetting;
TextView beginLoading,endLoading,loading,mtitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ad);
mWebView = (WebView)findViewById(R.id.webView1);
beginLoading = (TextView) findViewById(R.id.text_beginLoading);

endLoading = (TextView) findViewById(R.id.text_endLoading);
loading = (TextView) findViewById(R.id.text_Loading);
mtitle = (TextView) findViewById(R.id.title);
mWebSetting = mWebView.getSettings();
mWebSetting.setJavaScriptEnabled(true);


/**
* 傳一個Android對象給JS,JS拿到對象以後就可以調用你傳遞的對象裏面的方法
*/
mWebView.addJavascriptInterface(new MyWeb(),"test");//AndroidtoJS類對象映射到js的test對象
mWebView.loadUrl("file:///android_asset/index.html");


/**
* (2) WebViewClient類(主要作用是:處理各種通知 & 請求事件)
*/
mWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//使得打開網頁時不調用系統瀏覽器, 而是在本WebView中顯示
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//設定加載開始的操作
// super.onPageStarted(view, url, favicon);
System.out.println("開始加載了");
beginLoading.setText("開始加載了");
}

@Override
public void onPageFinished(WebView view, String url) {
//設定加載結束的操作
// super.onPageFinished(view, url);
endLoading.setText("結束加載了");
// Android版本變量
final int version = Build.VERSION.SDK_INT;
/**
* 因為該方法在 Android 4.4 版本才可使用,所以使用時需進行版本判斷
* android 調用JS代碼。需要在webview也沒加載完成時調用,否則無效
*/
if (version < 18) {
mWebView.loadUrl("javascript:callAndroid()");
} else {
mWebView.evaluateJavascript("javascript:callAndroid()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//此處為 js 返回的結果
Log.i("TAG","onReceiveValue:"+value);
}
});
}
}

@Override
public void onLoadResource(WebView view, String url) {
//設定加載資源的操作
super.onLoadResource(view, url);
}

@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {

}

@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//該方法傳回了錯誤碼,根據錯誤類型可以進行不同的錯誤分類處理
Log.i("TAG","onReceivedError:"+errorCode);
super.onReceivedError(view, errorCode, description, failingUrl);
}
});

/**
* (3) WebChromeClient類( 作用:輔助 WebView 處理 Javascript 的對話框,網站圖標,網站標題等等。)
*/
mWebView.setWebChromeClient(new WebChromeClient(){

@Override
public void onProgressChanged(WebView view, int newProgress) {
Log.i("TAG","onProgressChanged:"+newProgress);
if (newProgress < 100) {
String progress = newProgress + "%";
loading.setText(progress);
} else if (newProgress == 100) {
String progress = newProgress + "%";
loading.setText(progress);
}
}
//獲取網站標題
@Override
public void onReceivedTitle(WebView view, String title) {
// super.onReceivedTitle(view, title);
System.out.println("標題在這裏");
mtitle.setText(title);
}
//獲取網站logo
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
}

@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
Log.i("TAG","onConsoleMessage:"+consoleMessage.message()+ "-- from line "+consoleMessage.lineNumber()+" of "+consoleMessage.sourceId());
//這個方法返回Webview加載JS時的日誌信息
return super.onConsoleMessage(consoleMessage);
}


});



}

@Override
protected void onResume() {
super.onResume();

}


//銷毀Webview
@Override
protected void onDestroy() {
if (mWebView != null) {
// mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
mWebView.clearHistory();
((ViewGroup) mWebView.getParent()).removeView(mWebView);
mWebView.destroy();
mWebView = null;
}
super.onDestroy();
}

//點擊返回上一頁面而不是退出瀏覽器
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}



index.hdml界面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Carson</title>
</head>
<body>
//點擊按鈕則調用callAndroid函數
<button onclick="callAndroid()"></button>
</body>
<script>
function callAndroid(){
// 由於對象映射,所以調用test對象等於調用Android映射的對象,註意此處不能定義test,如果定義的那就是一個新的對象,將會提示無法找到hello方法
test.hello("js調用了android中的hello方法");
}
</script>
</html>
友情提示:修改index.html文件時,記得clean project一下,因為你運行時間AS編譯器不會去編譯assets裏面的文件,或者在項目的build.gradle加上
sourceSets {
main {
manifest.srcFile ‘src/main/AndroidManifest.xml‘
java.srcDirs = [‘src/main/java‘, ‘src/main/aidl‘]
resources.srcDirs = [‘src/main/java‘, ‘src/main/aidl‘]
aidl.srcDirs = [‘src/main/aidl‘]
res.srcDirs = [‘src/main/res‘]
assets.srcDirs = [‘src/main/assets‘]
}
}





Android為TV端助力之Webview與JS雙向交互