Android中加入名片掃描功能實(shí)例代碼
要想實(shí)現(xiàn)android手機(jī)通過(guò)掃描名片,得到名片信息,可以使用脈可尋提供的第三方SDK,即Maketion ScanCard SDK,脈可尋云名片識(shí)別服務(wù)。他們的官方網(wǎng)站為http://www.maketion.com/。
一、概述
Maketion ScanCardSDK(以下簡(jiǎn)稱(chēng)SDK)是提供給第三方合作伙伴接入脈可尋云名片識(shí)別服務(wù),合作伙伴需要先申請(qǐng)key和secure才可以使用。
SDK不能獨(dú)立運(yùn)行,使用時(shí)需要嵌入到Android的Project中。
SDK支持Android2.1版本及以上版本的Project。
脈可尋識(shí)別服務(wù)的流程為:認(rèn)證->打開(kāi)SDK相機(jī)頁(yè)面->拍攝名片->確認(rèn)上傳成功->獲取數(shù)據(jù)。
二、安裝過(guò)程
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>標(biāo)簽里添加注冊(cè)信息:
<activity android:name="cn.maketion.uploadSdk.MkxActivityCamera"/>
三、相機(jī)頁(yè)面
cn.maketion.uploadSdk.MkxActivityCamera是sdk提供的基于Activity相機(jī)頁(yè)面,用于拍攝名片并自動(dòng)提交云端識(shí)別??梢允褂?/p>
如下方式調(diào)用:
Intent intent = new Intent(this, MkxActivityCamera.class); startActivity(intent);
四、SDK函數(shù)
cn.maketion.uploadSdk.MkxServer類(lèi)是個(gè)單例。首先獲取此類(lèi)的實(shí)例,然后通過(guò)實(shí)例調(diào)用此類(lèi)的所有功能函數(shù)
1、獲取MkxServer類(lèi)實(shí)例
public static MkxServer getServer(Application app)
通過(guò)此函數(shù)可以獲取MkxServer的實(shí)例。
2、驗(yàn)證功能
public void auth(String key, String secure, String uid, MkxBackInit back) public boolean isAuth() public void clearAuth()
驗(yàn)證功能包括三個(gè)函數(shù):auth()提交驗(yàn)證;isAuth()判斷驗(yàn)證狀態(tài);clearAuth()清除驗(yàn)證狀態(tài)。
參數(shù)key:由脈可尋名片識(shí)別服務(wù)申請(qǐng)獲得;
參數(shù)secure:由脈可尋名片識(shí)別服務(wù)申請(qǐng)獲得;
參數(shù)back:回調(diào)接口
3、獲取名片信息
public void getDataWithUUID(String[] uuids, final MkxBackCards back) public void getDataWithTime(long time, final MkxBackCards back)
獲取名片信息有兩種方式:通過(guò)名片的關(guān)鍵字uuid獲取名片信息;獲取一個(gè)時(shí)間點(diǎn)之后的所有名片信息。
參數(shù)uuids:字符串?dāng)?shù)組,每個(gè)字符串為一個(gè)名片的uuid;
參數(shù)time:時(shí)間點(diǎn), 1970年1月1日開(kāi)始經(jīng)過(guò)的“秒”(數(shù)若此參數(shù)為0表示獲取所有名片信息,不包含已刪除的名片和無(wú)法識(shí)別的名片);
參數(shù)back:回調(diào)接口
4、監(jiān)聽(tīng)上傳事件
public void setUploadListener(MkxBackUpload back)
通過(guò)設(shè)置回調(diào)函數(shù),監(jiān)聽(tīng)上傳事件。
參數(shù)back:回調(diào)接口, 見(jiàn)第五章第4節(jié)
5、上傳名片圖片
public void uploadImage(String uuid)
當(dāng)監(jiān)聽(tīng)上傳事件時(shí)發(fā)生上傳失敗,可以通過(guò)此函數(shù)進(jìn)行重新上傳。
參數(shù)uuid:要上傳的名片的uuid
6、設(shè)置Sdcard圖片緩存路徑
public void setSdcardPath(String sdcardPath)
設(shè)置Sdcard路徑后,拍攝名片所生成的圖片,會(huì)保持在此路徑下。
參數(shù)sdcardPath:Sdcard上的緩存路徑,例如:setSdcardPath("ImageCache");
拍攝的名片將保存到“\sdcard\ImageCache\”路徑下。
7、獲取名片原圖
public void getCardImage(String uuid, MkxBackPicture back)
通過(guò)名片的uuid獲取名片原圖。此函數(shù)會(huì)先檢查圖片緩存路徑是否存在對(duì)應(yīng)的原圖(名片uuid即為名片在緩存路徑下的名字),若存在則直接返回此文件名,若不存在則先下載再返回。
參數(shù)uuid: 要獲取原圖的名片的uuid
參數(shù)back: 回調(diào)接口,
五、回調(diào)接口
1、錯(cuò)誤信息
public interface MkxErrorCode {
int CODE_SUCCESS = 0;
int CODE_FAIL_RESULT = 1; // 結(jié)果錯(cuò)誤
int CODE_FAIL_DECODE = 2; // JSON解析時(shí)出錯(cuò)
int CODE_FAIL_NULL = 3; // 網(wǎng)絡(luò)錯(cuò)誤,包括500或502錯(cuò)誤
int CODE_FAIL_TIMEOUT = 4; // 連接超時(shí)
int CODE_FAIL_NETWORK = 5; // 網(wǎng)絡(luò)錯(cuò)誤,無(wú)網(wǎng)絡(luò)或網(wǎng)絡(luò)不可用
int CODE_FAIL_REPEAT = 6; // 接口重復(fù)調(diào)用,未等到接口返回就進(jìn)行二次調(diào)用
int CODE_FAIL_UNKNOW = 9; // 未知錯(cuò)誤
}
所有網(wǎng)絡(luò)訪問(wèn)函數(shù)調(diào)用時(shí)都會(huì)返回狀態(tài)碼code,當(dāng)code的值為CODE_SUCCESS時(shí)表示接口調(diào)用成功,否則表示接口調(diào)用失敗。
2、驗(yàn)證回調(diào)接口
public interface MkxBackAuth extends MkxErrorCode {
void onBack(int code, String errInfo);
}
參數(shù)code:網(wǎng)絡(luò)調(diào)用狀態(tài),如果code值為CODE_SUCCESS表示驗(yàn)證通過(guò);
參數(shù)errInfo:當(dāng)網(wǎng)絡(luò)調(diào)用失敗時(shí),返回錯(cuò)誤參考信息。
3、獲取名片信息回調(diào)接口
public class MkxCard {
public String carduuid ; // 名片uuid
public String name ; // 姓名
public String duty ; // 頭銜
public String mobile1 ; // 手機(jī)1
public String mobile2 ; // 手機(jī)2
public String email ; // 郵箱
public String tel1 ; // 電話(huà)1
public String tel2 ; // 電話(huà)2
public String fax ; // 傳真
public String cname ; // 公司名
public String address ; // 地址
public String website ; // 網(wǎng)址
public String logo ; // 頭像
public long createtime ; // 創(chuàng)建時(shí)間
public long updatetime ; // 更新時(shí)間
public String fields ; // 已完成字段,"100"為全部完成
public int audit ; // 是否無(wú)法識(shí)別,大于1就是無(wú)法識(shí)別
public int flag ; // 標(biāo)識(shí),0為有效,1為已刪除
}
public interface MkxBackCards extends MkxErrorCode {
void onBack(int code, String errInfo, MkxCard[] cards);
}
參數(shù)code:網(wǎng)絡(luò)調(diào)用狀態(tài);
參數(shù)errInfo:當(dāng)網(wǎng)絡(luò)調(diào)用失敗時(shí),返回錯(cuò)誤參考信息;
參數(shù)cards:返回的名片信息數(shù)組。
4、上傳監(jiān)聽(tīng)回調(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)絡(luò)調(diào)用狀態(tài);
參數(shù)errInfo:當(dāng)網(wǎng)絡(luò)調(diào)用失敗時(shí),返回錯(cuò)誤參考信息;
參數(shù)uuid:當(dāng)前上傳名片uuid;
參數(shù)status:STATUS_START表示開(kāi)始上傳,STATUS_SUCESS表示上傳成功,STATUS_ERROR表示上傳失敗。
5、獲取名片原圖回調(diào)接口
public interface MkxBackPicture {
void onBack(File picture);
}
參數(shù)picture:名片原圖文件,若picture為null表示獲取原圖失??;
軟件包的分層結(jié)構(gòu)

