如何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。

结果不尽人意~~

时间: 2024-10-05 04:19:36

如何Android中加入扫描名片功能的相关文章

在Android中如何实现分享功能

Android应用中能很方便的完成这些功能,很多的应用中都有"分享"功能?如何分享呢?下面给大家说说看.最近有人问到Android分享功能用那个比较好,使用Android开发自带的Intent来进行分享还是借助第三方呢,直接上代码: 一.使用Intent直接和第三方应用进行通信: /** * 分享功能 * * @param context *            上下文 * @param activityTitle *            Activity的名字 * @param

C++实现android中px转换为dip功能的小程序

首先需要明白dip和px代表什么意思. dip:device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关. px:pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变. dip的换算: dip = (int)  (px/1.5 + 0.5). 详细的介绍可以参考http://www.cnblogs.com/error404/archive/2011/11/03/2234165.html.

Android中谷歌语音识别应用探究

引言 由于为期半年的项目结束了,进入了一段“疗养”的真空期,因此有时间可以去归纳整理项目的经验,学习新的姿势与技巧,对自己技术水平也是一种提升.另外,个人懒癌症严重,为强迫自己努力学习,立了一些福来阁(比如没有写出博客女装什么的咳咳,我一定会拔旗成功的,哼),总体来说督促效果还是挺不错的. 项目中使用的Android和linux进行客户端的开发,结合项目的实战经验,七月份写的博客内容主要围绕Android开发进行,研究的内容预定为:Android中谷歌语音搜索功能探究(开篇),app应用意外关闭

Android系统篇之----Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)

一.前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的.那么咋们今天闲来说说Android中的run-as命令吧. 二.遇到的问题&解决问题 Android中我们知道如果设备没有root,我们想看一个应用的沙盒数据(/data/data/目录内容),在以前的方式很难办到,一般人都是选择root之后,去查

Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果

首先我们先看第一个界面吧,使用将手机中的图片扫描出来,然后根据图片的所在的文件夹将其分类出来,并显示所在文件夹里面的一张图片和文件夹中图片个数,我们根据界面元素(文件夹名, 文件夹图片个数,文件夹中的一张图片)使用一个实体对象ImageBean来封装这三个属性 package com.example.imagescan; /** * GridView的每个item的数据对象 * * @author len * */ public class ImageBean{ /** * 文件夹的第一张图片路

android中调用系统的发送短信、发送邮件、打电话功能

1 调用发送短信功能: Uri smsToUri = Uri.parse("smsto:"); Intent sendIntent = new Intent(Intent.ACTION_VIEW, smsToUri); sendIntent.putExtra("address", "123456"); //电话号码,这行去掉的话,默认就没有电话 sendIntent.putExtra("sms_body","短信内容

Android中Xposed框架篇---修改系统位置信息实现自身隐藏功能

一.前言 前文已经介绍了Xposed框架的基本使用规则,本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,在如今社交工具的发展特别是微信,他有一个实时位置共享功能,那么对于那些不是单身狗的同学来说可能会有些蛋疼,哪天媳妇要查岗发送位置,结果你不在她期望的位置这时候就尴尬了,而且朋友圈在分享内容的时候可以选择当前位置,有的屌丝就像我一样没钱但是又想到处旅游,那么这时候咋们就可以一本正经的装个逼了. 二.定位原理 看到上面说的那么多,感觉这个功能必须要搞起来了,好

Android中使用GridView和ImageViewSwitcher实现电子相册简单功能

我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片.如下图的显示效果: 首先我们先罗列一下本次实现所要用的知识点: (1)首页界面,我们需要可以通过GridView来实现,有关GridView的实现代码以及讲解请参照本人相关博文: Android中GridView通过自定义适配器(未优化)实现图文视图排列 (2)具体照片的展示以及左右切换效果,可以实现这个效果的方法很多(ViewPager,Vie

Android中静态方式破解某App实现所有视频app去除广告功能

作为一个屌丝程序猿也有追剧的时候,但是当打开视频app的时候,那些超长的广告已经让我这个屌丝无法忍受了,作为一个程序猿看视频还要出现广告那就是打我脸,但是我有没有钱买会员,只能靠着毕生技能去耍耍去除广告了.下面就来介绍一下如何进行视频广告的去除. 一.视频广告播放原理 首先我们需要了解的一个基本知识点那就是广告其实也是一段视频,那么他肯定有请求地址和播放地址.那么我们的思路就来了,如果能够得到这些地址的话,我们就可以去除广告了,为什么呢?因为我们知道所有的网络请求最终会走系统的hosts文件,在