三步搞定: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之十一 添加事件核心方法
Jul 31 Javascript
基于JavaScript实现生成名片、链接等二维码
Sep 20 Javascript
Spring MVC中Ajax实现二级联动的简单实例
Jul 06 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
Oct 05 Javascript
详解Vue自定义过滤器的实现
Jan 10 Javascript
js判断手机系统是android还是ios
Mar 07 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
Apr 25 Javascript
JavaScript简介_动力节点Java学院整理
Jun 26 Javascript
webpack 从指定入口文件中提取公共文件的方法
Nov 13 Javascript
vue实现直播间点赞飘心效果的示例代码
Sep 20 Javascript
JS面向对象编程实现的Tab选项卡案例详解
Mar 03 Javascript
详解Vue router路由
Nov 20 Vue.js
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笔记之:AOP的应用
2013/04/24 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
php简单数据库操作类的封装
2017/06/08 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python复制文件操作实例详解
2015/11/10 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
研究生毕业鉴定
2014/01/29 职场文书
服务承诺口号
2014/05/22 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
英文产品推荐信
2015/03/27 职场文书
论文致谢词范文
2015/05/14 职场文书
贫困证明书范文
2015/06/16 职场文书
开学第一周值周总结
2015/07/16 职场文书
校园运动会广播稿
2015/08/19 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python