接下來(lái)看,我自己做了一個(gè)小demo,測(cè)試掃描名片功能
項(xiàng)目?jī)?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中主要是兩個(gè)方法takepic()方法和authenticateAccount()方法。
首先在onCreate方法中,得到MkxServer實(shí)例,并判斷是否已經(jīng)驗(yàn)證
@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)驗(yàn)證就進(jìn)行拍照,如果還沒(méi)有驗(yàn)證,就驗(yàn)證
authenticateAccount方法
/**
* 驗(yàn)證賬戶(hù)
*/
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, "驗(yàn)證成功!");
takepic();
} else {
Log.i(TAG, "驗(yàn)證失敗!");
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:// 上傳出錯(cuò)
if (uploadTimes <= 5) {// 由于重新上傳與拍照上傳都是調(diào)用統(tǒng)一上傳函數(shù),因此需要限制重傳次數(shù),避免上傳圖片時(shí)產(chǎn)生無(wú)限遞歸
uploadTimes++;
server.uploadImage(uuid);// 重新上傳
} else {// 重新上傳的次數(shù)達(dá)到上限時(shí),不再上傳,保存不能上傳圖片的uuid
uploadTimes = 0;
upLoadFails.add(uuid);
Log.i(TAG, "上傳失敗,等待網(wǎng)絡(luò)通暢時(shí)再重新上傳");
}
break;
case STATUS_START:// 開(kāi)始上傳
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) { //上傳成功則進(jìn)入名片頁(yè)面
Intent intent = new Intent(
MaketionActivity.this,
CardDetailActivity.class);
intent.putExtra("uuid", muuid);
startActivity(intent);
} else {
Log.i(TAG, "還未驗(yàn)證賬戶(hù)");
}
}
}
});
Log.i(TAG, "上傳成功");
break;
}
}
});
Intent intent = new Intent(this, MkxActivityCamera.class);
startActivity(intent);
} else {
Log.i(TAG, "還未驗(yàn)證賬戶(hù),請(qǐng)驗(yàn)證賬戶(hù)再獲取數(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, "沒(méi)有獲取uuid");
}
}
讓我比較疑惑的事情是為什么在獲得單張名片信息的時(shí)候,回調(diào)方法onBack中,參數(shù)是MkxCard[] cards
為什么是個(gè)對(duì)象數(shù)組呢= =??床坏絊DK的源碼,沒(méi)辦法~
運(yùn)行之后,并不是每張照片都能得到信息,總的來(lái)說(shuō),還是不怎么好用,建議以后用二維碼會(huì)更好,或者用nfc。


