三步搞定: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 相关文章推荐
原生JS可拖动弹窗效果实例代码
Nov 09 Javascript
用jQuery toggleClass 实现鼠标移上变色
May 14 Javascript
AngularJS基础知识
Dec 21 Javascript
jQuery在ul中显示某个li索引号的方法
Mar 17 Javascript
JavaScript 数组- Array的方法总结(推荐)
Jul 21 Javascript
js绘制购物车抛物线动画
Nov 18 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
详解如何运行vue项目
Apr 15 Javascript
Vue响应式原理Observer、Dep、Watcher理解
Jun 06 Javascript
JS数组扁平化、去重、排序操作实例详解
Feb 24 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 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
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
vue Render中slots的使用的实例代码
2017/07/19 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
党的群众路线查摆剖析材料
2014/10/10 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
解析Java异步之call future
2021/06/14 Java/Android
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS