三步搞定:Vue.js调用Android原生操作
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
第一步: Android对Js的接口,新建AndroidInterfaceForJs.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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模块,然后使用
1 2 3 4 5 6 | import {android} from '../app' try { android.callAndroid( '调用成功,耶!!!' ) } catch (e) { console.log( '出现错误, 如果在非android环境下访问, 出现该警告是正常的.' ) } |
补充知识:vue与原生安卓相互调用
最近公司有做直播类的项目,由于直播框架限制,限制所用的技术是vue搭建的H5页面嵌入到原生安卓中。由于之前没有过类似的混合开发经验,所以今天写篇博客加深下印象。
vue.js调用安卓方法
先将vue项目放到一个内网地址或者外网地址中,然后安卓端通过“webView.loadUrl()”将vue项目引入。安卓端将要调用的方法名暴露在window对象中,由vue直接在methods中调用并携带参数。
1 2 3 4 5 6 | methods:{ goPublish(){ //将vue项目引入至安卓代码中,安卓方法暴露在window中,vue中可以直接用window去调取方法。 window.android.callAndroidMethod( '1' , '2' ) } } |
安卓调用vue.js中的方法
同样的vue也需要把方法添加到window中去,再由安卓端去调取方法。
1 2 3 4 5 6 7 8 9 10 | created(){ //需要在created钩子中将方法添加到window对象中 window.setFun = this .setFun; }, methods:{ setFun(arg) { //arg: 原生调用Vue时传值(arg)给Vue console.log( "获取到android的传参:" + arg); }, } |
以上就是vue与安卓端项目调用的大致方法,有用词不当的地方望海涵且不吝指正。希望能给大家一个参考,也希望大家多多支持脚本之家。
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
vue项目启动出现cannot GET /服务错误的解决方法
这篇文章主要介绍了vue项目启动出现cannot GET /服务错误的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-04-04
最新评论