package com.basic.security.manager.impl.sqlite; import android.text.TextUtils; import com.basic.security.base.BaseApplication; import com.basic.security.manager.impl.cblite.BaseManager; import com.basic.security.utils.Constants; import com.basic.security.utils.FaceId; import com.basic.security.utils.FacePosition; import com.basic.security.utils.IpUtils; import com.couchbase.lite.Expression; import com.basic.security.model.ModelAdapter; import com.couchbase.lite.Ordering; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import static com.basic.security.base.BaseFragment.saveBlob; public class SlTemporaryPersonManager extends SlBaseManager { public static List findTemporaryPersonList() { return SlBaseManager.findList("select * from temporary_person"); } public static List getTemporaryPersonList(String ip) { List list = findList("select * from temporary_person where ip='" + ip + "' order by save_time desc "); // 如果临时人员头像路径为空,删除此临时人员 for (ModelAdapter tempPerson : list) { // if (null == tempPerson.getBlob("camera_image_path")) { // deleteTempPersonAndAttachment(tempPerson); // } if(null == tempPerson.sqliteModel.get("camera_image_path")){ deleteTempPersonAndAttachment(tempPerson); } } // 清理大于50个的临时人员 // if (list.size() > 50) { //// for (int i = 50; i < list.size(); i++) { //// FaceId.instance.removeFeatureFromDb(list.get(i).getId()); //// deleteTempPersonAndAttachment(list.get(i)); //// } //// return list.subList(0, 50); // FaceId.instance.removeFeatureFromDb(list.get(0).getId()); // deleteTempPersonAndAttachment(list.get(0)); // return list.subList(1,list.size()); // } return list; } public static void saveTemporaryPerson(FacePosition featureDocument) { if (featureDocument != null) { // 判断是否在库中已存在 String compareResultStr = FaceId.instance.compareFeatureInTempDb(featureDocument.featureData, 80); String personId = compareResultStr.split(",", -1)[0]; // System.out.println("======" + compareResultStr); if (TextUtils.isEmpty(personId) || findById("temporary_person", personId) == null) { // 如果不存在,保存 saveTempPerson(featureDocument); } else { // 如果存在,看是否存在与相同的设备中(根据ip判断) ModelAdapter personDocument = findById("temporary_person", personId); if (!SlDeviceManager.getDeviceIp().equals(personDocument.getString("ip"))) { // 不是在相同的ip地址中保存,保存 saveTempPerson(featureDocument); } else { // 是在相同的ip地址中保存,删除重新保存(暂时不删除,) // deleteTempPersonAndAttachment(personDocument); saveTempPerson(featureDocument); } } } } public static void deleteTempPersonAndAttachment(ModelAdapter modelAdapter) { try { File camera_image_pathFile = new File(modelAdapter.getString("camera_image_path")); if (camera_image_pathFile.exists()) { FileUtils.forceDelete(camera_image_pathFile); } File camera_image_featureFile = new File(modelAdapter.getString("camera_image_feature")); if (camera_image_featureFile.exists()) { FileUtils.forceDelete(camera_image_featureFile); } String id = modelAdapter.getString("id"); if (!TextUtils.isEmpty(id)) { FaceId.instance.removeFeatureFromTempDb(id); } } catch (Exception e) { e.printStackTrace(); } deletePhysically(modelAdapter); } private static void saveTempPerson(FacePosition featureDocument) { ModelAdapter modelAdapter = new ModelAdapter(); modelAdapter.setString("table", "temporary_person"); modelAdapter.setString("save_time", System.currentTimeMillis() + ""); modelAdapter.setString("ip", IpUtils.getIpAddress(BaseApplication.getApplication())); saveBlob(modelAdapter, "camera_image_path", featureDocument.faceJpgData()); saveBlob(modelAdapter, "camera_image_feature", featureDocument.featureData); FaceId.instance.addFeatureToTempDb(modelAdapter.getId(), featureDocument.featureData); if (Constants.useCouchbase) { save(modelAdapter); } else { // System.out.println(System.currentTimeMillis()+"saveTempPerson deleteMoreThan 前"); SlTemporaryPersonManager.deleteMoreThan(50); SlTemporaryPersonManager.save(modelAdapter); } } public static void deleteMoreThan(int rows) { // System.out.println(System.currentTimeMillis()+"deleteMoreThan 里面"); String sql = "select * from temporary_person order by save_time desc limit " + rows + ",1000000 "; List modelAdapterList = findList(sql); for (ModelAdapter modelAdapter : modelAdapterList) { deleteTempPersonAndAttachment(modelAdapter); } } }