package com.zhiyi.onepay; import android.Manifest; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Toast; import com.qcloud.image.ImageClient; import com.qcloud.image.request.GeneralOcrRequest; import com.uuzuche.lib_zxing.activity.CodeUtils; import com.zhiyi.onepay.data.QrCodeData; import com.zhiyi.onepay.util.RequestUtils; import com.zhiyi.onepay.util.ToastUtil; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class QrcodeUploadActivity extends AppCompatActivity { private static String LOG_TAG = "ZYKJ"; private EditText eMoney; private EditText eName; private Button upButton; private String qrcode; private String currentPhotoString; private ImageClient imageClient; private QrCodeData qrData; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); setContentView(R.layout.activity_qrcode_upload); Intent intent = getIntent(); currentPhotoString = intent.getStringExtra("file"); ImageView img = findViewById(R.id.image_view); img.setImageURI(Uri.fromFile(new File(currentPhotoString))); eMoney = findViewById(R.id.txt_money); eName = findViewById(R.id.txt_name); upButton = findViewById(R.id.btn_upload); upButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { toUpload(); } }); loadImage(); } private void toUpload(){ String money = eMoney.getText().toString(); String name = eName.getText().toString(); if(qrcode == null || qrcode.isEmpty()){ ToastUtil.show(QrcodeUploadActivity.this,"二维码不支持"); return; } if(money == null || money.isEmpty()){ ToastUtil.show(QrcodeUploadActivity.this,"金额未知"); return; } RequestUtils.getRequest(AppConst.authUrl("person/qrcode/upload") + "&money=" + money + "&name=" + name + "&code=" + qrcode, new IHttpResponse() { @Override public void OnHttpData(String data) { //数据是使用Intent返回 Intent intent = new Intent(); //把返回数据存入Intent intent.putExtra("result", data); //设置返回数据 setResult(RESULT_OK, intent); //关闭Activity finish(); } @Override public void OnHttpDataError(IOException e) { ToastUtil.show(QrcodeUploadActivity.this,"上传失败"+e.getMessage()); } }); } private void loadImage(){ Bitmap bitmap = BitmapFactory.decodeFile(currentPhotoString); if (bitmap == null) { Log.w(LOG_TAG, "bitmap is null" + currentPhotoString); String[] mPermissionList = new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}; ActivityCompat.requestPermissions(this, mPermissionList, 100); return; } // LuminanceSource source = new BufferedImageLuminanceSource(bitmap); // Map<DecodeHintType,Object> hints = new LinkedHashMap<>(); // hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); // hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE); // // // 设置继续的字符编码格式为UTF8 // hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); // // BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); // Result rs = null; // try { // rs = new QRCodeReader().decode(binaryBitmap,hints); // } catch (NotFoundException e) { // return; // } catch (FormatException e) { // } catch (ChecksumException e) { // } // qrcode = ""; // if (rs != null) { // String txt = rs.getText(); // Log.w(LOG_TAG, txt); // if (txt != null) { // readTxt(currentPhotoString, txt); // }else{ // ToastUtil.show(this,"二维码解析失败"); // } // }else{ // Log.w(LOG_TAG, "decoder result is null"); // ToastUtil.show(this,"二维码解析失败"); // } qrcode = ""; CodeUtils.analyzeBitmap(currentPhotoString, new CodeUtils.AnalyzeCallback() { @Override public void onAnalyzeSuccess(Bitmap mBitmap, String result) { readTxt(currentPhotoString, result); } @Override public void onAnalyzeFailed() { ToastUtil.show(QrcodeUploadActivity.this,"二维码解析失败"); } }); } private void readTxt(final String file, final String url) { final int type; if (url.toUpperCase().startsWith("WXP://")) { type = QrCodeData.TYPE_WX; } else if (url.toUpperCase().startsWith("HTTPS://QR.ALIPAY.COM")) { type = QrCodeData.TYPE_ALI; } else { Log.w(LOG_TAG, "qrcode is not enable"); Toast.makeText(this, "不支持选择的二维码,请选择支付宝/微信收款码", Toast.LENGTH_SHORT).show(); return; } qrcode = url; // Android 4.0 之后不能在主线程中请求HTTP请求 new Thread(new Runnable() { @Override public void run() { qrData = new QrCodeData(); qrData.money = "0"; qrData.name = ""; do { String bucketName = "qrcode-1252008836"; if (imageClient == null) { String appId = "1252008836"; String secretId = "AKIDUJ5ZBdw7MivIfx7C82mLFe9aEiJksLxX"; String secretKey = "BB0ra9oOEwcOaeXdbTAg4LRMXouqgT6Y"; imageClient = new ImageClient(appId, secretId, secretKey, ImageClient.NEW_DOMAIN_recognition_image_myqcloud_com); } File tagImage; try { tagImage = new File(file); } catch (Exception ex) { Log.w(LOG_TAG, ex); break; } GeneralOcrRequest tagReq = new GeneralOcrRequest(bucketName, tagImage); String ret = imageClient.generalOcr(tagReq); try { JSONObject jsonObject = new JSONObject(ret); int code = jsonObject.getInt("code"); if (code != 0) { Log.w(LOG_TAG, "image ORC code is " + code); Log.w(LOG_TAG, ret); break; } if (!jsonObject.has("data")) { Log.w(LOG_TAG, "image ORC no data "); break; } JSONArray array = jsonObject.getJSONObject("data").getJSONArray("items"); if (array == null) { Log.w(LOG_TAG, "image ORC no items "); break; } Pattern pMoney = Pattern.compile("¥([\\d\\.]+)"); if (type == QrCodeData.TYPE_WX) { Pattern pWeixinNick = Pattern.compile("(\\S+)\\(\\*"); for (int i = 0; i < array.length(); i++) { JSONObject item = array.getJSONObject(i); if (item.has("itemstring")) { String value = item.getString("itemstring"); Matcher m = pMoney.matcher(value); if (m.find()) { qrData.money = m.group(1); continue; } m = pWeixinNick.matcher(value); if (m.find()) { qrData.name = m.group(1); continue; } } } } else if (type == QrCodeData.TYPE_ALI) { Pattern aliNick = Pattern.compile("支付宝|LIPAY"); for (int i = 0; i < array.length(); i++) { JSONObject item = array.getJSONObject(i); if (item.has("itemstring")) { String value = item.getString("itemstring"); Matcher m = pMoney.matcher(value); if (m.find()) { qrData.money = m.group(1); continue; } m = aliNick.matcher(value); if (m.find()) { continue; } else { qrData.name = value; } } } } if (!qrData.name.matches("^\\S+$")) { qrData.name = ""; } qrData.type = type; } catch (JSONException e) { Log.w(LOG_TAG, e); } Log.i(LOG_TAG, qrData.money + qrData.name); }while (false); Runnable runnable = new Runnable() { @Override public void run() { eMoney.setText(qrData.money); if(!qrData.name.isEmpty()){ eName.setText(qrData.name); } } }; handler.post(runnable); } }).start(); } }