三步搞定: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 29 Javascript
javascript  Error 对象 错误处理
May 18 Javascript
top.location.href 没有权限 解决方法
Aug 05 Javascript
HTML 自动伸缩的表格Table js实现
Apr 01 Javascript
JQuery困惑—包装集 DOM节点
Oct 16 Javascript
js获取或设置当前窗口url参数的小例子
Oct 14 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
Sep 06 Javascript
js利用appendChild对标签进行排序的实现方法
Oct 16 Javascript
js实现简单的网页换肤效果
Jan 18 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
Oct 20 Javascript
vue用递归组件写树形控件的实例代码
Jul 19 Javascript
vue实现图片上传功能
May 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
PHP初学入门
2006/11/19 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
2015/10/01 Javascript
js数组实现权重概率分配
2017/09/12 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
微信小程序常见页面跳转操作简单示例
2019/05/01 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
在Django框架中运行Python应用全攻略
2015/07/17 Python
K-means聚类算法介绍与利用python实现的代码示例
2017/11/13 Python
wxPython之解决闪烁的问题
2018/01/15 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
Python中extend和append的区别讲解
2019/01/24 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
初学者学习Python好还是Java好
2020/05/26 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
公关活动策划方案
2014/05/25 职场文书
个人作风建设心得体会
2014/10/22 职场文书
2015年党员承诺书
2015/01/21 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
文艺委员竞选稿
2015/11/19 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python