左晓为主开发手持机充值管理机
zuoxiao
2023-12-01 57dfbac311ccaa6900c0450e71460856010a0bad
身份证识别相关资源和代码
6 文件已重命名
8个文件已修改
1个文件已删除
879 ■■■■ 已修改文件
app/build.gradle 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/androidTest/java/com/dayu/recharge/ExampleInstrumentedTest.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/MyApplication.java 116 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/AdminSetupActivity.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/CameraActivity.java 700 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/LoginActivity.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/jniLibs/arm64-v8a/libIDCardengine.so 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/jniLibs/arm64-v8a/libimageengine.so 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/jniLibs/armeabi-v7a/libIDCardengine.so 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/jniLibs/armeabi-v7a/libimageengine.so 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/jniLibs/armeabi/libIDCardengine.so 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/jniLibs/armeabi/libimageengine.so 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_new_card.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -10,11 +10,10 @@
        targetSdk 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk{
            abiFilters 'armeabi-v7a'
        ndk {
            abiFilters "arm64-v8a","armeabi","armeabi-v7a"
        }
    }
@@ -50,6 +49,8 @@
    //room数据库
    implementation "androidx.room:room-runtime:2.3.0"
    implementation "androidx.room:room-ktx:2.3.0"
    implementation files('libs\\ccimg_20170424.jar')
    implementation files('libs\\ccidcard_20211231.jar')
    runtimeOnly("androidx.room:room-common:2.3.0")
    annotationProcessor "androidx.room:room-compiler:2.3.0"
app/src/androidTest/java/com/dayu/recharge/ExampleInstrumentedTest.java
File was deleted
app/src/main/AndroidManifest.xml
@@ -33,6 +33,7 @@
    <!--用于申请调用A-GPS模块-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <application
        android:name=".MyApplication"
@@ -94,7 +95,7 @@
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.nfc.action.ACTION_NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
@@ -117,7 +118,9 @@
        <activity android:name=".activity.IdentifyingActivity" />
        <activity android:name=".activity.ReplacementActivity" />
        <activity android:name=".activity.RechargeDetail" />
        <activity android:name=".activity.CameraActivity"/>
        <activity
            android:name=".activity.CameraActivity"
            android:screenOrientation="landscape" />
        <meta-data
