三步搞定: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 相关文章推荐
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
Jul 10 Javascript
用jquery.sortElements实现table排序
May 04 Javascript
js实现鼠标划过给div加透明度的方法
May 25 Javascript
一道关于JavaScript变量作用域的面试题
Mar 08 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
AngularJS模仿Form表单提交的实现代码
Dec 08 Javascript
Node.js用readline模块实现输入输出
Dec 16 Javascript
AngularJS改变元素显示状态
Apr 20 Javascript
JavaScript创建对象_动力节点Java学院整理
Jun 27 Javascript
JavaScript设计模式之单例模式简单实例教程
Jul 02 Javascript
详解如何更好的使用module vuex
Mar 27 Javascript
JavaScript图片旋转效果实现方法详解
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
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
Js基础学习资料
2010/11/23 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
详解NODEJS的http实现
2018/01/04 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
2018/01/12 NodeJs
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
Vue 设置axios请求格式为form-data的操作步骤
2019/10/29 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
纯JS实现五子棋游戏
2020/05/28 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python实现DDos攻击实例详解
2019/02/02 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
数据库笔试题
2013/05/09 面试题
函授本科个人自我鉴定
2014/03/25 职场文书
经理任命书模板
2014/06/06 职场文书
高中教师个人总结
2015/02/10 职场文书
公司晚会主持词
2019/04/17 职场文书