結(jié)果不盡人意~~
- Android基于zxing的二維碼(網(wǎng)格)掃描 仿支付寶網(wǎng)格掃描
- Android實(shí)現(xiàn)二維碼掃描和生成的簡(jiǎn)單方法
- Android開(kāi)發(fā)框架之自定義ZXing二維碼掃描界面并解決取景框拉伸問(wèn)題
- Android基于google Zxing實(shí)現(xiàn)各類(lèi)二維碼掃描效果
- Android應(yīng)用中使用ContentProvider掃描本地圖片并顯示
- Android平臺(tái)生成二維碼并實(shí)現(xiàn)掃描 & 識(shí)別功能
- Android掃描本地音樂(lè)文件開(kāi)發(fā)案例分享
- Android波紋擴(kuò)散效果之仿支付寶咻一咻功能實(shí)現(xiàn)波紋擴(kuò)散特效
- Android app第三方支付寶支付接入教程
- Android實(shí)現(xiàn)支付寶AR掃描動(dòng)畫(huà)效果
相關(guān)文章
Android App開(kāi)發(fā)中HTTP擴(kuò)展包OkHttp的入門(mén)使用指南
OkHttp包為安卓開(kāi)發(fā)中基于HTTP協(xié)議的網(wǎng)絡(luò)編程提供了很大便利,這里我們就來(lái)看一下Android App開(kāi)發(fā)中HTTP擴(kuò)展包OkHttp的入門(mén)使用指南:2016-07-07
Android普通對(duì)話(huà)框用法實(shí)例分析
這篇文章主要介紹了Android普通對(duì)話(huà)框用法,以實(shí)例形式較為詳細(xì)的分析了Android對(duì)話(huà)框的創(chuàng)建技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
Android12?藍(lán)牙適配的實(shí)現(xiàn)步驟
本文主要介紹了Android12?藍(lán)牙適配的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Android模仿實(shí)現(xiàn)閑魚(yú)首頁(yè)的思路與方法
這篇文章主要給大家介紹了Android模仿實(shí)現(xiàn)閑魚(yú)首頁(yè)的思路與方法,文中通過(guò)示例代碼介紹的非常詳細(xì),并在文末給出了完整的代碼供大家參考學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。2017-04-04
Android Secret Code(輸入字符彈出手機(jī)信息)詳解
這篇文章主要介紹了Android Secret Code(輸入字符彈出手機(jī)信息)詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android實(shí)現(xiàn)上下菜單雙向滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)上下菜單雙向滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Android應(yīng)用啟動(dòng)另外一個(gè)apk應(yīng)用的方法
這篇文章主要介紹了Android應(yīng)用啟動(dòng)另外一個(gè)apk應(yīng)用的方法,涉及Android基于intent的package調(diào)用與管理技巧,需要的朋友可以參考下2016-02-02
Android調(diào)用默認(rèn)瀏覽器打開(kāi)指定Url的方法實(shí)例
業(yè)務(wù)員有需求要將一個(gè)wap站在手機(jī)上以App的形式打開(kāi),還不要嵌套WebView,只能以瀏覽器打開(kāi).查了點(diǎn)資料,就有了下面這代碼2013-09-09

