本文原创,转载请注明原文地址: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版,而且在内部使用,就没去好好做布局设计,只是把需要的控件都写上。
- xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/home_scan"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/button_scan" />
- <TextView
- android:id="@+id/home_result_scan"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/home_book_info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <Button
- android:id="@+id/home_upload_result"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/button_upload" />
- <TextView
- android:id="@+id/home_result_upload"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:singleLine="false" />
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <Button
- android:id="@+id/home_borrow_book"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/borrow_book" />
- <Spinner
- android:id="@+id/home_users"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="right" />
- LinearLayout>
- <Button
- android:id="@+id/home_return_book"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/return_book" />
- <Button
- android:id="@+id/home_user_manager"
- android:layout_width="wrap_content"
- android:text="@string/manager_user"
- android:layout_height="wrap_content" />
- LinearLayout>
然后在我们的项目中,写一个Activity来调用Zxing的扫描功能,并通过它返回的结果访问互联网获取信息。
下面是该Activity的代码。这里对于控件及事件的绑定,我使用了自己封装的一个工具(Androidkit)来简化这些代码,所以你们会看到许多类似@AndroidView的注解,这个工具可以在http://code.google.com/p/cfuture-androidkit/获取,或从https://github.com/msdx/androidkit上获得最新代码。
- /*
- * @(#)HomeActivity.java Project:bookscan
- * Date:2012-12-3
- *
- * Copyright (c) 2011 CFuture09, Institute of Software,
- * Guangdong Ocean University, Zhanjiang, GuangDong, China.
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package com.sinaapp.msdxblog.bookscan.activity;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- import android.app.Activity;
- import android.content.Intent;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.View;
- import android.widget.SimpleCursorAdapter;
- import android.widget.Spinner;
- import android.widget.TextView;
- import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;
- import com.sinaapp.msdxblog.androidkit.ui.ResBindUtil;
- import com.sinaapp.msdxblog.androidkit.ui.UIBindUtil;
- import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidRes;
- import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidRes.ResType;
- import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidView;
- import com.sinaapp.msdxblog.androidkit.ui.annotation.OnClick;
- import com.sinaapp.msdxblog.bookscan.R;
- import com.sinaapp.msdxblog.bookscan.bean.Book;
- import com.sinaapp.msdxblog.bookscan.util.DB;
- import com.sinaapp.msdxblog.bookscan.util.XMLSax;
- /**
- * @author Geek_Soledad ([email protected])
- */
- public class HomeActivity extends Activity {
- private static final int HOME_ACTIVITY = 1990;
- private static final String DOUBAN_API = "http://api.douban.com/book/subject/isbn/";
- @AndroidView(id = R.id.home_result_scan)
- private TextView mTextScan;
- @AndroidView(id = R.id.home_book_info)
- private TextView mTextBook;
- @AndroidView(id = R.id.home_result_upload)
- private TextView mTextUpload;
- @AndroidView(id = R.id.home_users)
- private Spinner mSpinnerUser;
- @AndroidRes(id = R.string.result_scan, type = ResType.STRING)
- private String mStringScan;
- @AndroidRes(id = R.string.result_getting, type = ResType.STRING)
- private String mStringGetting;
- @AndroidRes(id = R.string.book_info, type = ResType.STRING)
- private String mStringBookInfo;
- private Handler mGettingBook;
- private Book book;
- private DB mDb;
- private SimpleCursorAdapter mAdapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- UIBindUtil.bind(this, R.layout.activity_home);
- ResBindUtil.bindAllRes(this);
- init();
- }
- /**
- * 初始化参数。
- */
- private final void init() {
- mGettingBook = HandlerFactory.getNewHandlerInOtherThread("book");
- mDb = new DB(this);
- Cursor users = mDb.getAllUser();
- startManagingCursor(users);
- mAdapter = new SimpleCursorAdapter(this,
- android.R.layout.simple_spinner_item, users,
- new String[] { "username" }, new int[] { android.R.id.text1 });
- mAdapter
- .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mSpinnerUser.setAdapter(mAdapter);
- }
- @OnClick(viewId = { R.id.home_scan, R.id.home_upload_result,
- R.id.home_borrow_book, R.id.home_return_book,
- R.id.home_user_manager })
- public void onButtonClick(View v) {
- switch (v.getId()) {
- case R.id.home_scan:
- Intent intent = new Intent("com.google.zxing.client.android.SCAN");
- this.startActivityForResult(intent, HOME_ACTIVITY);
- break;
- case R.id.home_upload_result:
- break;
- case R.id.home_borrow_book:
- break;
- case R.id.home_return_book:
- break;
- case R.id.home_user_manager:
- startActivity(new Intent(this, UserManagerActivity.class));
- break;
- default:
- break;
- }
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode != HOME_ACTIVITY) {
- super.onActivityResult(requestCode, resultCode, data);
- return;
- }
- if (data == null) {
- return;
- }
- final String isbn = data.getStringExtra("SCAN_RESULT");
- mTextScan.setText(String.format(mStringScan, isbn));
- if (isbn != null) {
- mTextBook.setText(mStringGetting);
- mGettingBook.post(new Runnable() {
- @Override
- public void run() {
- DefaultHttpClient client = new DefaultHttpClient();
- HttpGet request = new HttpGet(DOUBAN_API + isbn);
- try {
- HttpResponse response = client.execute(request);
- book = XMLSax.sax(response.getEntity().getContent());
- String summary = book.getSummary();
- summary = summary.substring(0,
- summary.length() < 60 ? summary.length() : 60)
- .concat("...");
- String string = String.format(mStringBookInfo,
- book.getName(), book.getAuthor(),
- book.getPublisher(), book.getIsbn13(), summary);
- updateBookInfoView(string);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
- /**
- * 更新图书信息
- *
- * @param string
- */
- private void updateBookInfoView(final String string) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mTextBook.setText(string);
- }
- });
- }
- @Override
- protected void onResume() {
- super.onResume();
- mAdapter.notifyDataSetChanged();
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mDb.close();
- }
- }
/* * @(#)HomeActivity.java Project:bookscan * Date:2012-12-3 * * Copyright (c) 2011 CFuture09, Institute of Software, * Guangdong Ocean University, Zhanjiang, GuangDong, China. * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sinaapp.msdxblog.bookscan.activity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.SimpleCursorAdapter; import android.widget.Spinner; import android.widget.TextView; import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory; import com.sinaapp.msdxblog.androidkit.ui.ResBindUtil; import com.sinaapp.msdxblog.androidkit.ui.UIBindUtil; import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidRes; import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidRes.ResType; import com.sinaapp.msdxblog.androidkit.ui.annotation.AndroidView; import com.sinaapp.msdxblog.androidkit.ui.annotation.OnClick; import com.sinaapp.msdxblog.bookscan.R; import com.sinaapp.msdxblog.bookscan.bean.Book; import com.sinaapp.msdxblog.bookscan.util.DB; import com.sinaapp.msdxblog.bookscan.util.XMLSax; /** * @author Geek_Soledad ([email protected]) */ public class HomeActivity extends Activity { private static final int HOME_ACTIVITY = 1990; private static final String DOUBAN_API = "http://api.douban.com/book/subject/isbn/"; @AndroidView(id = R.id.home_result_scan) private TextView mTextScan; @AndroidView(id = R.id.home_book_info) private TextView mTextBook; @AndroidView(id = R.id.home_result_upload) private TextView mTextUpload; @AndroidView(id = R.id.home_users) private Spinner mSpinnerUser; @AndroidRes(id = R.string.result_scan, type = ResType.STRING) private String mStringScan; @AndroidRes(id = R.string.result_getting, type = ResType.STRING) private String mStringGetting; @AndroidRes(id = R.string.book_info, type = ResType.STRING) private String mStringBookInfo; private Handler mGettingBook; private Book book; private DB mDb; private SimpleCursorAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); UIBindUtil.bind(this, R.layout.activity_home); ResBindUtil.bindAllRes(this); init(); } /** * 初始化参数。 */ private final void init() { mGettingBook = HandlerFactory.getNewHandlerInOtherThread("book"); mDb = new DB(this); Cursor users = mDb.getAllUser(); startManagingCursor(users); mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, users, new String[] { "username" }, new int[] { android.R.id.text1 }); mAdapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSpinnerUser.setAdapter(mAdapter); } @OnClick(viewId = { R.id.home_scan, R.id.home_upload_result, R.id.home_borrow_book, R.id.home_return_book, R.id.home_user_manager }) public void onButtonClick(View v) { switch (v.getId()) { case R.id.home_scan: Intent intent = new Intent("com.google.zxing.client.android.SCAN"); this.startActivityForResult(intent, HOME_ACTIVITY); break; case R.id.home_upload_result: break; case R.id.home_borrow_book: break; case R.id.home_return_book: break; case R.id.home_user_manager: startActivity(new Intent(this, UserManagerActivity.class)); break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode != HOME_ACTIVITY) { super.onActivityResult(requestCode, resultCode, data); return; } if (data == null) { return; } final String isbn = data.getStringExtra("SCAN_RESULT"); mTextScan.setText(String.format(mStringScan, isbn)); if (isbn != null) { mTextBook.setText(mStringGetting); mGettingBook.post(new Runnable() { @Override public void run() { DefaultHttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(DOUBAN_API + isbn); try { HttpResponse response = client.execute(request); book = XMLSax.sax(response.getEntity().getContent()); String summary = book.getSummary(); summary = summary.substring(0, summary.length() < 60 ? summary.length() : 60) .concat("..."); String string = String.format(mStringBookInfo, book.getName(), book.getAuthor(), book.getPublisher(), book.getIsbn13(), summary); updateBookInfoView(string); } catch (Exception e) { e.printStackTrace(); } } }); } } /** * 更新图书信息 * * @param string */ private void updateBookInfoView(final String string) { runOnUiThread(new Runnable() { @Override public void run() { mTextBook.setText(string); } }); } @Override protected void onResume() { super.onResume(); mAdapter.notifyDataSetChanged(); } @Override protected void onDestroy() { super.onDestroy(); mDb.close(); } }