package eVVM.apk.ui.vaccination; import android.app.Activity; import android.app.Service; import android.content.Intent; import android.os.Vibrator; import android.support.annotation.Nullable; import android.util.Log; import android.view.View; import android.widget.ImageView; import org.json.JSONArray; import java.util.regex.Pattern; import butterknife.BindView; import butterknife.OnClick; import cn.bingoogolapple.photopicker.activity.BGAPhotoPickerActivity; import cn.bingoogolapple.qrcode.core.QRCodeView; import cn.bingoogolapple.qrcode.zxing.ZXingView; import eVVM.apk.R; import eVVM.apk.common.MyActivity; import eVVM.apk.helper.SPUtils; import eVVM.apk.helper.SoundPoolHelper; public class QrCodeActivity extends MyActivity implements QRCodeView.Delegate { @BindView(R.id.zxingview) ZXingView mZXingView; private static final String TAG = QrCodeActivity.class.getSimpleName(); private static final int REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY = 666; @BindView(R.id.img_flashlight) ImageView imgFlashlight; private SoundPoolHelper soundPoolHelper; @Override protected int getLayoutId() { return R.layout.activity_qr_code; } @Override protected int getTitleId() { return R.id.tb_sao_title; } @Override public void onRightClick(View v) { /* 从相册选取二维码图片,这里为了方便演示,使用的是 https://github.com/bingoogolapple/BGAPhotoPicker-Android 这个库来从图库中选择二维码图片,这个库不是必须的,你也可以通过自己的方式从图库中选择图片 */ Intent photoPickerIntent = new BGAPhotoPickerActivity.IntentBuilder(this) .cameraFileDir(null) .maxChooseCount(1) .selectedPhotos(null) .pauseOnScroll(false) .build(); startActivityForResult(photoPickerIntent, REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY); } @Override protected void initView() { mZXingView.setDelegate(this); /* soundPoolHelper = new SoundPoolHelper(2, SoundPoolHelper.TYPE_MUSIC) .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC) .loadDefault(QrCodeActivity.this) .load(QrCodeActivity.this, "saomiaotishi", R.raw.saomiaotishi);*/ } @Override protected void initData() { } private boolean flashlightIsOpen = false; @OnClick({R.id.tv_addbyhand, R.id.tv_skip, R.id.img_flashlight}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.tv_addbyhand: //toast("手动输入"); if (!checkGpsAndNfc()) { return; } startActivity(InoculationRegistActivity.class); break; case R.id.tv_skip: if (!checkGpsAndNfc()) { return; } SPUtils.remove("INOCULATOR_LIST"); startActivityFinish(ReadingActivity.class); break; case R.id.img_flashlight: if (flashlightIsOpen) { imgFlashlight.setImageResource(R.mipmap.flashlight_); mZXingView.closeFlashlight(); // 关闭闪光灯 flashlightIsOpen = false; } else { imgFlashlight.setImageResource(R.mipmap.flashlight); mZXingView.openFlashlight(); // 打开闪光灯 flashlightIsOpen = true; } break; } } @Override public void onScanQRCodeSuccess(String result) { // Log.e("onScanQRCodeSuccessre",""+result); try { vibrate(); //震动 mZXingView.stopSpot(); // 停止识别 // result = Encrypt.decrypt(result); if (result.split("▇").length == 4 || result.split("▇").length == 5 || result.split("▇").length == 6) { //toast("请将手机相应位置靠近疫苗芯片位置"); //String str = (String) SPUtils.get("INOCULATOR_LIST", ""); JSONArray inoculatorArr = new JSONArray(); /*if (!str.equals("")) { inoculatorArr = new JSONArray(str); }*/ inoculatorArr.put(result); // Log.e("onScanQRCodeSuccess",""+inoculatorArr.toString()); SPUtils.put("INOCULATOR_LIST", inoculatorArr.toString()); startActivityFinish(ReadingActivity.class); } else { toast("未能识别二维码"); } } catch (Exception e) { e.printStackTrace(); toast("未能识别二维码"); } } @Override protected void onPause() { super.onPause(); if (mZXingView != null) { //解决多次点击返回时崩溃以及onDestory回调延迟的bug mZXingView.closeFlashlight(); // 关闭闪光灯 } } public static boolean isInteger(String str) { Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$"); return pattern.matcher(str).matches(); } @Override public void onCameraAmbientBrightnessChanged(boolean isDark) { // 这里是通过修改提示文案来展示环境是否过暗的状态,接入方也可以根据 isDark 的值来实现其他交互效果 String tipText = mZXingView.getScanBoxView().getTipText(); String ambientBrightnessTip = "\n环境过暗,请打开闪光灯"; if (isDark) { if (!tipText.contains(ambientBrightnessTip)) { mZXingView.getScanBoxView().setTipText(tipText + ambientBrightnessTip); } } else { if (tipText.contains(ambientBrightnessTip)) { tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip)); mZXingView.getScanBoxView().setTipText(tipText); } } } @Override public void onScanQRCodeOpenCameraError() { Log.e(TAG, "打开相机出错"); } private void vibrate() { Vibrator vib = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); vib.vibrate(new long[]{100, 200}, -1); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); mZXingView.startSpotAndShowRect(); // 显示扫描框,并开始识别 if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE_CHOOSE_QRCODE_FROM_GALLERY) { final String picturePath = BGAPhotoPickerActivity.getSelectedPhotos(data).get(0); // 本来就用到 QRCodeView 时可直接调 QRCodeView 的方法,走通用的回调 mZXingView.decodeQRCode(picturePath); /* 没有用到 QRCodeView 时可以调用 QRCodeDecoder 的 syncDecodeQRCode 方法 这里为了偷懒,就没有处理匿名 AsyncTask 内部类导致 Activity 泄漏的问题 请开发在使用时自行处理匿名内部类导致Activity内存泄漏的问题,处理方式可参考 https://github .com/GeniusVJR/LearningNotes/blob/master/Part1/Android/Android%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%E6%80%BB%E7%BB%93.md */ // new AsyncTask() { // @Override // protected String doInBackground(Void... params) { // return QRCodeDecoder.syncDecodeQRCode(picturePath); // } // // @Override // protected void onPostExecute(String result) { // if (TextUtils.isEmpty(result)) { // Toast.makeText(TestScanActivity.this, "未发现二维码", Toast.LENGTH_SHORT).show(); // } else { // Toast.makeText(TestScanActivity.this, result, Toast.LENGTH_SHORT).show(); // } // } // }.execute(); } } @Override protected void onStart() { super.onStart(); mZXingView.startCamera(); // 打开后置摄像头开始预览,但是并未开始识别 // mZXingView.startCamera(Camera.CameraInfo.CAMERA_FACING_FRONT); // 打开前置摄像头开始预览,但是并未开始识别 mZXingView.startSpotAndShowRect(); // 显示扫描框,并开始识别 } @Override protected void onStop() { mZXingView.stopCamera(); // 关闭摄像头预览,并且隐藏扫描框 super.onStop(); } @Override protected void onDestroy() { mZXingView.onDestroy(); // 销毁二维码扫描控件 // soundPoolHelper.release(); super.onDestroy(); } }