Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中加入名片掃描功能實例代碼

Android中加入名片掃描功能實例代碼

編輯:關於Android編程

要想實現android手機通過掃描名片,得到名片信息,可以使用脈可尋提供的第三方SDK,即Maketion ScanCard SDK,脈可尋雲名片識別服務。他們的官方網站為http://www.maketion.com/。

一、概述

Maketion ScanCardSDK(以下簡稱SDK)是提供給第三方合作伙伴接入脈可尋雲名片識別服務,合作伙伴需要先申請key和secure才可以使用。

SDK不能獨立運行,使用時需要嵌入到Android的Project中。

SDK支持Android2.1版本及以上版本的Project。

脈可尋識別服務的流程為:認證->打開SDK相機頁面->拍攝名片->確認上傳成功->獲取數據。

二、安裝過程

1.將“ScanCardSdk.jar”加到工程的“lib/”目錄下

2.將“libappmain.so”加到工程的“lib/armeabi/”目錄下

3.在工程的“AndroidManifest.xml”文件裡添加以下權限:

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

4.繼續在“AndroidManifest.xml”的<application>標簽裡添加注冊信息:

<activity android:name="cn.maketion.uploadSdk.MkxActivityCamera"/>

三、相機頁面

cn.maketion.uploadSdk.MkxActivityCamera是sdk提供的基於Activity相機頁面,用於拍攝名片並自動提交雲端識別。可以使用

如下方式調用:

Intent intent = new Intent(this, MkxActivityCamera.class);
startActivity(intent); 

四、SDK函數

cn.maketion.uploadSdk.MkxServer類是個單例。首先獲取此類的實例,然後通過實例調用此類的所有功能函數

1、獲取MkxServer類實例

public static MkxServer getServer(Application app)

通過此函數可以獲取MkxServer的實例。

2、驗證功能

public void auth(String key, String secure, String uid, MkxBackInit back)
public boolean isAuth()
public void clearAuth() 

驗證功能包括三個函數:auth()提交驗證;isAuth()判斷驗證狀態;clearAuth()清除驗證狀態。

參數key:由脈可尋名片識別服務申請獲得;

參數secure:由脈可尋名片識別服務申請獲得;

參數back:回調接口

3、獲取名片信息

public void getDataWithUUID(String[] uuids, final MkxBackCards back)
public void getDataWithTime(long time, final MkxBackCards back) 

獲取名片信息有兩種方式:通過名片的關鍵字uuid獲取名片信息;獲取一個時間點之後的所有名片信息。

參數uuids:字符串數組,每個字符串為一個名片的uuid;

參數time:時間點, 1970年1月1日開始經過的“秒”(數若此參數為0表示獲取所有名片信息,不包含已刪除的名片和無法識別的名片);

參數back:回調接口

4、監聽上傳事件

public void setUploadListener(MkxBackUpload back)

通過設置回調函數,監聽上傳事件。

參數back:回調接口, 見第五章第4節

5、上傳名片圖片

public void uploadImage(String uuid)

當監聽上傳事件時發生上傳失敗,可以通過此函數進行重新上傳。

參數uuid:要上傳的名片的uuid

6、設置Sdcard圖片緩存路徑

public void setSdcardPath(String sdcardPath)

設置Sdcard路徑後,拍攝名片所生成的圖片,會保持在此路徑下。

參數sdcardPath:Sdcard上的緩存路徑,例如:setSdcardPath("ImageCache");

拍攝的名片將保存到“\sdcard\ImageCache\”路徑下。

7、獲取名片原圖

public void getCardImage(String uuid, MkxBackPicture back)

通過名片的uuid獲取名片原圖。此函數會先檢查圖片緩存路徑是否存在對應的原圖(名片uuid即為名片在緩存路徑下的名字),若存在則直接返回此文件名,若不存在則先下載再返回。

參數uuid: 要獲取原圖的名片的uuid

參數back: 回調接口,

五、回調接口

1、錯誤信息

public interface MkxErrorCode {
int CODE_SUCCESS = 0;
int CODE_FAIL_RESULT = 1; // 結果錯誤
int CODE_FAIL_DECODE = 2; // JSON解析時出錯
int CODE_FAIL_NULL = 3; // 網絡錯誤,包括500或502錯誤
int CODE_FAIL_TIMEOUT = 4; // 連接超時
int CODE_FAIL_NETWORK = 5; // 網絡錯誤,無網絡或網絡不可用
int CODE_FAIL_REPEAT = 6; // 接口重復調用,未等到接口返回就進行二次調用
int CODE_FAIL_UNKNOW = 9; // 未知錯誤
} 

所有網絡訪問函數調用時都會返回狀態碼code,當code的值為CODE_SUCCESS時表示接口調用成功,否則表示接口調用失敗。

2、驗證回調接口

public interface MkxBackAuth extends MkxErrorCode {
void onBack(int code, String errInfo);
} 

參數code:網絡調用狀態,如果code值為CODE_SUCCESS表示驗證通過;

參數errInfo:當網絡調用失敗時,返回錯誤參考信息。

3、獲取名片信息回調接口

public class MkxCard {
public String carduuid ; // 名片uuid 
public String name ; // 姓名 
public String duty ; // 頭銜 
public String mobile1 ; // 手機1 
public String mobile2 ; // 手機2 
public String email ; // 郵箱 
public String tel1 ; // 電話1 
public String tel2 ; // 電話2 
public String fax ; // 傳真 
public String cname ; // 公司名 
public String address ; // 地址 
public String website ; // 網址 
public String logo ; // 頭像 
public long createtime ; // 創建時間 
public long updatetime ; // 更新時間 
public String fields ; // 已完成字段,"100"為全部完成
public int audit ; // 是否無法識別,大於1就是無法識別 
public int flag ; // 標識,0為有效,1為已刪除
} 
public interface MkxBackCards extends MkxErrorCode {
void onBack(int code, String errInfo, MkxCard[] cards);
} 

