博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PhoneGap实践(Native Api调用 + 自定义Plugin(BarcodePlugin))
阅读量:5139 次
发布时间:2019-06-13

本文共 2246 字,大约阅读时间需要 7 分钟。

前一篇分析了PhoneGap的原理,这一篇将以一个实例来说一下如何用PhoneGap调用Native Api,以及自定义Plugin来调用PhoneGap Native Api中没有的功能(Barcode扫描)。

环境:Android2.2

第三方库:PhoneGap、zxing、jqueryMobile

 

功能:

1)在js中调用PhoneGap提供的NativeApi,navigator.contacts.find列表显示手机联系人信息。

2)由于PhoneGap的NativeApi中没有提供二维码的扫描功能,我们自定义BarcodePlugin,来实现在js中调用扫描二维码。

 

先上图:

       

 

查询手机联系人的关键代码:

1         
var options = 
new ContactFindOptions();
2         options.filter = "李";
3         options.multiple = 
true;
4         
var fields = ["displayName", "phoneNumbers", "emails"];
5         navigator.contacts.find(fields, onSuccess, onError, options);

其中,fields表示需要查询的联系人字段,onSuccess/onError是回调(因为这个调用是异步的),options是过滤条件,如果不传表示查询所有联系人。

 

 

自定义Plugin代码:

ExpandedBlockStart.gif
BarcodePlugin.java
 1 
public 
class BarcodePlugin 
extends Plugin
 2 {
 3     
private 
final 
int CODE_REQ_BARCODE = 1;
 4     
private 
final 
int WHAT_BARCODE_SCAN = 1;
 5     
private String text;
 6     
private Object synObj = 
new Object();
 7     
 8     
private Handler handler = 
new Handler()
 9     {
10         
public 
void handleMessage(Message msg)
11         {
12             
if(msg == 
null)
13             {
14                 
return;
15             }
16             
switch (msg.what)
17             {
18                 
case WHAT_BARCODE_SCAN:
19                     Intent intent = 
new Intent(ctx.getContext(), BarcodeActivity.
class);
20                     ctx.startActivityForResult(BarcodePlugin.
this, intent, CODE_REQ_BARCODE);
21                     
break;
22             }
23         };
24     };
25     
26     
public PluginResult execute(String action, JSONArray args, String callbackId)
27     {
28         text = "";
29         handler.sendEmptyMessage(WHAT_BARCODE_SCAN);
30         
31         sleep();
32 
33         
return 
new PluginResult(PluginResult.Status.OK, text);
34     }
35     
36     
public 
void onActivityResult(
int requestCode, 
int resultCode, Intent intent)
37     {
38         
if(requestCode == CODE_REQ_BARCODE)
39         {
40             
if(resultCode == Activity.RESULT_OK)
41             {
42                 text = intent.getExtras().getString("text");
43             }
44             weakup();
45         }
46         
else
47         {
48             
super.onActivityResult(requestCode, resultCode, intent);
49         }
50     }
51     
52     
private 
void sleep()
53     {
54         
try
55         {
56             
synchronized(synObj)
57             {
58                 synObj.wait();
59             }
60         }
61         
catch (InterruptedException e)
62         {
63             e.printStackTrace();
64         }
65     }
66     
67     
private 
void weakup()
68     {
69         
synchronized(synObj)
70         {
71             synObj.notify();
72         }
73     }
74 }

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

 

感兴趣的朋友可以在下载代码

 

 

 

转载于:https://www.cnblogs.com/java-koma/archive/2012/03/29/2423152.html

你可能感兴趣的文章
openstack源
查看>>
#2002 无法登录 MySQL 服务器
查看>>
vi - vim的一些遗忘点
查看>>
LeetCode -- Rotate List
查看>>
android学习笔记 :关于broadcast
查看>>
redis配置文件详解
查看>>
kafka 教程
查看>>
分布式技术追踪 2018年第十五期
查看>>
【转】键盘坏了,用注册表来修:Win7/XP修改注册表,替换按键映射
查看>>
Python之ML--模型评估与参数调优
查看>>
java反射方法解析JSON
查看>>
URL处理几个关键的函数parse_url、parse_str与http_build_query
查看>>
NPOI解析Excel
查看>>
基于layUI的图片上传前预览功能的2种实现方式
查看>>
MFC获取光标相对于控件所在行
查看>>
Ubuntu安装
查看>>
swap过高的问题解决
查看>>
ue4 编辑器记录
查看>>
分享一个JQuery写的点击上下滚动的小例子
查看>>
Python 知识点
查看>>