三步搞定: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语言中的Literal Syntax特性分析
Mar 08 Javascript
关于 文本框默认值 的操作js代码
Jan 12 Javascript
jQuery取得设置清空select选择的文本与值
Jul 08 Javascript
Angular中的Promise对象($q介绍)
Mar 03 Javascript
究竟什么是Node.js?Node.js有什么好处?
May 29 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
Feb 14 Javascript
第三篇Bootstrap网格基础
Jun 21 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
jQuery实现鼠标移入移出事件切换功能示例
Sep 06 jQuery
Angular刷新当前页面的实现方法
Nov 21 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
php adodb分页实现代码
2009/03/19 PHP
Cakephp 执行主要流程
2010/03/24 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
JS控制日期显示的小例子
2013/11/23 Javascript
ajax请求乱码的解决方法(中文乱码)
2014/04/10 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
如何利用python生成MD5并去重
2020/12/07 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
最新自我评价范文
2013/11/16 职场文书
医生进修自我鉴定
2014/01/19 职场文书
英文商务邀请信
2014/01/22 职场文书
运动会通讯稿50字
2014/01/30 职场文书
销售主管竞聘书
2014/03/31 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
2014公司年终工作总结
2014/12/19 职场文书
2015年教研工作总结
2015/05/23 职场文书
Mysql开启外网访问
2022/05/15 MySQL
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript