使用Zxing及豆瓣API

 本文原創,轉載請註明原文地址:http://maosidiaoxian.iteye.com/blog/1743296或我在sinaapp上的博客:http://msdxblog.sinaapp.com/?p=716。

最近在作團隊圖書管理的一個Android端。由於須要經過手機掃描來輸入圖書信息(人工一條一條地輸入,做爲技術人員太受不了了),須要使用ZXing的API掃描圖書ISBN,及使用豆瓣API來獲取圖書信息。

因爲時間關係,這裏沒有使用ZXing的jar包,而是下載並安裝了它的開源項目——條碼掃描器,而後調用裏面的Activity掃描再獲取結果。
首先到市場下載Barcode Scaner(或搜索條碼掃描器),下載安裝。
下面先貼上Activity的佈局代碼,由於是demo版,並且在內部使用,就沒去好好作佈局設計,只是把須要的控件都寫上。java

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6.  
  7. <Button
  8. android:id="@+id/home_scan"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="@string/button_scan" />
  12.  
  13. <TextView
  14. android:id="@+id/home_result_scan"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content" />
  17.  
  18. <TextView
  19. android:id="@+id/home_book_info"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content" />
  22.  
  23. <Button
  24. android:id="@+id/home_upload_result"
  25. android:layout_width="wrap_content"
  26. android:layout_height="wrap_content"
  27. android:text="@string/button_upload" />
  28.  
  29. <TextView
  30. android:id="@+id/home_result_upload"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:singleLine="false" />
  34.  
  35. <LinearLayout
  36. android:layout_width="fill_parent"
  37. android:layout_height="wrap_content" >
  38.  
  39. <Button
  40. android:id="@+id/home_borrow_book"
  41. android:layout_width="wrap_content"
  42. android:layout_height="wrap_content"
  43. android:text="@string/borrow_book" />
  44.  
  45. <Spinner
  46. android:id="@+id/home_users"
  47. android:layout_width="wrap_content"
  48. android:layout_height="wrap_content"
  49. android:layout_gravity="right" />
  50. </LinearLayout>
  51.  
  52. <Button
  53. android:id="@+id/home_return_book"
  54. android:layout_width="wrap_content"
  55. android:layout_height="wrap_content"
  56. android:text="@string/return_book" />
  57.  
  58. <Button
  59. android:id="@+id/home_user_manager"
  60. android:layout_width="wrap_content"
  61. android:text="@string/manager_user"
  62. android:layout_height="wrap_content" />
  63.  
  64. </LinearLayout>



而後在咱們的項目中,寫一個Activity來調用Zxing的掃描功能,並經過它返回的結果訪問互聯網獲取信息。

下面是該Activity的代碼。這裏對於控件及事件的綁定,我使用了本身封裝的一個工具(Androidkit)來簡化這些代碼,因此大家會看到許多相似@AndroidView的註解,這個工具能夠在http://code.google.com/p/cfuture-androidkit/獲取,或從https://github.com/msdx/androidkit上得到最新代碼。android

