三步搞定:Vue.js调用Android原生操作


Posted in Javascript onSeptember 07, 2020

第一步: Android对Js的接口,新建AndroidInterfaceForJs.js

import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.RequiresApi;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.widget.Toast;
import com.just.agentweb.AgentWeb;
import com.yidumedical.ui.activity.PAWebActivity;

/**
 * Created by shiby on 2018/1/24.
 */

public class AndroidInterfaceForJS {

 private Handler deliver = new Handler(Looper.getMainLooper());
 private AgentWeb agent;
 private Context context;

 public AndroidInterfaceForJS(AgentWeb agent, Context context) {
  this.agent = agent;
  this.context = context;
 }

 @JavascriptInterface
 public void callAndroid(final String msg) {
  deliver.post(new Runnable() {
   @Override
   public void run() {
    Log.i("Info", "main Thread:" + Thread.currentThread());
    Toast.makeText(context.getApplicationContext(), "" + msg, Toast.LENGTH_LONG).show();
   }
  });
  Log.i("Info", "Thread:" + Thread.currentThread());

 }

}

第二步: 给WebView中的window注入对象(例子使用的是AgentWeb)

private void init(){
 mAgentWeb = AgentWeb
   .with(this)//传入Activity or Fragment
   .setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams ,第一个参数和第二个参数应该对应。
   .useDefaultIndicator()// 使用默认进度条
   .defaultProgressBarColor() // 使用默认进度条颜色
   .createAgentWeb()//
   .ready()
   .go(baseURL);
 //注入对象
 mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterfaceForJS(mAgentWeb,this.getApplicationContext()));
 AgentWebSettings agentWebSettings = mAgentWeb.getAgentWebSettings();
 agentWebSettings.getWebSettings().setDomStorageEnabled(true);
}
注入对象:
 //注入对象
 mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterfaceForJS(mAgentWeb,this.getApplicationContext()));

第三步:在Vue里面直接调用方法(简单粗暴法):

window.android.callAndroid('调用成功,耶!!!')

考虑到项目的可维护性,一般不这样写。

优雅法:

新建app.js

const android = window.android

export { android }

将 window.android存在该模块,方便更改

然后在需要的.js或者.vue文件中,导入app模块,然后使用

import {android} from '../app'
try {
android.callAndroid('调用成功,耶!!!')
} catch (e) {
console.log('出现错误, 如果在非android环境下访问, 出现该警告是正常的.')
}

补充知识:vue与原生安卓相互调用

最近公司有做直播类的项目,由于直播框架限制,限制所用的技术是vue搭建的H5页面嵌入到原生安卓中。由于之前没有过类似的混合开发经验,所以今天写篇博客加深下印象。

vue.js调用安卓方法

先将vue项目放到一个内网地址或者外网地址中,然后安卓端通过“webView.loadUrl()”将vue项目引入。安卓端将要调用的方法名暴露在window对象中,由vue直接在methods中调用并携带参数。

methods:{
  goPublish(){
   //将vue项目引入至安卓代码中,安卓方法暴露在window中,vue中可以直接用window去调取方法。
   window.android.callAndroidMethod('1','2')
  }
 }

安卓调用vue.js中的方法

同样的vue也需要把方法添加到window中去,再由安卓端去调取方法。

created(){
 //需要在created钩子中将方法添加到window对象中
  window.setFun = this.setFun;
 },
 methods:{
  setFun(arg) {
   //arg: 原生调用Vue时传值(arg)给Vue
   console.log("获取到android的传参:" + arg);
  },
 }

以上就是vue与安卓端项目调用的大致方法,有用词不当的地方望海涵且不吝指正。希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
May 07 Javascript
js 调用百度地图api并在地图上进行打点添加标注
May 13 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
Jun 01 Javascript
Angular2从搭建环境到开发步骤详解
Oct 17 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
Feb 12 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
Mar 08 Javascript
微信小程序--组件(swiper)详细介绍
Jun 13 Javascript
jQuery Jsonp跨域模拟搜索引擎
Jun 17 jQuery
使用jQuery实现页面定时弹出广告效果
Aug 24 jQuery
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
Apr 15 Javascript
JS实现简单的九宫格抽奖
Jun 28 Javascript
vue单应用在ios系统中实现微信分享功能操作
Sep 07 #Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
Sep 07 #Javascript
一篇文章带你从零快速上手Rollup
Sep 07 #Javascript
基于vue hash模式微信分享#号的解决
Sep 07 #Javascript
在项目vue中使用echarts的操作步骤
Sep 07 #Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
Sep 07 #Javascript
Vue.js原理分析之nextTick实现详解
Sep 07 #Javascript
You might like
PHP 中的一些经验积累
2006/10/09 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP实现的购物车类实例
2015/06/17 PHP
PHP控制前台弹出对话框的实现方法
2016/08/21 PHP
js身份证验证超强脚本
2008/10/26 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
jQuery实现内容定时切换效果完整实例
2016/04/06 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
python轻松实现代码编码格式转换
2015/03/26 Python
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
Python文件读写常见用法总结
2019/02/22 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
百度软件工程师职位
2013/02/14 面试题
无毒社区工作方案
2014/05/23 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书
班主任培训研修日志
2015/11/13 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android