參數code:網絡調用狀態;

參數errInfo:當網絡調用失敗時,返回錯誤參考信息;

參數cards:返回的名片信息數組。

4、上傳監聽回調接口

public interface MkxBackUpload extends MkxErrorCode {
int STATUS_START = 0;
int STATUS_SUCESS = 1;
int STATUS_ERROR = 2;
void onBack(int code, String errInfo, String uuid, int status);
}

參數code:網絡調用狀態;

參數errInfo:當網絡調用失敗時,返回錯誤參考信息;

參數uuid:當前上傳名片uuid;

參數status:STATUS_START表示開始上傳,STATUS_SUCESS表示上傳成功,STATUS_ERROR表示上傳失敗。

5、獲取名片原圖回調接口

public interface MkxBackPicture {
void onBack(File picture);
}

參數picture:名片原圖文件,若picture為null表示獲取原圖失敗;

軟件包的分層結構


接下來看,我自己做了一個小demo,測試掃描名片功能

項目內容

在Mainfest.xml文件中加入權限和Activity

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<activity android:name="cn.maketion.uploadSdk.MkxActivityCamera" />
<activity android:name="com.example.maketiontest.CardDetailActivity" />
<activity android:name="com.example.maketiontest.MaketionActivity" />

MaketionActivity中主要是兩個方法takepic()方法和authenticateAccount()方法。

首先在onCreate方法中,得到MkxServer實例,並判斷是否已經驗證

@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
server = MkxServer.getServer(getApplication());
isInit = server.isAuth();
if (isInit) {
takepic();
} else {
authenticateAccount();
}
}

如果已經驗證就進行拍照,如果還沒有驗證,就驗證

authenticateAccount方法

/**
* 驗證賬戶
*/
private void authenticateAccount() {
if (!isInit) {
server.auth(KEY, SECRET, PUID, new MkxBackAuth() {
@Override
public void onBack(int code, String errInfo) {
if (code == MkxErrorCode.CODE_SUCCESS) {
isInit = server.isAuth();
if (isInit) {
Log.i(TAG, "驗證成功!");
takepic();
} else {
Log.i(TAG, "驗證失敗!");
finish();
}
} else {
Log.i(TAG, errInfo);
finish();
}
}
});
}
}

拍照功能

/**
* 拍照操作
*/
private void takepic() {
if (isInit) {
server.setUploadListener(new MkxBackUpload() {
@Override
public void onBack(int code, String errInfo, String uuid,
int status) {
Log.i(TAG, uuid);
muuid = uuid;
switch (status) {
case STATUS_ERROR:// 上傳出錯
if (uploadTimes <= 5) {// 由於重新上傳與拍照上傳都是調用統一上傳函數,因此需要限制重傳次數,避免上傳圖片時產生無限遞歸
uploadTimes++;
server.uploadImage(uuid);// 重新上傳
} else {// 重新上傳的次數達到上限時,不再上傳,保存不能上傳圖片的uuid
uploadTimes = 0;
upLoadFails.add(uuid);
Log.i(TAG, "上傳失敗,等待網絡通暢時再重新上傳");
}
break;
case STATUS_START:// 開始上傳
break;
case STATUS_SUCESS:// 上傳成功
server.getDataWithUUID(new String[] { uuid },
new MkxBackCards() {
@Override
public void onBack(int code, String cards,
MkxCard[] arg2) {
// TODO Auto-generated method stub
if (code == MkxErrorCode.CODE_SUCCESS) {
if (isInit) {                            //上傳成功則進入名片頁面
Intent intent = new Intent(
MaketionActivity.this,
CardDetailActivity.class);
intent.putExtra("uuid", muuid);
startActivity(intent);
} else {
Log.i(TAG, "還未驗證賬戶");
}
}
}
});
Log.i(TAG, "上傳成功");
break;
}
}
});
Intent intent = new Intent(this, MkxActivityCamera.class);
startActivity(intent);
} else {
Log.i(TAG, "還未驗證賬戶,請驗證賬戶再獲取數據");
finish();
}
}

CardDetailActivity

protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i(TAG, "CardDetailActivity------>onCreate");
setContentView(R.layout.card_detail_activity);
server = MkxServer.getServer(getApplication());
if (getIntent() != null
&& !TextUtils.isEmpty(getIntent().getStringExtra("uuid"))) {
String uuid = getIntent().getStringExtra("uuid").toString();
// 獲取單張名片信息
server.getDataWithUUID(new String[] { uuid }, new MkxBackCards() {
@Override
public void onBack(int code, String info, MkxCard[] cards) {
if (code == MkxErrorCode.CODE_SUCCESS) {
Log.i(TAG, " " + cards.length);
if (cards.length != 0) {
setView(cards);
}
}
}
});
} else {
Log.i(TAG, "沒有獲取uuid");
}
}

讓我比較疑惑的事情是為什麼在獲得單張名片信息的時候,回調方法onBack中,參數是MkxCard[] cards

為什麼是個對象數組呢= =。看不到SDK的源碼,沒辦法~

運行之後,並不是每張照片都能得到信息,總的來說,還是不怎麼好用,建議以後用二維碼會更好,或者用nfc。

結果不盡人意~~


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved