PhoneGap(Cordova)的通讯录插件(contacts & Contact)提供了对本地通讯录的数据检索(contacts.find)、新增(Contact.save)和删除(Contact.remove)等功能,基本实现了对本地通讯录的CRUD操作。但是在使用过程中,发现该插件并不支持对特定ID的检索功能。典型的场景是在用find()操作获取到所有的通讯录信息之后,点击指定的条目,需要查询的是该条目对应的所有信息,这时就需要通过特定ID来进行数据检索。
在find()操作中,接收两个参数fields,options,分别用来表示检索结果要包含的字段以及过滤条件。通过phonegap的源码可以看出,它对通讯录的检索条件是根据fields来做的,如果fields的值为[“*”],就在所有的字段中匹配options;如果fields的内容是一个普通的字符串数组,就在该数组所表示的字段中匹配options,返回的结果中只会包括fields数组中所给定的列信息。也就是说,find()操作并不能完成对特定ID的数据检索。只能通过自行扩展该插件来实现。
下面是对该插件的扩展,通过对该插件的扩展实现,也对PhoneGap的插件机制以及对原生插件的扩展有了全面的掌握。
首先是扩展现有的ContactManager类:
/** * 扩展ContactManager插件,实现附加的一些功能 * * @author dylan * */ public class ContactManagerExtend extends ContactManager { private ContactAccessor contactAccessor; private static final String LOG_TAG = "Contact Query"; @Override public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException { boolean res = super.execute(action, args, callbackContext); if (!res) { // not support by parent if (this.contactAccessor == null) { this.contactAccessor = new ContactAccessorSdk5(this.webView, this.cordova); } if ("findById".equals(action)) { final String contactId = args.getString(0); Log.v(LOG_TAG, "find contact by ID[" + contactId+"]"); this.cordova.getThreadPool().execute(new Runnable() { public void run() { JSONObject res = null; if (contactId != null) { try { res = contactAccessor.getContactById(contactId); } catch (JSONException e) { Log.e(LOG_TAG, "JSON fail.", e); } } if (res != null) { callbackContext.success(res); } else { callbackContext.sendPluginResult(new PluginResult( PluginResult.Status.ERROR, UNKNOWN_ERROR)); } } }); } else { return false; } } return true; } }
在该类中,重写了父类的execute(action,args,context),用于在父类不支持当前action时,接管程序的执行。
然后在config.xml中将插件类替换为我们的扩展类:
<feature name="Contacts"> <!-- <param name="android-package" value="org.apache.cordova.ContactManager"/> --> <param name="android-package" value="org.dylan.phonegap.plugins.ContactManagerExtend"/> </feature>
同步地,在前台js中扩展contacts插件,增加对findById()的支持:
(function(cordova) { var exec = cordova.require("cordova/exec"); var argscheck = cordova.require('cordova/argscheck'); var contacts = cordova.require("cordova/plugin/contacts"); /** * contacts plugin: findById */ contacts.findById = function(contactId, successCB, failCB) { argscheck.checkArgs('SFF', 'contacts.findById', arguments); console.log("find contact by id["+contactId+"]"); if (!contactId) { failCB && failCB(new ContactError( ContactError.INVALID_ARGUMENT_ERROR)); } else { var win = function(result) { var model = null; if (result) { model = contacts.create(result); } successCB(model); }; exec(win, failCB, "Contacts", "findById", [ contactId ]); } }; })(cordova);
前台页面中调用该函数的代码为:
navigator.contacts.findById(contactId, function(contact){ console.log("success..." + contact.displayName); //do something }, function(){ alert("Find Failed!"); });
至此,对通讯录插件的扩展完成;findById()方法将会返回Contact支持的所有信息。
附:Contact信息格式(参考http://www.gafish.net/archives/990)
{ 'id': '1', 'rawId': '17', 'name': { 'familyName': '加', 'formatted': '加菲 ', 'givenName': '菲', 'middleName': '', 'honorificPrefix': '', 'honorificSuffix': '' }, 'displayName': 'Gafish', 'nickname': '加菲', 'birthday': '1999/01/01', 'note': 'xx是个好东西', 'phoneNumbers': [{ 'id': '1', 'type': 'mobile', 'value': '13888888888', 'pref': false }], 'emails': [{ 'id': '1', 'type': 'home', 'value': 'gafish@xx.com', 'pref': false }], 'addresses': [{ 'id': '1', 'type': 'home', 'pref': false, 'postalCode': '310000', 'formatted': 'xx路xx号xx大厦', 'locality': '杭州', 'region': '浙江', 'country': '中国' }], 'ims': [{ 'id': '1', 'type': 'qq', 'value': '88888888', 'pref': false }], 'organizations': [{ 'id': '1', 'type': 'work', 'title': 'xx工程师', 'department': 'xx部', 'name': 'xx公司' 'pref': false, }], 'photos': [{ 'type': 'url', 'id': '1', 'value': 'photo8.jpg', 'pref': false }], 'categories': [{ 'id': '1', 'type': '', 'value': 'Business', 'pref': false }], 'urls': [{ 'id': '1', 'type': 'work', 'value': 'www.gafish.net', 'pref': false }] }
相关推荐
Android 移动端混合开发之Cordova 常用命令及插件,包括安装、调试及运行,及插件开发命令,设备查找命令
cordova-screenshot cordova截屏插件 document.addEventListener("deviceready", init, false); function init() { document.querySelector("#share").addEventListener("touchend", function() { navigator....
插件调用都只能调用本地的html,这个功能就是为了Cordova能调用远程的HTML页面,这样的话,一些逻辑可以放在服务器上,不需要全部打包放在app中,同时远程的html可以调用插件,调用方式同一般的cordova插件。
phonegap/Cordova和android自定义插件模块,cordova build后插件不会消失
cordova3.0版本以上ios自定义插件demo及插件
cordova 2.9 3.3 jar 2.9源码
PhoneGap/Cordova的支付宝Android插件
支持android 蓝牙设备插件 cordova的插件 支持android 蓝牙设备插件 cordova的插件
该资源是我学习使用Cordova自定义插件的完整源码,里面包含创建cordova项目,自定义插件等
Android版cordova人脸识别插件,调用摄像头自动进行人脸拍照,把图片Base64处理发送给百度服务端进行照片识别,如果达到可信任的分数就代表认证通过。
cordova ios 自定义插件例子,新手入门用
Android Cordova 插件开发之编写自定义插件源码
自定义Cordova插件,开源的插件不满足需求时,可以自己开发自己的插件
在安卓项目整合Cordova 时,安装的Cordova插件下载
cordova添加自定义插件demo,有问题请留言http://www.cnblogs.com/tutuskys/p/5012062.html
cordova-imagePicker, Cordova插件,用于多图像选择 cordova-imagepicker为iOS和安卓 4.0及上版本实现的多个图像选择的Cordova插件。安装插件插件符合Cordova插件规范,它可以使用 Cordova/phonegap 命令行 接口安装...
cordova调用安卓原生activity插件 使用简介 JS端使用方式 //sendData表示要从js端发送到原生activity的数据,需用json对象传输 var sendData = { id:10001, name:"Simon", age:28 }; window.cordova.plugins....
cordova-android保存图片插件,不知道为何不适用ios,仅供参考
cordova插件,调用原生拨号功能,操作说明在readme文件内
cordova开发的APP,需要在图标上显示通知数量的插件。