Android中加入名片掃描功能實例代碼
要想實現(xiàn)android手機通過掃描名片,得到名片信息,可以使用脈可尋提供的第三方SDK,即Maketion ScanCard SDK,脈可尋云名片識別服務。他們的官方網(wǎng)站為http://www.maketion.com/。
一、概述
Maketion ScanCardSDK(以下簡稱SDK)是提供給第三方合作伙伴接入脈可尋云名片識別服務,合作伙伴需要先申請key和secure才可以使用。
SDK不能獨立運行,使用時需要嵌入到Android的Project中。
SDK支持Android2.1版本及以上版本的Project。
脈可尋識別服務的流程為:認證->打開SDK相機頁面->拍攝名片->確認上傳成功->獲取數(shù)據(jù)。
二、安裝過程
1.將“ScanCardSdk.jar”加到工程的“l(fā)ib/”目錄下
2.將“l(fā)ibappmain.so”加到工程的“l(fā)ib/armeabi/”目錄下
3.在工程的“AndroidManifest.xml”文件里添加以下權(quán)限:
<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.繼續(xù)在“AndroidManifest.xml”的<application>標簽里添加注冊信息:
<activity android:name="cn.maketion.uploadSdk.MkxActivityCamera"/>
三、相機頁面
cn.maketion.uploadSdk.MkxActivityCamera是sdk提供的基于Activity相機頁面,用于拍攝名片并自動提交云端識別??梢允褂?/p>
如下方式調(diào)用:
Intent intent = new Intent(this, MkxActivityCamera.class); startActivity(intent);
四、SDK函數(shù)
cn.maketion.uploadSdk.MkxServer類是個單例。首先獲取此類的實例,然后通過實例調(diào)用此類的所有功能函數(shù)
1、獲取MkxServer類實例
public static MkxServer getServer(Application app)
通過此函數(shù)可以獲取MkxServer的實例。
2、驗證功能
public void auth(String key, String secure, String uid, MkxBackInit back) public boolean isAuth() public void clearAuth()
驗證功能包括三個函數(shù):auth()提交驗證;isAuth()判斷驗證狀態(tài);clearAuth()清除驗證狀態(tài)。
參數(shù)key:由脈可尋名片識別服務申請獲得;
參數(shù)secure:由脈可尋名片識別服務申請獲得;
參數(shù)back:回調(diào)接口
3、獲取名片信息
public void getDataWithUUID(String[] uuids, final MkxBackCards back) public void getDataWithTime(long time, final MkxBackCards back)
獲取名片信息有兩種方式:通過名片的關(guān)鍵字uuid獲取名片信息;獲取一個時間點之后的所有名片信息。
參數(shù)uuids:字符串數(shù)組,每個字符串為一個名片的uuid;
參數(shù)time:時間點, 1970年1月1日開始經(jīng)過的“秒”(數(shù)若此參數(shù)為0表示獲取所有名片信息,不包含已刪除的名片和無法識別的名片);
參數(shù)back:回調(diào)接口
4、監(jiān)聽上傳事件
public void setUploadListener(MkxBackUpload back)
通過設(shè)置回調(diào)函數(shù),監(jiān)聽上傳事件。
參數(shù)back:回調(diào)接口, 見第五章第4節(jié)
5、上傳名片圖片
public void uploadImage(String uuid)
當監(jiān)聽上傳事件時發(fā)生上傳失敗,可以通過此函數(shù)進行重新上傳。
參數(shù)uuid:要上傳的名片的uuid
6、設(shè)置Sdcard圖片緩存路徑
public void setSdcardPath(String sdcardPath)
設(shè)置Sdcard路徑后,拍攝名片所生成的圖片,會保持在此路徑下。
參數(shù)sdcardPath:Sdcard上的緩存路徑,例如:setSdcardPath("ImageCache");
拍攝的名片將保存到“\sdcard\ImageCache\”路徑下。
7、獲取名片原圖
public void getCardImage(String uuid, MkxBackPicture back)
通過名片的uuid獲取名片原圖。此函數(shù)會先檢查圖片緩存路徑是否存在對應的原圖(名片uuid即為名片在緩存路徑下的名字),若存在則直接返回此文件名,若不存在則先下載再返回。
參數(shù)uuid: 要獲取原圖的名片的uuid
參數(shù)back: 回調(diào)接口,
五、回調(diào)接口
1、錯誤信息
public interface MkxErrorCode { int CODE_SUCCESS = 0; int CODE_FAIL_RESULT = 1; // 結(jié)果錯誤 int CODE_FAIL_DECODE = 2; // JSON解析時出錯 int CODE_FAIL_NULL = 3; // 網(wǎng)絡錯誤,包括500或502錯誤 int CODE_FAIL_TIMEOUT = 4; // 連接超時 int CODE_FAIL_NETWORK = 5; // 網(wǎng)絡錯誤,無網(wǎng)絡或網(wǎng)絡不可用 int CODE_FAIL_REPEAT = 6; // 接口重復調(diào)用,未等到接口返回就進行二次調(diào)用 int CODE_FAIL_UNKNOW = 9; // 未知錯誤 }
所有網(wǎng)絡訪問函數(shù)調(diào)用時都會返回狀態(tài)碼code,當code的值為CODE_SUCCESS時表示接口調(diào)用成功,否則表示接口調(diào)用失敗。
2、驗證回調(diào)接口
public interface MkxBackAuth extends MkxErrorCode { void onBack(int code, String errInfo); }
參數(shù)code:網(wǎng)絡調(diào)用狀態(tài),如果code值為CODE_SUCCESS表示驗證通過;
參數(shù)errInfo:當網(wǎng)絡調(diào)用失敗時,返回錯誤參考信息。
3、獲取名片信息回調(diào)接口
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 ; // 網(wǎng)址 public String logo ; // 頭像 public long createtime ; // 創(chuàng)建時間 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); }
參數(shù)code:網(wǎng)絡調(diào)用狀態(tài);
參數(shù)errInfo:當網(wǎng)絡調(diào)用失敗時,返回錯誤參考信息;
參數(shù)cards:返回的名片信息數(shù)組。
4、上傳監(jiān)聽回調(diào)接口
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); }
參數(shù)code:網(wǎng)絡調(diào)用狀態(tài);
參數(shù)errInfo:當網(wǎng)絡調(diào)用失敗時,返回錯誤參考信息;
參數(shù)uuid:當前上傳名片uuid;
參數(shù)status:STATUS_START表示開始上傳,STATUS_SUCESS表示上傳成功,STATUS_ERROR表示上傳失敗。
5、獲取名片原圖回調(diào)接口
public interface MkxBackPicture { void onBack(File picture); }
參數(shù)picture:名片原圖文件,若picture為null表示獲取原圖失敗;
軟件包的分層結(jié)構(gòu)
接下來看,我自己做了一個小demo,測試掃描名片功能
項目內(nèi)容
在Mainfest.xml文件中加入權(quán)限和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實例,并判斷是否已經(jīng)驗證
@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(); } }
如果已經(jīng)驗證就進行拍照,如果還沒有驗證,就驗證
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) {// 由于重新上傳與拍照上傳都是調(diào)用統(tǒng)一上傳函數(shù),因此需要限制重傳次數(shù),避免上傳圖片時產(chǎn)生無限遞歸 uploadTimes++; server.uploadImage(uuid);// 重新上傳 } else {// 重新上傳的次數(shù)達到上限時,不再上傳,保存不能上傳圖片的uuid uploadTimes = 0; upLoadFails.add(uuid); Log.i(TAG, "上傳失敗,等待網(wǎng)絡通暢時再重新上傳"); } 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, "還未驗證賬戶,請驗證賬戶再獲取數(shù)據(jù)"); 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"); } }
讓我比較疑惑的事情是為什么在獲得單張名片信息的時候,回調(diào)方法onBack中,參數(shù)是MkxCard[] cards
為什么是個對象數(shù)組呢= =??床坏絊DK的源碼,沒辦法~
運行之后,并不是每張照片都能得到信息,總的來說,還是不怎么好用,建議以后用二維碼會更好,或者用nfc。
結(jié)果不盡人意~~
- Android基于zxing的二維碼(網(wǎng)格)掃描 仿支付寶網(wǎng)格掃描
- Android實現(xiàn)二維碼掃描和生成的簡單方法
- Android開發(fā)框架之自定義ZXing二維碼掃描界面并解決取景框拉伸問題
- Android基于google Zxing實現(xiàn)各類二維碼掃描效果
- Android應用中使用ContentProvider掃描本地圖片并顯示
- Android平臺生成二維碼并實現(xiàn)掃描 & 識別功能
- Android掃描本地音樂文件開發(fā)案例分享
- Android波紋擴散效果之仿支付寶咻一咻功能實現(xiàn)波紋擴散特效
- Android app第三方支付寶支付接入教程
- Android實現(xiàn)支付寶AR掃描動畫效果
相關(guān)文章
Android App開發(fā)中HTTP擴展包OkHttp的入門使用指南
OkHttp包為安卓開發(fā)中基于HTTP協(xié)議的網(wǎng)絡編程提供了很大便利,這里我們就來看一下Android App開發(fā)中HTTP擴展包OkHttp的入門使用指南:2016-07-07Android Secret Code(輸入字符彈出手機信息)詳解
這篇文章主要介紹了Android Secret Code(輸入字符彈出手機信息)詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11Android調(diào)用默認瀏覽器打開指定Url的方法實例
業(yè)務員有需求要將一個wap站在手機上以App的形式打開,還不要嵌套WebView,只能以瀏覽器打開.查了點資料,就有了下面這代碼2013-09-09