如何Android中加入掃描名片功能

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

1、概述web

Maketion ScanCardSDK(如下簡稱SDK)是提供給第三方合做夥伴接入脈可尋雲名片識別服務,合做夥伴須要先申請key和secure纔可使用。數組

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

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

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

2、安裝過程

  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>標籤裏添加註冊信息:ide

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

3、相機頁面

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

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

startActivity(intent);

 

4、SDK函數網站

cn.maketion.uploadSdk.MkxServer類是個單例。首先獲取此類的實例,而後經過實例調用此類的全部功能函數

一、獲取MkxServer類實例

public static MkxServer getServer(Application app)

經過此函數能夠獲取MkxServer的實例。

二、驗證功能

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

public boolean isAuth()

public void clearAuth()

 

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

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

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

參數back:回調接口

三、獲取名片信息

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:回調接口

四、監聽上傳事件

public void setUploadListener(MkxBackUpload back)

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

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

五、上傳名片圖片

public void uploadImage(String uuid)

當監聽上傳事件時發生上傳失敗,能夠經過此函數進行從新上傳。

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

六、設置Sdcard圖片緩存路徑

public void setSdcardPath(String sdcardPath)

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

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

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

七、獲取名片原圖

public void getCardImage(String uuid, MkxBackPicture back)

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

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

參數back: 回調接口,

5、回調接口

一、錯誤信息

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時表示接口調用成功,不然表示接口調用失敗。

二、驗證回調接口

public interface MkxBackAuth extends MkxErrorCode {

    void onBack(int code, String errInfo);

}

 

參數code:網絡調用狀態,若是code值爲CODE_SUCCESS表示驗證經過;

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

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

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:返回的名片信息數組。

四、上傳監聽回調接口

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表示上傳失敗。

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

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。

結果不盡人意~~

相關文章
相關標籤/搜索