`
dinguangx
  • 浏览: 245643 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【Cordova2.9】 扩展Contacts插件实现按ID查询

阅读更多

      PhoneGap(Cordova)的通讯录插件(contacts & Contact)提供了对本地通讯录的数据检索(contacts.find)、新增(Contact.save)和删除(Contact.remove)等功能,基本实现了对本地通讯录的CRUD操作。但是在使用过程中,发现该插件并不支持对特定ID的检索功能。典型的场景是在用find()操作获取到所有的通讯录信息之后,点击指定的条目,需要查询的是该条目对应的所有信息,这时就需要通过特定ID来进行数据检索。

find()操作中,接收两个参数fieldsoptions,分别用来表示检索结果要包含的字段以及过滤条件。通过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
    }]
}

 

1
0
分享到:
评论

相关推荐

    基于Cordova 写的WebView插件,可以调用Cordova插件

    插件调用都只能调用本地的html,这个功能就是为了Cordova能调用远程的HTML页面,这样的话,一些逻辑可以放在服务器上,不需要全部打包放在app中,同时远程的html可以调用插件,调用方式同一般的cordova插件。

    cordova二维码扫描插件

    总的来说,"Cordova二维码扫描插件"是一个高效、易用的解决方案,对于需要在Ionic、PhoneGap或其他基于Cordova的混合APP中实现二维码扫描功能的开发者来说,是一个理想的选择。它的出色设计和广泛兼容性使得开发者...

    cordova显示角标插件

    总的来说,"cordova-plugin-badge"插件是Cordova开发者用来在应用图标上显示通知数量的实用工具,通过简单的API调用即可实现角标的设置和管理。结合你的后端服务和消息推送机制,你可以在用户未打开应用时,通过角标...

    cordova3.0 ios自定义插件demo

    Cordova 3.0 是一个跨平台的移动应用开发框架,它允许开发者使用HTML、CSS和JavaScript来构建原生的移动应用。...通过实践这个demo,开发者可以提升混合应用开发的能力,更好地利用Cordova框架实现跨平台的移动应用。

    Android Cordova 插件开发之编写自定义插件

    在 Android 上开发 Cordova 插件,开发者可以将自己的 Java 代码与 JavaScript 交互,扩展 Cordova 应用的功能。本篇将深入探讨如何编写自定义的 Cordova 插件。 一、理解 Cordova 插件机制 Cordova 插件是连接 ...

    自定义cordova插件

    而“自定义Cordova插件”则意味着我们需要扩展Cordova的功能,以满足特定的应用需求。 当我们谈论自定义Cordova插件时,通常是因为Cordova默认提供的插件无法满足我们的全部需求,或者我们需要与特定的后端服务或...

    Cordova 常用命令及插件

    Android 移动端混合开发之Cordova 常用命令及插件,包括安装、调试及运行,及插件开发命令,设备查找命令

    phonegap/Cordova和android自定义插件模块,cordova build后插件不会消失

    自定义插件则是扩展这个桥梁功能的方式,允许开发者为自己的应用添加特定的原生功能。 **创建自定义插件** 1. **创建Java类**:在Android项目中的`src/main/java`目录下,创建一个新的Java类,继承自CordovaPlugin...

    cordova-screenshot cordova截屏插件

    cordova-screenshot cordova截屏插件 document.addEventListener("deviceready", init, false); function init() { document.querySelector("#share").addEventListener("touchend", function() { navigator....

    cordova自定义插件

    在Cordova中,自定义插件是扩展其功能的关键机制,它们提供了JavaScript和原生平台代码之间的桥梁,使得Web应用程序能够访问设备的硬件特性和原生API。 ### 1. Cordova插件的基本结构 一个Cordova插件通常包含以下...

    Android版cordova人脸识别插件

    本文将深入探讨一个特定的 Android 版 Cordova 插件——人脸识别插件,以及如何在实际项目中使用它。 首先,让我们理解人脸识别技术的基本原理。人脸识别是一种生物特征识别技术,它基于人的面部特征信息进行身份...

    cordova ios 自定义插件例子

    iOS 平台是 Cordova 支持的重要部分,而自定义插件则是扩展 Cordova 应用功能的关键手段。这个"cordova ios 自定义插件例子"是一个适合新手入门的学习资源,它会引导你了解如何为 iOS 平台创建和使用自定义 Cordova ...

    支持android 蓝牙设备插件 cordova的插件

    首先,Cordova的蓝牙插件通常是为了扩展Cordova应用程序的原生功能,使得JavaScript能够调用Android API进行蓝牙操作。这些操作可能包括扫描蓝牙低功耗(BLE)设备、连接、发送和接收数据,以及管理蓝牙状态等。对于...

    cordova框架以及插件

    3. **插件开发**:学习如何查找、安装、管理和自定义 Cordova 插件,以实现所需的功能。 4. **多平台开发**:掌握如何在不同平台上(如 iOS、Android)测试和部署应用。 5. **PhoneGap 相关**:如果需要,可以研究 ...

    PhoneGap/Cordova的支付宝Android插件

    这个插件的目的是桥接JavaScript和Android原生代码,使PhoneGap/Cordova应用能够调用支付宝SDK,实现支付流程。 集成这个插件的过程大致如下: 1. **安装插件**:首先,开发者需要在项目的配置文件(config.xml)...

    cordova 原生拨号插件

    总的来说,这个Cordova原生拨号插件为开发者提供了一种简单的方式,将Web应用的功能扩展到设备的电话拨号上,提高了应用的实用性和用户体验。正确理解和使用插件的API以及处理好权限和平台兼容性,能确保你的Cordova...

    百度地图定位Cordova插件

    【百度地图定位Cordova插件】是专门为Cordova框架设计的一款插件,它允许开发者集成百度地图服务到他们的移动应用程序中,实现精准的定位功能。Cordova是一个流行的开源框架,它使得开发者可以使用HTML5、CSS3和...

    cordova源码和JAR包.zip

    cordova 2.9 3.3 jar 2.9源码

Global site tag (gtag.js) - Google Analytics