package com.zzx.factorytest; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.os.PowerManager; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.hisign.AS60xSDK.AS60xIO; import com.hisign.AS60xSDK.SDKUtilty; import com.zzx.factorytest.manager.OTGManager; import com.zzx.factorytest.view.JudgeView; import java.io.DataOutputStream; import java.io.File; import java.util.HashMap; import java.util.Map; public class AS60xFingerprintActivity extends TestItemBaseActivity implements View.OnClickListener { public static final String TAG = "AS60xFingerprintActivity"; private Button mOpenDevice; private Button mCapFingers; /*指纹核验时附加参考信息*/ private int[] fpFlags = new int[2]; /*证件采集是否完毕*/ private boolean isCardComplated = false; /*设备初始化是否成功*/ private boolean mSensorInited = false; /*打开设备传入PID、VID*/ private UsbDevice mUsbDevice = null; private int VendorId = 0x2109;//(0x261A:0x000D) private int ProductId = 0x7638; private UsbManager mUsbManager; /*获取USB权限*/ private PendingIntent mPermissionIntent; private static final String ACTION_USB_PERMISSION = "Request_USB_PERMISSION"; public final File execpath = new File("/data/data/com.zzx.factorytest.as60x/lib"); /*音频资源*/ private SoundPool pool; private Map<String, Integer> poolMap; private ImageView mFingerImg; private PowerManager mPowerManager; private byte[] mData; private int[] mLength; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.as60x_fingerprint_activity); initView(); addListener(); OTGManager.getInstance(this).startOTG(); /*注册监听USB*/ registerUSBpermisson(this.getApplicationContext()); } @Override protected void onStart() { super.onStart(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); if (pool != null) { pool.release(); pool = null; } if (null != mUsbDevice) { AS60xIO.FCV_CloseDevice(mUsbDevice);// 关闭设备,释放资源 } OTGManager.getInstance(this).stopOTG(); } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); } private void initView() { mOpenDevice = (Button) findViewById(R.id.Opendevice); mCapFingers = (Button) findViewById(R.id.CapFingers); mFingerImg = (ImageView) findViewById(R.id.fingerImg); ((JudgeView) findViewById(R.id.JudgeView)).setOnResultSelectedListener(this); mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); poolMap = new HashMap<String, Integer>(); pool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); poolMap.put("didi", pool.load(this, R.raw.didi, 1)); mData = new byte[92160]; mLength = new int[1]; } private void addListener() { mOpenDevice.setOnClickListener(this); mCapFingers.setOnClickListener(this); } private Bitmap getBitmap(String filePath) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); newOpts.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, newOpts); int w = newOpts.outWidth; int h = newOpts.outHeight; float hh = 300f; float ww = 200f; int be = 1; if (w > h && w > ww) { be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) { be = (int) (newOpts.outHeight / hh); } if (be <= 0) be = 1; newOpts.inSampleSize = be; newOpts.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile(filePath, newOpts); return bitmap; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.Opendevice: mSensorInited = InitUsbDevice(VendorId, ProductId); if (!mSensorInited) { SDKUtilty.showToast(AS60xFingerprintActivity.this, "设备打开失败!", Toast.LENGTH_SHORT); } break; case R.id.CapFingers: int nRet = -1; long startTime, endTime; if (mSensorInited) { startTime = System.currentTimeMillis(); while (true) { nRet = AS60xIO.HS_GetImage(mUsbDevice, 0); if (0 == nRet) { if (pool != null) { pool.play(poolMap.get("didi"), 1.0f, 1.0f, 0, 0, 1.0f); } if (AS60xIO.HS_UpImage(mUsbDevice, 0, mData, mLength) == 0) { SDKUtilty.showToast(AS60xFingerprintActivity.this, "采集成功!", Toast.LENGTH_SHORT); File file = new File(getExternalFilesDir("fingerprint"), "fingerprint.bmp"); SDKUtilty.SaveRawToBmp(mData, file.getAbsolutePath(), false); Bitmap bitmap = getBitmap(file.getAbsolutePath()); if (bitmap != null) mFingerImg.setImageBitmap(bitmap); } break; } endTime = System.currentTimeMillis(); if (1500 <= (endTime - startTime)) { SDKUtilty.showToast(AS60xFingerprintActivity.this, "采集失败!", Toast.LENGTH_SHORT); break; } } } else { SDKUtilty.showToast(AS60xFingerprintActivity.this, "设备未打开,请打开设备!", Toast.LENGTH_SHORT); } break; } } public void registerUSBpermisson(Context context) { mUsbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);//拔出USB context.registerReceiver(mUsbReceiverPermission, filter); } /*设备初始化*/ private boolean InitUsbDevice(int vid, int pid) { /*1、原先的初始化方式,不传递输入、输出节点,SDK内部写死,仍然可用*/ /*{ String usbRoot = "chmod -R 777 /dev/bus/usb"; boolean isRoot = RootCommand(usbRoot);//此命令若想执行成功,需要机器Root mUsbDevice = AS60xIO.FCV_OpenDevice(this, vid, pid); }*/ //2、以下指定初始化方式及端点等设置 int initType = 0; boolean isSucceed = false; if (0 == initType)//Java { mUsbDevice = AS60xIO.FCV_OpenDeviceEx(this, vid, pid, -1, -1); mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); if (mUsbDevice != null && !mUsbManager.hasPermission(mUsbDevice))//Java方式:若无权限则,主动申请权限,等待用户回馈 { mUsbManager.requestPermission(mUsbDevice, mPermissionIntent); } } else {//Jni方式 String usbRoot = "chmod -R 777 /dev/bus/usb"; boolean isRoot = RootCommand(usbRoot);//此命令若想执行成功,需要机器Root if (isRoot) { mUsbDevice = AS60xIO.FCV_OpenDeviceEx(this, vid, pid, 0x02, 0x81);//as606:1 as602:2 } else { //Android设备无Root权限,无法初始化 Toast.makeText(AS60xFingerprintActivity.this, "设备未Root权限获取失败!", Toast.LENGTH_SHORT).show(); } } /*验证是否初始化成功*/ int nRet = AS60xIO.HS_Verfiy(mUsbDevice); if (0 == nRet) { isSucceed = true; Toast.makeText(AS60xFingerprintActivity.this, "设备初始化完毕!", Toast.LENGTH_SHORT).show(); if (pool != null) { pool.play(poolMap.get("didi"), 1.0f, 1.0f, 0, 0, 1.0f); } } return isSucceed; } public boolean RootCommand(String command) { Process process = null; DataOutputStream os = null; try { process = Runtime.getRuntime().exec("su");//执行这一句,superuser.apk就会弹出授权对话框 os = new DataOutputStream(process.getOutputStream()); os.writeBytes("cd " + execpath + "\n"); os.writeBytes(command + "\n"); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) { Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage()); return false; } finally { try { if (os != null) { os.close(); } process.destroy(); } catch (Exception e) { } } Log.d("*** DEBUG ***", "Root SUC "); return true; } private final BroadcastReceiver mUsbReceiverPermission = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { SDKUtilty.showToast(AS60xFingerprintActivity.this, "申请USB通信权限!", Toast.LENGTH_SHORT); synchronized (this) { UsbDevice usbDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); //用户允许权限申请true if (usbDevice != null && intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { //用户同意 ; mSensorInited = true; } else//用户拒绝 { mSensorInited = false; Log.e(TAG, "permission denied for device!!!"); } } } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { mSensorInited = false; AS60xIO.FCV_CloseDevice(mUsbDevice);//关闭设备,释放资源 SDKUtilty.showToast(AS60xFingerprintActivity.this, "注意:USB采集设备已拔出!", Toast.LENGTH_SHORT); } } }; }