android提供了一种机制,可以通过Intent复用多个应用的界面。比如可以在自己的应用中调用条形码识别程序zxing,然后返回条形码的结果。
不过呢,这需要系统必须事先在手机上安装zxing的条码扫描工具。否则,会报告ActivityNotFoundException。
对于zxing来讲,提供了一个集成API,使用者可以通过这个集成API调用ZXING的条码Activity。如果开发使用zxing的应用程序,并且分发给消费者使用。不能确定用户是否已经安装zxing。那么应该:
如果用户已经安装zxing,则使用zxing的activity;
如果用户没有安装zxing,提示用户安装,并引导用户通过android market下载安装。
zxing已经考虑的这个需求,在代码库中提供了这方面的支持。见:
http://code.google.com/p/zxing/wiki/ScanningViaIntent
的IntentIntegrator部分。
可以将:
http://code.google.com/p/zxing/source/browse/trunk/android-integration/src/com/google/zxing/integration/android
目录下的两个类,复制到自己项目中即可。
可参见我写的简单示例:
http://easymorse.googlecode.com/svn/tags/android.zxing.install-0.1/
那么,当未安装zxing情况下,点击如下按钮:
将弹出提示框:
点击yes,会引导进入android market下载安装zxing条码工具。
其实看看源代码,可以发现,zxing的集成API,无非是在启动zxing activity的时候,捕获了ActivityNotFoundException,然后通过intent调用android market应用安装。
应该说,还有一种办法来集成zxing,那就是把zxing作为类库加入到自己应用程序的APK中,在:
http://code.google.com/p/zxing/wiki/InterestingLinks
的projects and products using zxing的android部分,可以看到既有通过intent调用的(见 via intent),也有embedded,即将zxing库嵌入到应用中的。
后者的缺点有两个:
如果zxing版本更新,需要重新打自己应用的包,更新zxing的类库包;
旧版本的zxing包嵌入在应用中,可能不支持比较新的设备。
因此,我们在开发中选择比较轻量级的做法,通过intent的方式使用zxing。
这种方式我们也会用于其他类似场合,在需要别的应用程序activity的时候。