三步搞定: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 相关文章推荐
JavaScript 比较时间大小的代码
Apr 24 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
Feb 20 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
用原生js统计文本行数的简单示例
Aug 19 Javascript
canvas 弹幕效果(实例分享)
Jan 11 Javascript
详解vue与后端数据交互(ajax):vue-resource
Mar 16 Javascript
node.js部署之启动后台运行forever的方法
May 23 Javascript
还不懂递归?读完这篇文章保证你会懂
Jul 29 Javascript
jQuery实现的中英文切换功能示例
Jan 11 jQuery
layui使用form表单实现post请求页面跳转的方法
Sep 14 Javascript
vue引入静态js文件的方法
Jun 20 Javascript
Vue OpenLayer 为地图绘制风场效果
Apr 24 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轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
javascript中常用编程知识
2013/04/08 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
员工自我鉴定范文
2013/10/06 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
护理专业求职信
2014/06/15 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
会计实训总结范文
2015/08/03 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
详解python的内存分配机制
2021/05/10 Python