三步搞定: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 相关文章推荐
强制设为首页代码
Jun 19 Javascript
tangram框架响应式加载图片方法
Nov 21 Javascript
jquery实现select下拉框美化特效代码分享
Aug 18 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
Nov 21 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
Dec 24 Javascript
详解jQuery的Cookie插件
Nov 23 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
ES6新特性一: let和const命令详解
Apr 20 Javascript
AngularJS入门教程一:路由用法初探
May 27 Javascript
微信小程序实现流程进度的图样式功能
Jan 16 Javascript
彻底揭秘keep-alive原理(小结)
May 05 Javascript
vue 实现用户登录方式的切换功能
Apr 14 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接口和抽象类使用示例详解
2014/03/02 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
Ext.MessageBox工具类简介
2009/12/10 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
用Node写一条配置环境的指令
2019/11/14 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
使用Python编写一个最基础的代码解释器的要点解析
2016/07/12 Python
Python类属性的延迟计算
2016/10/22 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
Python版名片管理系统
2018/11/30 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
香港通票:Hong Kong Pass
2019/02/26 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
交通安全演讲稿
2014/01/07 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
贷款收入证明范本
2015/06/12 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js