亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

識別圖書ISBN號并輸出查詢結果的示例

系統 2195 0

識別圖書ISBN號并輸出查詢結果的示例 - archfree的專欄 - 博客頻道 - CSDN.NET

識別圖書ISBN號并輸出查詢結果的示例

分類: java 二維碼識讀 1247人閱讀 評論 (0) 收藏 舉報

識別圖書ISBN號并輸出查詢結果的示例

寫了個技術原型,通過手機識別圖書的ISBN條形碼,然后通過豆瓣網的API,輸出ISBN號對應的圖書信息。

image

示例很簡單,上來是個按鈕,點擊后,進入zxing的activity,用于掃描圖書ISBN號。

image

使用zxing的掃描功能,這次還出現了點兒問題。我的nexus one攝像頭比較臟了,造成對焦后無法識別,或者識別的很慢。嚇了我一跳,因為以前沒有問題的。

更換了幾個版本zxing,問題依舊,擦拭了鏡頭,問題立刻得到了解決。

nexus one的像素和自動對焦能力,也可能包括cpu的處理因素,稍稍對中條碼,立刻得到結果。之前的G1就要慢一些。

這也帶來了捕獲上面截圖的困難,因為一瞬間掃描就結束了。怎么辦呢?我用手在鏡頭上揉搓了幾下,就可以了,哈哈。

image

提示找到圖書后,通過豆瓣API,獲取到圖書的XML,這里要說,豆瓣的圖書信息還是比較全的,我用國外圖書也找到了信息。

image

因為使用聯通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。

識別圖書ISBN號并輸出查詢結果的示例


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 视频一区二区欧美日韩在线 | 日本视频在线观看不卡高清免费 | 日韩在线视频一区 | 久久不卡| 天码毛片一区二区三区入口 | 拍真实国产伦偷精品 | 四虎麻豆| 99热.| 久久精品国产2020观看福利色 | 免费爱爱片 | 亚洲精品视频免费在线观看 | 国产亚洲精品激情都市 | 欧美午夜伦y4480私人影院 | 99国产欧美久久精品 | 五月婷婷狠狠干 | 在线欧美精品国产综合五月 | 国产高清a毛片在线看 | 亚洲免费一级视频 | a级毛片免费完整视频 | 亚洲国产精品网站久久 | 99这里都是精品 | 性视频一区二区三区免费 | 国产精品不卡在线 | 亚洲欧洲视频 | 日本成人二区 | www.四虎.com | 久久99亚洲精品久久频 | 欧美亚洲另类色国产综合 | 久久国产影院 | 国内精品伊人久久久影院 | 国产在线干 | 久久久久夜夜夜精品国产 | 激情五月婷婷综合 | 五月在线视频 | 四虎在线视频观看大全影视 | 日韩国产精品视频 | 国产精品成人观看视频网站 | 在线久综合色手机在线播放 | 欧美激情在线观看一区二区三区 | 99热在线免费 | xxxx成年视频免费 |