三步搞定: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 相关文章推荐
腾讯的ip接口 方便获取当前用户的ip地理位置
Nov 25 Javascript
关于JS管理作用域的问题
Apr 10 Javascript
Javascript学习指南
Dec 01 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
js生成验证码并直接在前端判断
May 15 Javascript
jquery使用经验小结
May 20 Javascript
JS动态日期时间的获取方法
Sep 28 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
Jun 01 Javascript
星期几的不同脚本写法(推荐)
Jun 01 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
Aug 10 jQuery
javascript中floor使用方法总结
Feb 02 Javascript
vue实现公共方法抽离
Jul 31 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
在线增减.htpasswd内的用户
2006/10/09 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
arguments对象
2006/11/20 Javascript
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
python实现计算器功能
2019/10/31 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
python从Oracle读取数据生成图表
2020/10/14 Python
Python读写Excel表格的方法
2021/03/02 Python
vue路由实现登录拦截
2021/03/24 Vue.js
生物技术专业研究生自荐信
2013/09/22 职场文书
销售行业个人求职自荐信
2013/09/25 职场文书
党课学习思想汇报
2014/01/02 职场文书
培训讲师邀请函
2014/01/10 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
教师中国梦演讲稿
2014/04/23 职场文书
Python基础详解之描述符
2021/04/28 Python
Python中json.dumps()函数的使用解析
2021/05/17 Python