Java代碼 複製代碼 收藏代碼
  1. /*
  2. * @(#)HomeActivity.java Project:bookscan
  3. * Date:2012-12-3
  4. *
  5. * Copyright (c) 2011 CFuture09, Institute of Software,
  6. * Guangdong Ocean University, Zhanjiang, GuangDong, China.
  7. * All rights reserved.
  8. *
  9. * Licensed under the Apache License, Version 2.0 (the "License");
  10. * you may not use this file except in compliance with the License.
  11. * You may obtain a copy of the License at
  12. *
  13. * http://www.apache.org/licenses/LICENSE-2.0
  14. *
  15. * Unless required by applicable law or agreed to in writing, software
  16. * distributed under the License is distributed on an "AS IS" BASIS,
  17. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. * See the License for the specific language governing permissions and
  19. * limitations under the License.
  20. */
  21. package com.sinaapp.msdxblog.bookscan.activity;
  22.  
  23. import org.apache.http.HttpResponse;
  24. import org.apache.http.client.methods.HttpGet;
  25. import org.apache.http.impl.client.DefaultHttpClient;
  26.  
  27. import android.app.Activity;
  28. import android.content.Intent;
  29. import android.database.Cursor;
  30. import android.os.Bundle;
  31. import android.os.Handler;
  32. import android.view.View;
  33. import android.widget.SimpleCursorAdapter;
  34. import android.widget.Spinner;
  35. import android.widget.TextView;
  36.  
  37. import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;
  38. import com.sinaapp.msdxblog.androidkit.ui.ResBindUtil;
  39. import com.sinaapp.msdxblog.androidkit.ui.UIBindUtil;
  40. import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidRes;
  41. import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidRes.ResType;
  42. import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidView;
  43. import com.sinaapp.msdxblog.androidkit.ui.annotation.OnClick;
  44. import com.sinaapp.msdxblog.bookscan.R;
  45. import com.sinaapp.msdxblog.bookscan.bean.Book;
  46. import com.sinaapp.msdxblog.bookscan.util.DB;
  47. import com.sinaapp.msdxblog.bookscan.util.XMLSax;
  48.  
  49. /**
  50. * @author Geek_Soledad (66704238@51uc.com)
  51. */
  52. public class HomeActivity extends Activity {
  53. private static final int HOME_ACTIVITY = 1990;
  54. private static final String DOUBAN_API = "http://api.douban.com/book/subject/isbn/";
  55.  
  56. @AndroidView(id = R.id.home_result_scan)
  57. private TextView mTextScan;
  58. @AndroidView(id = R.id.home_book_info)
  59. private TextView mTextBook;
  60. @AndroidView(id = R.id.home_result_upload)
  61. private TextView mTextUpload;
  62. @AndroidView(id = R.id.home_users)
  63. private Spinner mSpinnerUser;
  64.  
  65. @AndroidRes(id = R.string.result_scan, type = ResType.STRING)
  66. private String mStringScan;
  67. @AndroidRes(id = R.string.result_getting, type = ResType.STRING)
  68. private String mStringGetting;
  69. @AndroidRes(id = R.string.book_info, type = ResType.STRING)
  70. private String mStringBookInfo;
  71.  
  72. private Handler mGettingBook;
  73. private Book book;
  74. private DB mDb;
  75. private SimpleCursorAdapter mAdapter;
  76.  
  77. @Override
  78. protected void onCreate(Bundle savedInstanceState) {
  79. super.onCreate(savedInstanceState);
  80. UIBindUtil.bind(this, R.layout.activity_home);
  81. ResBindUtil.bindAllRes(this);
  82. init();
  83. }
  84.  
  85. /**
  86. * 初始化參數。
  87. */
  88. private final void init() {
  89. mGettingBook = HandlerFactory.getNewHandlerInOtherThread("book");
  90. mDb = new DB(this);
  91. Cursor users = mDb.getAllUser();
  92. startManagingCursor(users);
  93. mAdapter = new SimpleCursorAdapter(this,
  94. android.R.layout.simple_spinner_item, users,
  95. new String[] { "username" }, new int[] { android.R.id.text1 });
  96. mAdapter
  97. .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  98. mSpinnerUser.setAdapter(mAdapter);
  99.  
  100. }
  101.  
  102. @OnClick(viewId = { R.id.home_scan, R.id.home_upload_result,
  103. R.id.home_borrow_book, R.id.home_return_book,
  104. R.id.home_user_manager })
  105. public void onButtonClick(View v) {
  106. switch (v.getId()) {
  107. case R.id.home_scan:
  108. Intent intent = new Intent("com.google.zxing.client.android.SCAN");
  109. this.startActivityForResult(intent, HOME_ACTIVITY);
  110. break;
  111. case R.id.home_upload_result:
  112. break;
  113. case R.id.home_borrow_book:
  114. break;
  115. case R.id.home_return_book:
  116. break;
  117. case R.id.home_user_manager:
  118. startActivity(new Intent(this, UserManagerActivity.class));
  119. break;
  120. default:
  121. break;
  122. }
  123. }
  124.  
  125. @Override
  126. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  127. if (requestCode != HOME_ACTIVITY) {
  128. super.onActivityResult(requestCode, resultCode, data);
  129. return;
  130. }
  131. if (data == null) {
  132. return;
  133. }
  134. final String isbn = data.getStringExtra("SCAN_RESULT");
  135. mTextScan.setText(String.format(mStringScan, isbn));
  136. if (isbn != null) {
  137. mTextBook.setText(mStringGetting);
  138. mGettingBook.post(new Runnable() {
  139.  
  140. @Override
  141. public void run() {
  142. DefaultHttpClient client = new DefaultHttpClient();
  143. HttpGet request = new HttpGet(DOUBAN_API + isbn);
  144. try {
  145. HttpResponse response = client.execute(request);
  146. book = XMLSax.sax(response.getEntity().getContent());
  147. String summary = book.getSummary();
  148. summary = summary.substring(0,
  149. summary.length() < 60 ? summary.length() : 60)
  150. .concat("...");
  151. String string = String.format(mStringBookInfo,
  152. book.getName(), book.getAuthor(),
  153. book.getPublisher(), book.getIsbn13(), summary);
  154. updateBookInfoView(string);
  155. } catch (Exception e) {
  156. e.printStackTrace();
  157. }
  158. }
  159.  
  160. });
  161. }
  162. }
  163.  
  164. /**
  165. * 更新圖書信息
  166. *
  167. * @param string
  168. */
  169. private void updateBookInfoView(final String string) {
  170. runOnUiThread(new Runnable() {
  171. @Override
  172. public void run() {
  173. mTextBook.setText(string);
  174. }
  175. });
  176. }
  177.  
  178. @Override
  179. protected void onResume() {
  180. super.onResume();
  181. mAdapter.notifyDataSetChanged();
  182. }
  183.  
  184. @Override
  185. protected void onDestroy() {
  186. super.onDestroy();
  187. mDb.close();
  188. }
  189. }
相關文章
相關標籤/搜索