<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"/>三、相机页面
Intent intent = new Intent(this, MkxActivityCamera.class);startActivity(intent);四、SDK函数
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()清除验证状态。
public void getDataWithUUID(String[] uuids, final MkxBackCards back)public void getDataWithTime(long time, final MkxBackCards back)获取名片信息有两种方式:通过名片的关键字uuid获取名片信息;获取一个时间点之后的所有名片信息。
public void setUploadListener(MkxBackUpload back)通过设置回调函数,监听上传事件。
public void uploadImage(String uuid)当监听上传事件时发生上传失败,可以通过此函数进行重新上传。
public void setSdcardPath(String sdcardPath)设置Sdcard路径后,拍摄名片所生成的图片,会保持在此路径下。
public void getCardImage(String uuid, MkxBackPicture back)通过名片的uuid获取名片原图。此函数会先检查图片缓存路径是否存在对应的原图(名片uuid即为名片在缓存路径下的名字),若存在则直接返回此文件名,若不存在则先下载再返回。
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表示验证通过;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:网络调用状态;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:网络调用状态;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()方法。
@Overrideprotected void onCreate(Bundle arg0) {// TODO Auto-generated method stubsuper.onCreate(arg0);server = MkxServer.getServer(getApplication());isInit = server.isAuth();if (isInit) {takepic();} else {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();}}CardDetailActivityprotected 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

结果不尽人意~~