package com.basic.project.idcardservice; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.IBinder; import android.os.SystemClock; import android.util.Log; import android.widget.Toast; import com.basic.project.idcardservice.idcard.AppConfig; import com.basic.project.idcardservice.idcard.FileStorageHelper; import com.basic.project.idcardservice.idcard.ReadUtil; import com.byid.android.IDCard; import org.apache.commons.io.FileUtils; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; public class ReadIDCardService extends Service { private volatile boolean inReader = false; public ReadUtil readUtil; long lastOnReceive = 0; private boolean running = false; BroadcastReceiver keepLifeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { lastOnReceive = System.currentTimeMillis(); // System.out.println("KeepLifeService.onReceive"); } }; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { close = false; FileStorageHelper.copyFilesFromRaw(this, R.raw.base, "base.dat", AppConfig.RootFile); FileStorageHelper.copyFilesFromRaw(this, R.raw.license, "license.lic", AppConfig.RootFile); readUtil = new ReadUtil(this, 1); // System.out.println("ReadIDCardService.onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { String type = intent.getStringExtra("type"); // System.out.println("ReadIDCardService.onStartCommand " + type); if (type == null) { type = "start_service"; } switch (type) { case "start_service": startReader(); break; case "stop_service": stopReader(); break; case "close_service": closeReader(); break; default: break; } if (!first) { first = true; Notification.Builder builder = new Notification.Builder(this.getApplicationContext()); Intent nfIntent = new Intent(this, MainActivity.class); builder.setContentIntent(PendingIntent.getActivity(this, 0, nfIntent, 0)) //设置通知栏大图标 .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.back)) //设置服务标题 .setContentTitle("服务") //设置状态栏小图标 .setSmallIcon(R.drawable.back) //设置服务内容 .setContentText("服务") //设置通知时间 .setWhen(System.currentTimeMillis()); Notification notification = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { notification = builder.build(); } //设置通知的声音 notification.defaults = Notification.DEFAULT_SOUND; startForeground(110, notification); } return super.onStartCommand(intent, flags, startId); } boolean first = false; private boolean close = false; private void closeReader() { if (1==1) { return; } synchronized (this) { if (!close) { close = true; } else { return; } } inReader = false; System.out.println("ReadIDCardService.closeReader"); readUtil.closeUSBDevice(); Intent i = new Intent(); i.putExtra("close", true); i.setPackage("com.basic.security"); i.setAction("read.id.card.data"); sendBroadcast(i); stopSelf(); } ExecutorService executorService = Executors.newCachedThreadPool(); public long readCardThreadLastRunning; private void startReader() { if (!inReader) { // System.out.println("ReadIDCardService.startReader"); // Log.e("project.id.card", "start"); if (System.currentTimeMillis() - readCardThreadLastRunning > 5*1000) { inReader = true; executorService.execute(new Runnable() { @Override public void run() { while (inReader) { try { readCardThreadLastRunning = System.currentTimeMillis(); if (readUtil.isPort()) { ThreadUtil.threadCreateObserver(); MemoryUtil.monitorMemory(); IDCard idCard = readUtil.readCard(); if (idCard != null) { String photoFileName = idCard.getIdPhoto(); FileUtils.copyFile(new File(photoFileName), new File("/sdcard/security_yuyin_attachment/"+idCard.getIdNum()+".bmp")); // System.out.println("ReadIDCardService.run photoFileName=" + photoFileName); // Bitmap headBitmap = BitmapFactory.decodeFile(photoFileName); IdCard c = new IdCard(); c.birthday = getTimeStamp(idCard.getIdDate(), "yyyyMMdd"); c.cardNumber = idCard.getIdNum(); c.gender = idCard.getIdSex(); c.name = idCard.getIdName(); // ByteArrayOutputStream stream = new ByteArrayOutputStream(); // headBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); // c.jpgData = stream.toByteArray(); Intent i = new Intent(); System.out.println("ReadIDCardService.run " + c.name); i.putExtra("birthday", c.birthday); i.putExtra("cardNumber", c.cardNumber); i.putExtra("gender", c.gender); i.putExtra("name", c.name); // i.putExtra("jpgData", c.jpgData); i.setPackage("com.basic.security"); i.setAction("read.id.card.data"); sendBroadcast(i); } } else { // System.out.println("ReadIDCardService.run " + "连接usb设备失败,开始关闭"); closeReader(); SystemClock.sleep(10*1000); } // SystemClock.sleep(2*1000); } catch (Exception e){ e.printStackTrace(); } } } }); } } else { // System.out.println("ReadIDCardService.startReader"); } } private void stopReader() { if (1==1) { return; } if (inReader) { System.out.println("ReadIDCardService.stopReader"); inReader = false; } else { System.out.println("ReadIDCardService.stopReader"); } } private static long getTimeStamp(String time, String format) { SimpleDateFormat dateFormat = new SimpleDateFormat(format); Date date = new Date(); try { date = dateFormat.parse(time); } catch (ParseException e) { e.printStackTrace(); } return date.getTime(); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(keepLifeReceiver); running = false; stopForeground(true); // System.out.println("KeepLifeService.onDestroy"); } }