最近遇到一个需要调研的需求:识别银行卡信息
具体要求如下:
如果识别出了银行卡信息,那么就把银行卡信息和银行卡图片 发送到后台
如果 识别不了 最好把银行卡图片 截取下拉,送给后台,让后台去识别。yige
在github上看到一个card.io的项目,于是down下来 看了一下,
识别效果:目前只识别出了 带突起银行卡号的 卡,具体还要看银行卡的破损程度。
如果卡号 位置( 也就是数字位置 )上门有金色的 或者高亮的 涂色,并且没有磨损,那么久很容易识别,比如新卡。
可以识别
如果 卡号位置 磨损了 ,导致卡号 高亮部分不明显,那么就识别不了 了。
识别不了
具体使用:
1:引入card.io
compile 'io.card:android-sdk:5.5.1'
2 : (在onclick 中)加入开启扫描的代码
Onclick:{
scan(true);
}
/** * 是否只识别卡 轮廓 图形。true:是, false:不仅识别轮廓图形 ,而且识别卡信息。 * * @param isOnlyScanCard */ public void scan(boolean isOnlyScanCard) { Intent intent = new Intent(this, CardIOActivity.class) // .putExtra(CardIOActivity.EXTRA_HIDE_CARDIO_LOGO, true)//去除水印 // .putExtra(CardIOActivity.EXTRA_SUPPRESS_MANUAL_ENTRY, true)//去除键盘 // .putExtra(CardIOActivity.EXTRA_LANGUAGE_OR_LOCALE, "zh-Hans")//设置提示为中文 // .putExtra(CardIOActivity.EXTRA_REQUIRE_EXPIRY, true) // .putExtra(CardIOActivity.EXTRA_SCAN_RESULT, true) // .putExtra(CardIOActivity.EXTRA_RETURN_CARD_IMAGE, true) // .putExtra(CardIOActivity.EXTRA_REQUIRE_CARDHOLDER_NAME, false) //当扫描卡 成功以后 触发 onCardDetected方法,true: 直接返回图 false:去下个界面校验卡信息 .putExtra(CardIOActivity.EXTRA_SUPPRESS_SCAN, isOnlyScanCard) //是否生成图片的配置 //根据源代码 分析,必须加如下组合配置,才能返回银行卡图片对象bitmap //if (origIntent != null && origIntent.getBooleanExtra(EXTRA_SUPPRESS_CONFIRMATION, false)) { 生成图片} .putExtra(CardIOActivity.EXTRA_SUPPRESS_CONFIRMATION, true) //是否返回图片 配置1 // if (intent == null || !intent.hasExtra(EXTRA_CAPTURED_CARD_IMAGE)) { return null;} .putExtra(CardIOActivity.EXTRA_CAPTURED_CARD_IMAGE, true) //是否返回图片 配置 2:源码没查到,单必须加 .putExtra(CardIOActivity.EXTRA_RETURN_CARD_IMAGE, true) // .putExtra(CardIOActivity.EXTRA_REQUIRE_EXPIRY, true) // default: sdk的银行卡信息验证页面 可以不要 //控制用户是否被提示卡的cvv信息,(baidu :银行卡cvv信息) .putExtra(CardIOActivity.EXTRA_REQUIRE_CVV, false);// default: false // 扫描银行卡后会调整到银行卡的校验页面,让用户 输入日期校验,这里就是控制是否需要校验, // .putExtra(CardIOActivity.EXTRA_REQUIRE_POSTAL_CODE, false); // .putExtra("debug_autoAcceptResult", true); startActivityForResult(intent, 300); }
//扫描卡的详细信息 public void reScanCardInfo() { new Handler().postDelayed(new Runnable() { @Override public void run() { //扫描卡的详细信息 scan(false); } }, 500); }
3: 在onActivityResult 中接收扫描结果
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); String outStr = new String(); if ((requestCode == 300) && data != null) { // && data.hasExtra(CardIOActivity.EXTRA_SCAN_RESULT)) { if (data.hasExtra(CardIOActivity.EXTRA_SCAN_RESULT)) { //扫描出结果信息了: CreditCard result = data.getParcelableExtra(CardIOActivity.EXTRA_SCAN_RESULT); if (result != null) { outStr += "Card number: " + result.cardNumber + "\n"; // Bitmap bitmap = result.getCardType().imageBitmap(this); // ivBankcard.setImageBitmap(bitmap); // Bitmap returnBitmap = CardIOActivity.getCapturedCardImage(data); ivBankcard.setImageBitmap(returnBitmap); } Toast.makeText(this, outStr, Toast.LENGTH_LONG).show(); } else if (resultCode == CardIOActivity.RESULT_SCAN_SUPPRESSED) { //只扫描(识别)出了card图片,并没有完整扫描出卡信息 Bitmap returnBitmap = CardIOActivity.getCapturedCardImage(data); ivBankcard.setImageBitmap(returnBitmap); //接着扫描 卡的详细信息。 reScanCardInfo(); } } else { Toast.makeText(this, "error", Toast.LENGTH_LONG).show(); } }