angel1994 发表于 2015-12-29 18:10:41

Android版添加phonegap--Native Api插件教程

环境:Android2.2
第三方库:PhoneGap、zxing、jqueryMobile

功能:
1)在js中调用PhoneGap提供的NativeApi,navigator.contacts.find列表显示手机联系人信息。
2)由于PhoneGap的NativeApi中没有提供二维码的扫描功能,我们自定义BarcodePlugin,来实现在js中调用扫描二维码。

查询手机联系人的关键代码:
var options = new ContactFindOptions();
options.filter = "李";
options.multiple = true;
var fields=["displayName", "phoneNumbers", "emails"];
navigator.contacts.find(fields, onSuccess, onError, options);
其中,fields表示需要查询的联系人字段,onSuccess/onError是回调(因为这个调用是异步的),options是过滤条件,如果不传表示查询所有联系人。

public class BarcodePlugin extends Plugin {
private final int CODE_REQ_BARCODE = 1;
private final int WHAT_BARCODE_SCAN = 1;
private String text;
private Object synObj = new Object();
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if(msg == null) {
return;
}
switch (msg.what) {
case WHAT_BARCODE_SCAN:
Intent intent=new Intent(ctx.getContext(), BarcodeActivity.class);
ctx.startActivityForResult(BarcodePlugin.this, intent, CODE_REQ_BARCODE);
break;
}
};
};
public PluginResult execute(String action, JSONArray args, String callbackId) {
text = "";
handler.sendEmptyMessage(WHAT_BARCODE_SCAN);
sleep();
return new PluginResult(PluginResult.Status.OK, text);
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if(requestCode == CODE_REQ_BARCODE) {
if(resultCode == Activity.RESULT_OK) {
text=intent.getExtras().getString("text");      
}
weakup();
} else{
super.onActivityResult(requestCode, resultCode, intent);
}
}
private void sleep() {
try {
synchronized(synObj) {
synObj.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void weakup(){
synchronized(synObj){
synObj.notify();
}
}
}

需要注意:execute()线程不是UI线程,不能执行UI操作(启动BarcodeActivity),这里交由handler来启动barcode扫描,然后execute线程睡眠,当扫描结束时,execute线程被唤醒,然后把扫描结果写到客户端。

KeyMob是国内专一的移动广告平台 ,基于强大的技术支持、优质的客服服务,为广告主提供精准的移动营销和应用推广服务,为应用开发者提供优质的广告展现并创造广告收入。
页: [1]
查看完整版本: Android版添加phonegap--Native Api插件教程