PhoneGap/cordvoa如何添加Media插件
phonegap由2.7升级到3.7之前,只要引入一个cordova.js,就可以了。现在由于所用的插件,都需要用模块的形式进行按需加载,自然就没有以前那么安逸了。
例如,如果要在安卓平台添加一个音频处理插件,除了要引入cordova.js之外,还要手动添加Media.js文件。这里有两种方式,一种是通过官方推荐的方式,使用
nodejs的命令行进行添加,另一种则是把Media.js用模块的方式直接粘贴到cordova.js中。
第一种方式要先安装nodejs,网上的教程都是基于nodejs+eclipse进行说明的。单是环境,我就搭了好半天,而且eclipse-SDK要翻墙才能下载,照网上的教程,貌似还要会一点java才行。总之,我没有成功,不过搞安卓的同事帮我测试成功了,生成了一堆的文件。对于这种方式了解一下就好了,后面我会重点讲第二种方式。

通过一系列的命令之后,nodejs给我们生成了一个重要的文件,就是在assets中,生成了cordova_plugins.js这个文件。这个文件的内容格式如下:
cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [
{
"file": "plugins/org.apache.cordova.media/www/MediaError.js",
"id": "org.apache.cordova.media.MediaError",
"clobbers": [
"window.MediaError"
]
}
}
实际上,cordova.js在init方法中,会自动去检查插件列表(cordova/plugin_list),如果里边定义了插件模块,那么cordova会依照file指定的路径去加载。这就是整个插件机制的秘密所在。这种按需加载确实很好,不过配置过程实在很烦。虽然代码精简了,但是对技术开发人员的要求更高了,自少你要会nodejs的一些基础知识才行,否则你连环境都搭不好,更不用说使用命令行操作了,坦白说,这种方式我不太接受。那除此之外,还有没有别的更简单的方式呢?经过我的研究,发现其实还是有的。于是,第二种方式就隆重出场了。
吼吼!,平复一下心情,go on ...
首先,我们看一下以前2.x版本的cordova.js(叫phonegap也行),它是把插件和cordova核心代码整合在一起的。那么我模仿它的方式把想要插件粘进去,不就可以了吗?一想到可以和nodejs那繁琐的操作说拜拜就有点激动!
仔细对比,所有的模块,都是用cordova.define('cordova/模块名', function(require, exports, module) {}这样的形式进行定义的。那么,我只要把Media.js中的内容也这样包装一下,就可以整合进去了。这样一来,连按需加载都省了。
cordova.define('cordova/plugins/Media', function(require, exports, module) {
//....此处的代码从Media.js中粘进来
}
可是光这样子还不行,报错了,说找不到plugin_list模块。这个简单,直接做一个空的模块进去占位就发好了。
cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = []
}
清除缓存,用eclipse重新编译,满心欢喜的期待着安卓手机可以听到美妙的音乐。可是我什么也没有听到,仔细找原因,发现只define是不行的,还要调用一下才行。
如果是用插件列表去自动加载的话,会自动注册列表中的插件,但是我这样投机取巧的方式,显然cordova是没法发现的。只有我自己人为去触发一下,这个操作也不难。
它自己就这么干过:window.cordova = require('cordova');于是我也照着写一个:window.Media = require(cordova/plugins/Media');果然,就有声音了。满心欢喜了好长一段时间,直到测试部发邮件给我,说声音播着播着就乱了。这下麻烦大了,我着实不知道是哪出了问题。只好又回到eclipse的工程模式中,仔细监测日志。发现有一些绿色的提示信息(console.log输出:org.apache.cordova.media.Media没有找到),当时没有引起我的警觉,我一直以为是java那边的问题,直到java那边确认没有问题之后,我才不得不检查js的问题。好了,我就不转弯子了,问题出来插件名的定义上。
改成如下方式就好了:
cordova.define('org.apache.cordova.media.Media', function(require, exports, module) {
//....此处的代码从Media.js中粘进来
}
至此,eclipse中就没刚才那行提示信息冒出来了,播放结束之后,也有了回调函数。完美收工。
我接着又加了一个org.apache.cordova.dialogs用于安卓上提供对话框,org.apache.cordova.console-via-logger 用于ios输出日志,都很成功。不过有一点需要注意,用“org.apache.cordova.xxx”定义的插件名是用来给全局的require("org.apache.cordova.xxx")调用的,它会自动注册插件名,如果是模块内部用的私有模块,或者说是依赖模块,那么还是按照cordova.define('cordova/xxxx', function(require, exports, module) {}) 这种方式来写。
例如org.apache.cordova.console-via-logger 这个插件,有一个依赖模块logger,那么还是用路径的形式定义,如:
define("cordova/plugin/logger", function(require, exports, module) {});
/************************日志插件**********************/
define("org.apache.cordova.console-via-logger", function(require, exports, module) {
//------------------------------------------------------------------------------
//内部使用的模块,用路径方式定义,然后用路径方式引入
var logger = require("cordova/plugin/logger");
那么问题又来了,你会问,这个插件名是哪里得知的呢?打开从git下载的插件文件,找到README.md ,里就有一个# org.apache.cordova.media,我就是从这里看到的。每个插件文件的说明中都有。
PhoneGap/cordvoa如何添加Media插件的更多相关文章
- Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flas
转自Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flash Player Chromium谷歌的开源浏览器将不再支持Netscape浏览器插件API,Adobe ...
- Emacs添加主题插件(Win系统)
Emacs添加主题插件(Win系统) */--> /* @licstart The following is the entire license notice for the JavaScri ...
- IntelliJ IDEA 添加junit插件
一.使用idea做junit测试需要添加junit插件 1.安装插件 File-->settings-->Plguins-->Browse repositories-->输入J ...
- atitit.MyEclipse10 中添加svn插件故障排除
atitit.MyEclipse10 中添加svn插件故障排除 删除\configuration \org.eclipse.update 不行... 二. 在configuration下的config ...
- JFinal 添加Druid插件
第一步:添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</a ...
- CORDOVA :添加cordova-plugin-file-opener2插件cordova打包报错
原文:CORDOVA :添加cordova-plugin-file-opener2插件cordova打包报错 最近在接触android项目,其中涉及到APP自动更新的问题,当新APP下载成功后需要打开 ...
- Android Studio 添加 Genymotion插件
原文:Android Studio 添加 Genymotion插件 1.下载Genymotion:官网地址,必须先注册才能下载,下载带有VirtualBox的版本 2.安装:安装时会连VirtualB ...
- Eclipse添加spring-tool-suite插件
Eclipse添加spring-tool-suite插件 步骤 1.help --> Eclipse Marketplace,在search框中搜索spring-tool-suite,点击右下角 ...
- Win7下安装VS2017、安装Qt5.10.1以及在VS2017添加qt插件
一.安装VS2017 1.下载VS2017 进入vs下载官网https://www.visualstudio.com/zh-hans/downloads/,选择所需要的vs版本,进行在线安装. 2.安 ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- servlet文件下载
创建web工程servlet,新建DownloadServlet.java package com.xmyself.servlet; import java.io.File; import java. ...
- Partition:分区切换(Switch)
在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...
- Spring之旅
Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...
- Android ViewPager打造3D画廊
本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 网上有很多关于使用Gallery来打造3D画廊的博客,但是在关于Gallery的官方说法中表明: This cl ...
- GPG终极指南(加密/签名)
我们平时都听过非对称加密,公钥和私钥,签名验证,但这些证书都是怎么得到的呢?本篇文章会解答这些问题. 背景介绍 加密的一个简单但又实用的任务就是发送加密电子邮件.多年来,为电子邮件进行加密的标准一直是 ...
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- js学习之函数的参数传递
我们都知道在 ECMAScript 中,数据类型分为原始类型(又称值类型/基本类型)和引用类型(又称对象类型):这里我将按照这两种类型分别对函数进行传参,看一下到底发生了什么. 参数的理解 首先,我们 ...
- Response.Redirect引起的性能问题分析
现象: 最近做的一个系统通过单点登录(SSO) 技术验证用户登录.用户在SSO 系统上通过验证后,跳转到该系统的不同模块.而跳转的时间一直维持子啊几分钟左右. 分析步骤: 在问题复现时抓取Hang d ...