app/src/main/java/com/dayu/recharge/MyApplication.java
@@ -74,6 +74,9 @@
    /**
     * 初始化EasySocket
     *
     * @param isCreate   当前已连接服务器后是否重新连接
     * @param createBack
     */
    public void initEasySocket(boolean isCreate, SocketNet.CreateBack createBack) {
        try {
@@ -84,6 +87,7 @@
                ipBean.setIp("dayuyanjiuyuan.top");
                ipBean.setPort(8888);
            }
            if (ipBean != null) {
                try {
                    //处理当连接上IP后修改ip不生效问题
@@ -149,76 +153,76 @@
                && !TextUtils.isEmpty(addressCode)) {
            Log.i("initMachineRequestBean", "开始注册设备");
                if (EasySocket.getInstance().getDefconnection() != null) {
                    isDoInitMachine = true;
                    InitMachineRequestBean initMachineRequestBean = new InitMachineRequestBean();
                    initMachineRequestBean.setControl("01");
                    //130107200008    112    青泉居委会
                    initMachineRequestBean.setAddress(addressCode);
                    initMachineRequestBean.setXuLie(SocketUtil.getXuLie(this));
                    initMachineRequestBean.setAFN("91");
                    SocketNet.getInstance().sendTestMessage(initMachineRequestBean.pack(), new SocketCallBack() {
                        @Override
                        public void onSocketResponse(SocketData readData) {
            if (EasySocket.getInstance().getDefconnection() != null) {
                isDoInitMachine = true;
                InitMachineRequestBean initMachineRequestBean = new InitMachineRequestBean();
                initMachineRequestBean.setControl("01");
                //130107200008    112    青泉居委会
                initMachineRequestBean.setAddress(addressCode);
                initMachineRequestBean.setXuLie(SocketUtil.getXuLie(this));
                initMachineRequestBean.setAFN("91");
                SocketNet.getInstance().sendTestMessage(initMachineRequestBean.pack(), new SocketCallBack() {
                    @Override
                    public void onSocketResponse(SocketData readData) {
                            if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                                //校验CRC成功
                                InitMachineBackBean initMachineBackBean = new InitMachineBackBean();
                                String initCode = HexUtil.bytesToHex(Arrays.copyOfRange(readData.getBodyBytes(), 2, 18));
                                //确认收到注册号报文
                                ConfirmMachineRequestBean confirmMachineRequestBean = new ConfirmMachineRequestBean();
                                confirmMachineRequestBean.setControl("01");
                                //130107200008    112    青泉居委会
                                confirmMachineRequestBean.setAddress(addressCode);
                                confirmMachineRequestBean.setXuLie(SocketUtil.getXuLie(MyApplication.this));
                                confirmMachineRequestBean.setAFN("92");
                                confirmMachineRequestBean.setInitCode(initCode);
                                Log.i("Socket", "确认注册报文");
                                SocketNet.getInstance().sendTestMessage(confirmMachineRequestBean.pack(), new SocketCallBack() {
                        if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                            //校验CRC成功
                            InitMachineBackBean initMachineBackBean = new InitMachineBackBean();
                            String initCode = HexUtil.bytesToHex(Arrays.copyOfRange(readData.getBodyBytes(), 2, 18));
                            //确认收到注册号报文
                            ConfirmMachineRequestBean confirmMachineRequestBean = new ConfirmMachineRequestBean();
                            confirmMachineRequestBean.setControl("01");
                            //130107200008    112    青泉居委会
                            confirmMachineRequestBean.setAddress(addressCode);
                            confirmMachineRequestBean.setXuLie(SocketUtil.getXuLie(MyApplication.this));
                            confirmMachineRequestBean.setAFN("92");
                            confirmMachineRequestBean.setInitCode(initCode);
                            Log.i("Socket", "确认注册报文");
                            SocketNet.getInstance().sendTestMessage(confirmMachineRequestBean.pack(), new SocketCallBack() {
                                    @Override
                                    public void onSocketResponse(SocketData readData) {
                                        isDoInitMachine = false;
                                        if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                                            byte stateByte = readData.getBodyBytes()[2];
                                            String state = BcdUtil.bcdToStr(stateByte);
                                            //BCD码00成功01失败(注册号不是服务器返回信息)
                                            if (state.equalsIgnoreCase("00")) {
                                                //保存设备注册号
                                                if (!TextUtils.isEmpty(initCode)){
                                                    DeviceNumberUtils.setDeviceNumber(initCode);
                                                }
                                                Log.i(TAG, "onSuccess: 设备注册号:" + initCode);
//                                            WSHelper.getInstance(MyApplication.this).put("initCode", initCode);
                                                ToastUtil.show("充值管理注册报文获取成功");
                                            } else {
                                                //校验CRC错误
                                                ToastUtil.show("确认收到注册报文状态失败");
                                @Override
                                public void onSocketResponse(SocketData readData) {
                                    isDoInitMachine = false;
                                    if (CRC8.isCRC8(readData.getOriginDataBytes())) {
                                        byte stateByte = readData.getBodyBytes()[2];
                                        String state = BcdUtil.bcdToStr(stateByte);
                                        //BCD码00成功01失败(注册号不是服务器返回信息)
                                        if (state.equalsIgnoreCase("00")) {
                                            //保存设备注册号
                                            if (!TextUtils.isEmpty(initCode)) {
                                                DeviceNumberUtils.setDeviceNumber(initCode);
                                            }
                                            Log.i(TAG, "onSuccess: 设备注册号:" + initCode);
//                                            WSHelper.getInstance(MyApplication.this).put("initCode", initCode);
                                            ToastUtil.show("充值管理注册报文获取成功");
                                        } else {
                                            //校验CRC错误
                                            ToastUtil.show("确认收到注册报文校验CRC错误");
//                                                ToastUtil.show("确认收到注册报文状态失败");
                                        }
                                    } else {
                                        //校验CRC错误
                                        ToastUtil.show("确认收到注册报文校验CRC错误");
                                    }
                                }
                                    @Override
                                    public void onSocketError(int code, String msg) {
                                @Override
                                public void onSocketError(int code, String msg) {
                                    }
                                });
                            } else {//校验CRC错误
                                ToastUtil.show("充值管理注册报文校验CRC错误");
                            }
                                }
                            });
                        } else {//校验CRC错误
                            ToastUtil.show("充值管理注册报文校验CRC错误");
                        }
                    }
                        @Override
                        public void onSocketError(int code, String msg) {
                    @Override
                    public void onSocketError(int code, String msg) {
                        }
                    });
                    }
                });
                }
            }
        }
    }
app/src/main/java/com/dayu/recharge/activity/AdminSetupActivity.java
@@ -13,6 +13,7 @@
import com.dayu.recharge.dbBean.AdminDataBean;
import com.dayu.recharge.dbBean.IpBean;
import com.dayu.recharge.utils.TipUtil;
import com.easysocket.EasySocket;
import com.example.pickerviewlibrary.picker.TeaPickerView;
import com.example.pickerviewlibrary.picker.entity.PickerData;
import com.example.pickerviewlibrary.picker.listener.OnPickerClickListener;
app/src/main/java/com/dayu/recharge/activity/CameraActivity.java
@@ -21,6 +21,7 @@
import android.widget.TextView;
import android.widget.Toast;
import com.dayu.recharge.R;
import com.dayu.recharge.view.ViewfinderView;
import com.yunmai.cc.idcard.controler.CameraManager;
@@ -28,399 +29,422 @@
import com.yunmai.cc.idcard.controler.OcrManager;
import com.yunmai.cc.idcard.vo.IdCardInfoNew;
import java.io.UnsupportedEncodingException;
/**
 * 视频识别类
 *
 *
 * @author fangcm 2013-03-18
 *
 */
public class CameraActivity extends BaseActivity implements SurfaceHolder.Callback {
public class CameraActivity extends Activity implements SurfaceHolder.Callback {
    private final String TAG = "cc_idcard";
    private final String TAG = "cc_idcard";
    private TextView tvTips;
    private SurfaceView sv_preview;
    private SurfaceHolder surfaceHolder;
    private CameraManager cameraManager;
    private boolean autoFoucs = true;
    private ViewfinderView finderView;
    private OcrManager ocrManager;
    private Rect rect;
    private boolean cameraError = false;
    // private boolean over = false;
    private TextView tvTips;
    private SurfaceView sv_preview;
    private SurfaceHolder surfaceHolder;
    private CameraManager cameraManager;
    private boolean autoFoucs = true;
    private ViewfinderView finderView;
    private OcrManager ocrManager;
    private Rect rect;
    private boolean cameraError = false;
    // private boolean over = false;
    private Button btnFlash, btnCancel;
    private ImageView imgTips;
    private ImageView iv, ivHead;
    private int typeFront = 1;// 0不区分 ,1正面,2背面
    private Button btnFlash, btnCancel;
    private ImageView imgTips;
    private ImageView iv, ivHead;
    private int typeFront = 0;// 0不区分 ,1正面,2背面
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);
        typeFront = this.getIntent().getIntExtra("typeFront", 0);
        initView();
        cameraManager = new CameraManager(getBaseContext(), mHandler);
        mCameraOpenThread.start();
        try {
            mCameraOpenThread.join();
            mCameraOpenThread = null;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            cameraError = true;
        }
        if (cameraError) {
            Toast.makeText(getBaseContext(), "照相机未启动!", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        setParameters();
        typeFront = this.getIntent().getIntExtra("typeFront", 0);
        initView();
        cameraManager = new CameraManager(getBaseContext(), mHandler);
        mCameraOpenThread.start();
        try {
            mCameraOpenThread.join();
            mCameraOpenThread = null;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            cameraError = true;
        }
        if (cameraError) {
            Toast.makeText(getBaseContext(), "照相机未启动!", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        setParameters();
    }
    }
    private Thread mCameraOpenThread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                cameraManager.openCamera();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                cameraError = true;
            }
        }
    });
    private Thread mCameraOpenThread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                cameraManager.openCamera();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                cameraError = true;
            }
        }
    });
    private void setParameters() {
    private void setParameters() {
        WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();
        int wWidth = display.getWidth();
        int wHeight = display.getHeight();
        WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();
        int wWidth = display.getWidth();
        int wHeight = display.getHeight();
        cameraManager.setCameraFlashModel(Camera.Parameters.FLASH_MODE_OFF);
        cameraManager.setCameraFlashModel(Camera.Parameters.FLASH_MODE_OFF);
        float ps = wWidth * 1.0f / wHeight;
        cameraManager.setPreviewSize(ps);
        float ps = wWidth * 1.0f / wHeight;
        cameraManager.setPreviewSize(ps);
        int pWidth = cameraManager.getPreviewWidth();
        int pHeight = cameraManager.getPreviewHeight();
        if (pWidth == 0 || pHeight == 0) {
            Toast.makeText(getBaseContext(), "照相机未启动!!", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        Log.i(TAG, pWidth + "<--------W----Preview-----H------->" + pHeight);
        Log.i(TAG, wWidth + "<--------W----WindowManager-----H------->" + wHeight);
        int pWidth = cameraManager.getPreviewWidth();
        int pHeight = cameraManager.getPreviewHeight();
        if (pWidth == 0 || pHeight == 0) {
            Toast.makeText(getBaseContext(), "照相机未启动!!", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }
        Log.i(TAG, pWidth + "<--------W----Preview-----H------->" + pHeight);
        Log.i(TAG, wWidth + "<--------W----WindowManager-----H------->" + wHeight);
        int tempWidth = pWidth;
        int tempHeidht = pHeight;
        float x = 100.0f;
        int tempW = pWidth;
        int tempH = pHeight;
        if (wWidth > pWidth && wHeight > pHeight) {
            while (wWidth > tempW && wHeight > tempH) {
                x++;
                Log.d(TAG, "---xx----->" + x / 100.0);
                tempW = (int) (pWidth * x / 100.0);
                tempH = (int) (pHeight * x / 100.0);
                if (wWidth > tempW && wHeight > tempH) {
                    tempWidth = tempW;
                    tempHeidht = tempH;
                }
            }
            Log.d(TAG, "<------11--wWidth > pWidth && wHeight > pHeight------>");
        } else {
            while (tempWidth > wWidth || tempHeidht > wHeight) {
                x--;
                Log.d(TAG, "---xx----->" + x / 100.0);
                tempWidth = (int) (pWidth * x / 100.0);
                tempHeidht = (int) (pHeight * x / 100.0);
            }
            Log.d(TAG, "<-----22---tempWidth > wWidth || tempHeidht > wHeight------>");
        }
        int tempWidth = pWidth;
        int tempHeidht = pHeight;
        float x = 100.0f;
        int tempW = pWidth;
        int tempH = pHeight;
        if (wWidth > pWidth && wHeight > pHeight) {
            while (wWidth > tempW && wHeight > tempH) {
                x++;
                Log.d(TAG, "---xx----->" + x / 100.0);
                tempW = (int) (pWidth * x / 100.0);
                tempH = (int) (pHeight * x / 100.0);
                if (wWidth > tempW && wHeight > tempH) {
                    tempWidth = tempW;
                    tempHeidht = tempH;
                }
            }
            Log.d(TAG, "<------11--wWidth > pWidth && wHeight > pHeight------>");
        } else {
            while (tempWidth > wWidth || tempHeidht > wHeight) {
                x--;
                Log.d(TAG, "---xx----->" + x / 100.0);
                tempWidth = (int) (pWidth * x / 100.0);
                tempHeidht = (int) (pHeight * x / 100.0);
            }
            Log.d(TAG, "<-----22---tempWidth > wWidth || tempHeidht > wHeight------>");
        }
        Log.d(TAG, tempWidth + "<--------W----setParameters-----H------->" + tempHeidht);
        // tempWidth = 854;
        // tempHeidht = 480;
        ViewGroup.LayoutParams lp = sv_preview.getLayoutParams();
        lp.width = tempWidth;
        lp.height = tempHeidht;
        sv_preview.getHolder().setFixedSize(tempWidth, tempHeidht);
        sv_preview.setLayoutParams(lp);
        Log.d(TAG, tempWidth + "<--------W----setParameters-----H------->" + tempHeidht);
        // tempWidth = 854;
        // tempHeidht = 480;
        ViewGroup.LayoutParams lp = sv_preview.getLayoutParams();
        lp.width = tempWidth;
        lp.height = tempHeidht;
        sv_preview.getHolder().setFixedSize(tempWidth, tempHeidht);
        sv_preview.setLayoutParams(lp);
        surfaceHolder = sv_preview.getHolder();
        surfaceHolder.addCallback(CameraActivity.this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder = sv_preview.getHolder();
        surfaceHolder.addCallback(CameraActivity.this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        float[] img = finderView.initFinder(tempWidth, tempHeidht, mHandler, typeFront);
        float[] img = finderView.initFinder(tempWidth, tempHeidht, mHandler, typeFront);
        imgTips.setY(img[0]);
        imgTips.setX(img[1]);
        imgTips.setY(img[0]);
        imgTips.setX(img[1]);
    }
    }
    private void initView() {
        sv_preview = (SurfaceView) findViewById(R.id.camera_sv);
        finderView = (ViewfinderView) findViewById(R.id.camera_finderView);
        tvTips = (TextView) findViewById(R.id.tv_tips);
        btnCancel = (Button) findViewById(R.id.bt_cancel);
        btnFlash = (Button) findViewById(R.id.bt_flash);
        imgTips = (ImageView) findViewById(R.id.iv_tips);
        switch (typeFront) {
        case 0:
            imgTips.setVisibility(View.GONE);
            break;
        case 1:
            imgTips.setBackgroundResource(R.mipmap.people_face);
            break;
        case 2:
            imgTips.setBackgroundResource(R.mipmap.emblem);
            break;
    private void initView() {
        sv_preview = (SurfaceView) findViewById(R.id.camera_sv);
        finderView = (ViewfinderView) findViewById(R.id.camera_finderView);
        tvTips = (TextView) findViewById(R.id.tv_tips);
        btnCancel = (Button) findViewById(R.id.bt_cancel);
        btnFlash = (Button) findViewById(R.id.bt_flash);
        imgTips = (ImageView) findViewById(R.id.iv_tips);
        switch (typeFront) {
            case 0:
                imgTips.setVisibility(View.GONE);
                break;
            case 1:
                imgTips.setBackgroundResource(R.mipmap.people_face);
                break;
            case 2:
                imgTips.setBackgroundResource(R.mipmap.emblem);
                break;
        default:
            break;
        }
            default:
                break;
        }
        btnFlash.setOnClickListener(listener);
        btnCancel.setOnClickListener(listener);
    }
        btnFlash.setOnClickListener(listener);
        btnCancel.setOnClickListener(listener);
    }
    private boolean isFlashOn = false;
    private boolean isFlashOn = false;
    private OnClickListener listener = new OnClickListener() {
    private OnClickListener listener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
            case R.id.bt_cancel:
                setResult(998);
                finish();
                break;
            case R.id.bt_flash:
                if (isFlashOn) {
                    try {
                        if (cameraManager.closeFlashlight()) {
                            btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_on_s));
                            isFlashOn = false;
                        }
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch (v.getId()) {
                case R.id.bt_cancel:
                    setResult(998);
                    finish();
                    break;
                case R.id.bt_flash:
                    if (isFlashOn) {
                        try {
                            if (cameraManager.closeFlashlight()) {
                                btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_on_s));
                                isFlashOn = false;
                            }
                        } catch (Exception e) {
                            // TODO: handle exception
                        }
                } else {
                    try {
                        if (cameraManager.openFlashlight()) {
                            btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_off_s));
                            isFlashOn = true;
                        }
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    } else {
                        try {
                            if (cameraManager.openFlashlight()) {
                                btnFlash.setBackgroundDrawable(getResources().getDrawable(R.mipmap.flash_off_s));
                                isFlashOn = true;
                            }
                        } catch (Exception e) {
                            // TODO: handle exception
                        }
                }
                break;
                    }
                    break;
            default:
                break;
            }
        }
    };
                default:
                    break;
            }
        }
    };
    private Handler mHandler = new Handler() {
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            switch (msg.what) {
            case OcrConstant.TAKE_PREVIEW_DATA_OK:
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            switch (msg.what) {
                case OcrConstant.TAKE_PREVIEW_DATA_OK:
                    Log.d("yxl", "TAKE_PREVIEW_DATA_OK");
                    if (ocrManager == null) {
                        ocrManager = new OcrManager(mHandler, CameraActivity.this);
                        try {
                            rect = cameraManager.getViewfinder(finderView.getFinder());
                        } catch (Exception e) {
                            // TODO: handle exception
                            return;
                        }
                if (ocrManager == null) {
                    ocrManager = new OcrManager(mHandler, CameraActivity.this);
                    try {
                        rect = cameraManager.getViewfinder(finderView.getFinder());
                    } catch (Exception e) {
                        // TODO: handle exception
                        return;
                    }
                    }
                }
                byte[] data_p = (byte[]) msg.obj;
                if (data_p != null && data_p.length > 0) {
                    // if(over){
                    // return;
                    // }
                    ocrManager.recognIDCard(data_p, cameraManager.getPreviewWidth(), cameraManager.getPreviewHeight(),
                            rect, 0, typeFront);
                    mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 100);
                } else {
                    finderView.setLineRect(0);
                    Toast.makeText(getBaseContext(), "相机出现问题,请重启手机!", Toast.LENGTH_SHORT).show();
                    mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                }
                break;
            case OcrConstant.RECOGN_OK:
                mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
                mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
                    byte[] data_p = (byte[]) msg.obj;
                    if (data_p != null && data_p.length > 0) {
                        // if(over){
                        // return;
                        // }
                        ocrManager.recognIDCard(data_p, cameraManager.getPreviewWidth(), cameraManager.getPreviewHeight(),
                                rect, 0, typeFront);
                        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 100);
                    } else {
                        finderView.setLineRect(0);
                        Toast.makeText(getBaseContext(), "相机出现问题,请重启手机!", Toast.LENGTH_SHORT).show();
                        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                    }
                    break;
                case OcrConstant.RECOGN_OK:
                    Log.d("yxl", "RECOGN_OK");
                    mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
                    mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
//                String imgPath = "/sdcard/aidtest.jpg";
//                String headPath = "/sdcard/aidheadtest.jpg";
                byte[] headPath = new byte[2048 * 1024 * 3];
                byte[] imgPath = new byte[2048 * 1024 * 3];
                int[] headRect = new int[8];
                int[] imgRect = new int[8];
                    byte[] headPath = new byte[2048 * 1024 * 2];
                    byte[] imgPath = new byte[2048 * 1024 * 2];
                    int[] headRect = new int[8];
                    int[] imgRect = new int[8];
                IdCardInfoNew idCardInfo = ocrManager.getResultToByte(imgPath, imgRect, headPath, headRect);
                    IdCardInfoNew idCardInfo = ocrManager.getResultToByte(imgPath, imgRect, headPath, headRect);
                    try {
                        String OCRResult = new String(idCardInfo.getCharInfo(), "gbk");
                        Intent intent = new Intent();
                        intent.putExtra("OCRResult", OCRResult);
                        setResult(RESULT_OK, intent);
                    } catch (UnsupportedEncodingException e) {
                        throw new RuntimeException(e);
                    }
//                IdCardInfo idCardInfo = ocrManager.getResult(imgPath, headPath);
                Intent data2 = new Intent();
                data2.putExtra("idcardinfo", idCardInfo);
                setResult(200, data2);
//                AppDemo.setResult(idCardInfo);
//                Intent data2 = new Intent();
//                data2.putExtra("idcardinfo", idCardInfo);
//                setResult(200, data2);
                    finish();
                    break;
                case OcrConstant.REPEAT_AUTOFOCUS:
                    Log.d("yxl", "REPEAT_AUTOFOCUS");
                finish();
                    cameraManager.autoFoucs();
                    mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 2000);
                    break;
                case OcrConstant.RECOGN_EG_TIME_OUT:
                    Log.d("yxl", "RECOGN_EG_TIME_OUT");
                    Toast.makeText(getBaseContext(), "引擎过期,请尽快更新!", Toast.LENGTH_LONG).show();
                    finish();
                    break;
                case OcrConstant.RECOGN_EG_LICENSE:
                    Log.d("yxl", "RECOGN_EG_LICENSE");
                break;
            case OcrConstant.REPEAT_AUTOFOCUS:
                cameraManager.autoFoucs();
                mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 2000);
                break;
            case OcrConstant.RECOGN_EG_TIME_OUT:
                Toast.makeText(getBaseContext(), "引擎过期,请尽快更新!", Toast.LENGTH_LONG).show();
                finish();
                break;
            case OcrConstant.RECOGN_EG_LICENSE:
                int ret = -1;
                if (msg.obj != null) {
                    ret = (Integer) msg.obj;
                }
                Toast.makeText(getBaseContext(), "授权失败-->" + ret, Toast.LENGTH_LONG).show();
                finish();
                break;
            case OcrConstant.RECOGN_EG_INIT_ERROR:
                Toast.makeText(getBaseContext(), "引擎初始化失败!", Toast.LENGTH_LONG).show();
                finish();
                break;
            case OcrConstant.START_AUTOFOCUS:
                if (autoFoucs) {
                    cameraManager.autoFoucs();
                    autoFoucs = false;
                    mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                    mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 1500);
                } else {
                    cameraManager.autoFocusAndPreviewCallback();
                }
                break;
            case OcrConstant.RECOGN_LINE_IN_RECT:
                int restult = (Integer) msg.obj;
                finderView.setLineRect(restult);
                break;
            case OcrConstant.RECOGN_TIPS:
                int tips = (Integer) msg.obj;
                switch (tips) {
                case 1000:
                    tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
                    break;
                case 1001:
                    tvTips.setText("距离稍近,请尝试远点");
                    break;
                case 1002:
                    tvTips.setText("距离稍远,请尝试靠近");
                    break;
                case 1003:
                    // tvTips.setText("图像模糊,请调整距离");
                    break;
                case 1004:
                    tvTips.setText("图像倾斜,请保持水平拍摄");
                    break;
                case 1005:
                    tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
                    break;
                case 1006:
                    tvTips.setText("请将身份证正面至于此区域");
                    break;
                case 1007:
                    tvTips.setText("请将身份证反面至于此区域");
                    break;
                    int ret = -1;
                    if (msg.obj != null) {
                        ret = (Integer) msg.obj;
                    }
                    Toast.makeText(getBaseContext(), "授权失败-->" + ret, Toast.LENGTH_LONG).show();
                    finish();
                    break;
                case OcrConstant.RECOGN_EG_INIT_ERROR:
                    Log.d("yxl", "RECOGN_EG_INIT_ERROR");
                default:
                    break;
                }
                    Toast.makeText(getBaseContext(), "引擎初始化失败!", Toast.LENGTH_LONG).show();
                    finish();
                    break;
                case OcrConstant.START_AUTOFOCUS:
                    Log.d("yxl", "START_AUTOFOCUS");
                break;
            default:
                cameraManager.initDisplay();
                mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                Toast.makeText(getBaseContext(), "<>" + msg.what, Toast.LENGTH_SHORT).show();
                break;
            }
        }
                    if (autoFoucs) {
                        cameraManager.autoFoucs();
                        autoFoucs = false;
                        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                        mHandler.sendEmptyMessageDelayed(OcrConstant.REPEAT_AUTOFOCUS, 1500);
                    } else {
                        cameraManager.autoFocusAndPreviewCallback();
                    }
                    break;
                case OcrConstant.RECOGN_LINE_IN_RECT:
                    Log.d("yxl", "RECOGN_LINE_IN_RECT");
    };
                    int restult = (Integer) msg.obj;
                    finderView.setLineRect(restult);
                    break;
                case OcrConstant.RECOGN_TIPS:
                    Log.d("yxl", "RECOGN_TIPS");
                    int tips = (Integer) msg.obj;
                    switch (tips) {
                        case 1000:
                            tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
                            break;
                        case 1001:
                            tvTips.setText("距离稍近,请尝试远点");
                            break;
                        case 1002:
                            tvTips.setText("距离稍远,请尝试靠近");
                            break;
                        case 1003:
                            // tvTips.setText("图像模糊,请调整距离");
                            break;
                        case 1004:
                            tvTips.setText("图像倾斜,请保持水平拍摄");
                            break;
                        case 1005:
                            tvTips.setText("请将身份证置于此区域\r\n尝试对齐边缘");
                            break;
                        case 1006:
                            tvTips.setText("请将身份证正面至于此区域");
                            break;
                        case 1007:
                            tvTips.setText("请将身份证反面至于此区域");
                            break;
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.d(TAG, "surfaceCreated");
        if (!cameraManager.cameraOpened()) {
            cameraManager.openCamera();
            setParameters();
        }
    }
                        default:
                            break;
                    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
        if (holder.getSurface() == null) {
            Log.d(TAG, "holder.getSurface() == null");
            return;
        }
        Log.v(TAG, "surfaceChanged. w=" + width + ". h=" + height);
        surfaceHolder = holder;
        cameraManager.setPreviewDisplay(surfaceHolder);
        cameraManager.initDisplay();
        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                    break;
                default:
                    Log.d("yxl", "default");
                    cameraManager.initDisplay();
                    mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
                    Toast.makeText(getBaseContext(), "<>" + msg.what, Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    }
    };
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.d(TAG, "surfaceDestroyed");
        try {
            cameraManager.closeCamera();
        } catch (Exception e) {
            // TODO: handle exception
        }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.d(TAG, "surfaceCreated");
        if (!cameraManager.cameraOpened()) {
            cameraManager.openCamera();
            setParameters();
        }
    }
        surfaceHolder = null;
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
        if (holder.getSurface() == null) {
            Log.d(TAG, "holder.getSurface() == null");
            return;
        }
        Log.v(TAG, "surfaceChanged. w=" + width + ". h=" + height);
        surfaceHolder = holder;
        cameraManager.setPreviewDisplay(surfaceHolder);
        cameraManager.initDisplay();
        mHandler.sendEmptyMessageDelayed(OcrConstant.START_AUTOFOCUS, 500);
    private void finishAll() {
        if (cameraManager != null) {
            try {
                cameraManager.closeCamera();
            } catch (Exception e) {
                // TODO: handle exception
            }
    }
        }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        Log.d(TAG, "surfaceDestroyed");
        try {
            cameraManager.closeCamera();
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
        surfaceHolder = null;
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
        mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
        finishAll();
    private void finishAll() {
        if (cameraManager != null) {
            try {
                cameraManager.closeCamera();
            } catch (Exception e) {
                // TODO: handle exception
            }
    }
        }
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mHandler.removeMessages(OcrConstant.TAKE_PREVIEW_DATA_OK);
        mHandler.removeMessages(OcrConstant.START_AUTOFOCUS);
        finishAll();
    }
}
app/src/main/java/com/dayu/recharge/activity/LoginActivity.java
@@ -54,7 +54,8 @@
    }
    private void getPermission() {
        PermissionX.init(LoginActivity.this).permissions(Manifest.permission.READ_PHONE_STATE,
        PermissionX.init(LoginActivity.this).permissions(
                Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .onExplainRequestReason((scope, deniedList) -> {
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java
@@ -62,6 +62,7 @@
        setData();
        initView();
//        LibraryInitOCR.initOCR(NewCardActivity.this);
//        registerForActivityResult()
    }
    private void initView() {
@@ -135,7 +136,7 @@
    private void startCamera() {
        Intent intent = new Intent(NewCardActivity.this, CameraActivity.class);
        intent.putExtra("typeFront", 1);
        startActivityForResult(intent, 110);
        startActivityForResult(intent, SCAN_IDCARD_REQUEST);
    }
    @Override
@@ -160,9 +161,17 @@
//                    sb.append(String.format("整体照片 = %s\n", jo.opt("imgPath")));
//                    sb.append(String.format("头像路径 = %s\n", jo.opt("headPath")));
                        newCardBinding.newCardName.setText(jo.opt("name").toString());
                        newCardBinding.newCardId.setText(jo.opt("num").toString());
                        newCardBinding.newCardIdTip.setVisibility(View.VISIBLE);
                        String name = jo.getJSONObject("Name").opt("value").toString();
                        String idNumber = jo.getJSONObject("Num").opt("value").toString();
                        this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                newCardBinding.newCardName.setText(name);
                                newCardBinding.newCardId.setText(idNumber);
                                newCardBinding.newCardIdTip.setVisibility(View.VISIBLE);
                            }
                        });
                    } catch (JSONException e) {
                        throw new RuntimeException(e);
app/src/main/jniLibs/arm64-v8a/libIDCardengine.so
Binary files differ
app/src/main/jniLibs/arm64-v8a/libimageengine.so
Binary files differ
app/src/main/jniLibs/armeabi-v7a/libIDCardengine.so
Binary files differ
app/src/main/jniLibs/armeabi-v7a/libimageengine.so
Binary files differ
app/src/main/jniLibs/armeabi/libIDCardengine.so
Binary files differ
app/src/main/jniLibs/armeabi/libimageengine.so
Binary files differ
app/src/main/res/layout/activity_new_card.xml
@@ -101,7 +101,7 @@
                style="@style/newCardLL"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="扫描后请核对身份信息无误"
                android:text="请核对身份信息无误"
                android:textColor="#FF4500"
                android:visibility="gone" />