Android为TV端助力之Webview与JS双向交互
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双向交互的更多相关文章
- Android为TV端助力之WebView开发踩坑一
在Android清单配置文件里面 自定义application时,在4.4系统上面不能加上一个属性,见下图 否则界面将不会显示任何数据,在更高或者更低的系统上面没有测试!
- Android为TV端助力 转载:RecyclerView分页加载
package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...
- Android为TV端助力(转载)
作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...
- Android为TV端助力 不需要Socket的跨进程推送消息AIDL!
上篇介绍了跨进程实时通讯http://www.cnblogs.com/xiaoxiaing/p/5818161.html 但是他有个缺点就是服务端无法推送消息给客户端,今天这篇文章主要说的就是服务器推 ...
- Android为TV端助力:(转载)修改TextView字体样式
一.开篇 因为 Android 字体相关的内容还比较多的.有时候其实我们只需要调整一下属性就可以满足设计师的需求,或者是一个退后的方案(毕竟有发版的时间卡住了),有一些效果可以大概满足需求. 那么本文 ...
- Android为TV端助力:UDP协议(接收组播和单播)
private static String MulticastHost="224.9.9.98";private static int POST=19999;private sta ...
- Android为TV端助力:自定义view之太阳
先看效果图 package com.hhzt.iptv.lvb_w8.view; import android.content.Context;import android.graphics.Canv ...
- Android为TV端助力 Linux命令查看包名类名
先运行apk 再输入logcat | grep START 查看当前启动apk的包名和类名 adb shell "pm list packages -f | grep com.yulong. ...
- Android为TV端助力 listview与recyclerview上下联动
首先是主布局fragment里面的xml文件 <?xml version="1.0" encoding="utf-8"?><RelativeL ...
随机推荐
- 阿里云ecs centos7安装 postgresql 9.4
rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-3.noarch.rpm yum insta ...
- 基于springboot搭建的web系统架构
从接触springboot开始,便深深的被它的简洁性深深的折服了,精简的配置,方便的集成,使我再也不想用传统的ssm框架来搭建项目,一大堆的配置文件,维护起来很不方便,集成的时候也要费力不少.从第一次 ...
- mybatis一对一 和 一对多 嵌套查询
实际项目中的,接口对外VO 会出现 一对一 和 一对多的情况,举例:小区 下面有 楼栋 ,楼栋 下面有 房屋 , 房屋里面又房间 小区Vo : districtVo { id: nam ...
- 号称“新至强,可拓展,赢当下”的Xeon可拓展处理器有多逆天?
目前企业数据中心正在发生重大变化,许多企业正在经历基于在线服务和数据的广泛转型.他们将这些数据用于功能强大的人工智能和分析应用程序,这些应用程序可以将其转化为改变业务的洞察力,然后推出可以使这些洞察力 ...
- Python基础 列表介绍、使用
第3章 学习目标: 列表是什么以及如何使用列表元素.列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素.列表是新手可直接使用的最强大的Python功能之一,它融合了众 ...
- 将包含经纬度点位信息的Excel表格数据导入到ArcMap中并输出成shapefile
将包含经纬信息的Excel表格数据,导入到ArcMap中并输出成shapefile,再进行后面的操作.使用这种方法可以将每一个包含经纬信息的数据在ArcMap中点出来. 一.准备数据 新建Excel表 ...
- golang中的defer
1.defer的作用 defer 语句会将函数推迟到外层函数返回之后执行. 即defer后面的函数在defer语句所在的函数执行结束的时候会被调用 2.defer的语法 defer后面必须是函数调用语 ...
- sdk和api的区别
SDK SDK是Software Development Kit的缩写,中文意思是“软件开发工具包”.这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档.范例和工具的集合都可以叫做 ...
- 升讯威微信营销系统开发实践:(3)功能介绍与此项目推广过程的一些体会( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- cglib根据数据动态生成对象
最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import jav ...