识别图书ISBN号并输出查询结果的示例
写了个技术原型,通过手机识别图书的ISBN条形码,然后通过豆瓣网的API,输出ISBN号对应的图书信息。
示例很简单,上来是个按钮,点击后,进入zxing的activity,用于扫描图书ISBN号。
使用zxing的扫描功能,这次还出现了点儿问题。我的nexus one摄像头比较脏了,造成对焦后无法识别,或者识别的很慢。吓了我一跳,因为以前没有问题的。
更换了几个版本zxing,问题依旧,擦拭了镜头,问题立刻得到了解决。
nexus one的像素和自动对焦能力,也可能包括cpu的处理因素,稍稍对中条码,立刻得到结果。之前的G1就要慢一些。
这也带来了捕获上面截图的困难,因为一瞬间扫描就结束了。怎么办呢?我用手在镜头上揉搓了几下,就可以了,哈哈。
提示找到图书后,通过豆瓣API,获取到图书的XML,这里要说,豆瓣的图书信息还是比较全的,我用国外图书也找到了信息。
因为使用联通WCDMA卡,整个过程很快。
下面说说代码中的一些要点。
如何扫描条形码
现在做条形码扫描,java一般用zxing。zxing有多种复用方式,最简单的方式是,安装zxing软件,通过google market。在自己的应用中,通过Intent调用zxing的扫描条码的Activity,然后将扫描到的结果返回自己的Activity。
比较复杂的办法是,将zxing库包含在自己的程序中,这比较适合正式的应用。
本文使用的是前者。
示例代码
示例源代码见:
http://easymorse.googlecode.com/svn/tags/sou.book-0.2
还有一个更为简单的示例,可用于理解调用zxing和豆瓣API的基本过程,见:
http://easymorse.googlecode.com/svn/tags/sou.book-0.1
实现activity跳转
在0.2版本中,涉及到3个activity,首先是搜索图书的activity,见最上面的图。点击按钮后,进入zxing的activity,从视觉上看,zxing获取到ISBN号后,进入了第三个activity,显示图书的详细信息。
其实,从zxing得到ISBN号以后,还是返回到搜索图书的activity,但是该activity马上发起新的intent,进入新的activity。另外,这里也演示了如果通过intent共享activity之间的参数。
以下代码创建新的activity,并设置参数:
Intent intent = new Intent();
intent.setClass(this, SearchBookActivity.class);
intent.putExtra("ISBN", data.getExtras().getString("SCAN_RESULT"));
this.startActivity(intent);
以下是从intent中获取到参数:
this.getIntent().getExtras().getString("ISBN");
有关zxing的使用,可以参考我另外一个示例,android扫描商品条形码。
webview使用本地页面的考虑
在显示图书查询结果的activity中,使用webview,这样显示可以做的比较灵活和简单。
显示页面有多种做法,比如可以是远程服务器上的页面,这要求有服务器端的支持。看起来这样比较省心,尤其是比如有iphone,有android等等异构终端的情况下。手机开发人员可以将这部分都空出来,交给服务器端去解决。而且是统一的解决方案。
但是,实践中,有两个问题:
- 服务器端开发人员要为不同手机客户端实现不同的样式,而且服务器端开发者往往并不配备手机设备,这也确实是难以做到的,难道要为一个做适配的服务器端开发人员配备iphone、android和s60手机么?
- 手机终端开发者无法灵活的控制webview中的细节,webview(这里指android环境,iphone环境类似的)支持通过javascript访问手机的服务或者对象,但这是平台相关的,android有自己的代码,iphone也有自己的代码,很难在服务器端统一解决。
我在这个原型中试图解决,即,HTML页面在手机端本地,手机端和服务器交互,只是取得数据,而不包含显示样式(也就是HTML页面的内容),手机端通过javascript,将取得的数据注入到本地页面中显示。
这种方式的好处是:
- 手机端和服务器端交互是获取数据,这是各种手机系统都通用的;
- 这种方式类似与AJAX,对数据流量的要求也会下降;
- 手机端开发人员可以灵活的决定页面的样式和交互动作。
在本例中,将html和css放置在项目的assets目录下,另外,该目录下,还有一张图片,用于未加载到图书图片时占位。想像一下,如果不使用webview,这个需求需要编程处理,是比较繁琐的,可参见android异步加载ListView中的图片中的处理。
实现webview的代码很简单,这是一个更简单的示例,见android编写简单的Webview。本例相关代码:
this.resultWeb = (WebView) this.findViewById(R.id.resultWeb);
this.resultWeb.getSettings().setSupportZoom(false);
this.resultWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(
true);
this.resultWeb.getSettings().setJavaScriptEnabled(true);
this.resultWeb.loadUrl(file:///android_asset/results.html);
这里要注意,setJavaScriptEnabled启用javascript,否则javascript无效。
android java与html页面中javascript互操作
javascript和java之间的通信问题,本例只通过javascript调用java,还是比较简单的。如果是java调用javascript,应该需要启动单独的线程来实现。
需要为webview对象创建一个javascript调用的接口对象:
this.resultWeb.addJavascriptInterface(new Object() {
public String getBookName() {
return bookInfo.getName();
}
public String getBookSummary() {
return bookInfo.getSummary();
}
public String getBookImageUrl() {
return bookInfo.getImageUrl();
}
public String getBookAuthor() {
return bookInfo.getAuthor();
}
}, "searchResult");
其中第一个参数是javascript调用的对象,第二个参数,是调用对象的名称。
看看javascript中怎样调用这个对象:
document.getElementById("bookName").innerHTML=window.searchResult.getBookName();
可以看到window对象多了个searchResult对象属性,这个searchResult就是上面方法中第二个参数。通过该名字,就调用到了上面第一个参数创建的内部类对象。
使用豆瓣API
豆瓣API官方网址:
http://www.douban.com/service/apidoc/
这里仅用到根据ISBN得到图书信息xml的功能。在这里:
http://www.douban.com/service/apidoc/reference/subject#获取书籍信息
如果匿名使用这个API,有一定的限制:
API调用被限制为每分钟请求不超过10次。
这里的调用次数是每ip地址的。对于手机应用来说,大于6秒钟扫描一次图书,应该是够用了。
解析豆瓣XML查询结果
对豆瓣的xml查询结果,使用了android自带的xmlpull api进行解析。
这里和android通过xmlpull解析xml稍有差别在于,后者是获取xml的属性值,这里是获取节点中的文本内容。
需要:
if (i == XmlPullParser.START_TAG
&& parser.getName().equals("attribute")
&& parser.getAttributeValue(0).equals("title")) {
bookInfo.setName(parser.nextText());
Log.v("soubook", "title>>" + bookInfo.getName());
continue;
}
通过parser.nextText()方法获取。另外,要注意在获取完毕后,continue结束本次循环。
HTML与CSS
本例中显示查询结果的webview使用了比较难看的灰色背景,主要是为了演示外部css可以很好的和html结合使用。
同理,也应该可以在html页面中引用外部的javascript,打算在下一个版本中加入jquery。
日志引用
- android应用之间依赖的解决办法
- 完善图书查询原型,增加收藏夹功能
识别图书ISBN号并输出查询结果的示例相关推荐
- 识别图书ISBN号并输出查询结果的示例 | Marshal's Blog
识别图书ISBN号并输出查询结果的示例 | Marshal's Blog 识别图书ISBN号并输出查询结果的示例 写了个技术原型,通过手机识别图书的ISBN条形码,然后通过豆瓣网的API,输出ISBN ...
- 国内图书分类号、国际图书分类号、DOI查询
最简单的方法就是找到跟你内容相似的论文看他们填的什么你也填写同样的内容 自己查找的网址: 中图分类号查询 | 中国图书馆分类法 | 中图法 | 中图分类号CLC,Chinese Library Cla ...
- 如何识别全部单号快递公司查询每个单号物流
一般快递单号比较多,如何快速导入单号,识别出快递公司并查询物流信息出来,下面给大家分享查询的技巧,一起来看操作方法. 需要哪些工具? 一台电脑 快递单号 开始操作: 操作前在浏览器中搜索[快递批量查询 ...
- 燕山大学数据结构与算法课程实践——ISBN号识别系统的设计与开发
项目背景 ISBN 号是国际标准书号的简称,它是国际标准化组织于 1972 年公布的一项国际通用的出版物统一编号方法.所有正规出版的普通图书版权页都有 ISBN 号, ISBN 是 i ...
- 燕山大学课程实践项目报告:ISBN号识别系统的设计与开发
文章目录 摘要 前言 正文 一.研究内容的基本原理 二.所采用的研究方法及相关工具 三.项目的方案设计 四.核心代码实现 1.读取图片 2.将原图转化为灰度图 3.去噪处理 4.迭代法求阈值 5.水平 ...
- 快递查询(快递单号智能识别/快递公司+快递单号)-完整提供 Demo 代码示例及数据专业且全面的 API 查询接口
更多资料请参考:www.woyaocha.net/product/express 查询说明 接口一:快递单号智能识别 快递单号智能识别,是根据查询的快递单号自动智能识别出该运单所属的快递公司,再获取快 ...
- 国内图书分类号 国际图书分类号查询
国内图书分类号http://www.ztflh.com/ 国际图书分类号查询http://www.udcc.org/udcsummary/php/index.php?id=36946&lang ...
- 国际图书分类号查询--国际十…
原文地址:国际图书分类号查询--国际十进制分类简表作者:sjn1985 国际图书分类号查询--国际十进制分类简表 0 Generalities 00 Prolegomena. Fundamental ...
- 图书条形码跟ISBN号互相转换的类(续)
图书条形码跟ISBN号互相转换的类 昨天晚上搞定条形码的图片绘制及保存,今天贴两张效果图: 运行时的样子: 保存结果: 暂时不太清楚转换为ISBN书号时,其中"-"的规则. 哪位大 ...
最新文章
- url指定服务器,Linux服务器设置定时任务来访问指定url
- float取整数部分_一步一步学Python3(小学生也适用) 第六篇: 变量及整数(int)类型...
- 临时节点不能有child 子节点
- Spring之HelloWorld
- scatter函数_散点图、箱线图、核密度函数……数据分析必备的9种可视化图表
- LaTeX——双栏论文插入图片
- selenium模拟登陆时截取验证码
- Android中常见布局
- Win7 启用 Telnet 功能
- 《Python密码学编程》——2.6 本书的文本换行
- 软件开发过程中需要的文档汇总
- mysql配置文件路径
- 分数阶微积分学薛定宇电子版_分数阶微积分 pdf epub mobi txt 下载
- 忘记准考证号获取四六级成绩的方法
- 【职场心灵鸡汤】以多年来拿最佳的心路历程来复盘【如何成为优秀的5%】
- OSChina 周三乱弹 —— 念念不忘,必有回响
- 显卡测试软件毛毛虫,ATI Radeon Xpress200M与Intel GMA950谁强些?
- win10系统如何连接宽带连接服务器,win10怎么连宽带_win10系统如何连接宽带
- C#.NET必备工具GhostDoc为代码生成注释文档
- CF #563 Div2 F. Ehab and the Big Finale //树链剖分(模板)+ 交互
热门文章
- Web3策展生态解读:谁是互联网文明的策展人?
- 电子书籍下载网站集锦(不断更新中...)
- 虚拟电厂可视化大屏,深挖痛点精准减碳
- 「数据密集型系统搭建」开卷篇|什么是数据密集型系统
- 华为荣耀10作为安卓手机程序开发真机
- Spring cloud系列十八 Spring Cloud 从Dalston.SR5到Greenwich.SR1 的升级记录
- [RK3288][Android6.0] 移植笔记 --- 固件无法下载到eMMC调试
- GOF23设计模式总结
- python基础练习之打飞机
- 我为什么要写博客,写博客的意义是什么