三步搞定: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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
JavaScript的面向对象方法以及差别
Mar 31 Javascript
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
浅析ES6的八进制与二进制整数字面量
Aug 30 Javascript
使用jquery实现的循环连续可停顿滚动实例
Nov 23 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
Sep 07 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
Mar 03 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
Apr 25 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 Javascript
vue首次渲染全过程
Apr 21 Vue.js
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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
用php或asp创建网页桌面快捷方式的代码
2010/03/23 PHP
PHP安全防范技巧分享
2011/11/03 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
使用递归遍历对象获得value值的实现方法
2016/06/14 Javascript
解决option标签selected="selected"属性失效的问题
2017/11/06 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
快速了解python leveldb
2018/01/18 Python
Python装饰器简单用法实例小结
2018/12/03 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
马来西亚网上购物:Youbeli
2018/03/30 全球购物
extern是什么意思
2016/03/10 面试题
创立科技Java面试题
2015/11/29 面试题
文明单位申报材料
2014/12/23 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
2015入党个人自传范文
2015/06/26 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
解决Pytorch中关于model.eval的问题
2021/05/22 Python