要想實現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執行個體,並判斷是否已經驗證
@Overrideprotected void onCreate(Bundle arg0) {// TODO Auto-generated method stubsuper.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() {@Overridepublic 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() {@Overridepublic 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 {// 重新上傳的次數達到上限時,不再上傳,儲存不能上傳圖片的uuiduploadTimes = 0;upLoadFails.add(uuid);Log.i(TAG, "上傳失敗,等待網路通暢時再重新上傳");}break;case STATUS_START:// 開始上傳break;case STATUS_SUCESS:// 上傳成功server.getDataWithUUID(new String[] { uuid },new MkxBackCards() {@Overridepublic void onBack(int code, String cards,MkxCard[] arg2) {// TODO Auto-generated method stubif (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 stubsuper.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() {@Overridepublic 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。
結果不盡人意~~