From 5f12988a77d078a5e5155c9a301e45bfd288d7e5 Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期五, 11 八月 2017 16:02:50 +0800 Subject: [PATCH] --- VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java | 8 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MyBitmapUtils.java | 51 +++ VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java | 110 +++++++ VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegInputStream.java | 82 +++++ VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/LocalCacheUtils.java | 71 ++++ VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/DeviceFragment.java | 31 + VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/PhoneCallMng.java | 27 + VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MD5Encoder.java | 19 + VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/SurveillanceQueryItemUtil.java | 2 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/widget/checkin/CheckInRightIntervieweeCell.java | 4 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/InternetAccessThread.java | 69 +++- VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegView.java | 210 ++++++++++++++ VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/ToastUtil.java | 18 + VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/NetCacheUtils.java | 131 ++++++++ VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MemoryCacheUtils.java | 57 +++ 16 files changed, 854 insertions(+), 38 deletions(-) diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/DeviceFragment.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/DeviceFragment.java index 4ce84c5..ef53c46 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/DeviceFragment.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/DeviceFragment.java @@ -6,6 +6,7 @@ import android.view.View; import android.widget.EditText; import android.widget.FrameLayout; +import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.Toast; @@ -102,6 +103,11 @@ private EditText fragment_device_right_device_info_device_address; @ViewInject(R.id.fragment_device_right_device_info_school_name) private EditText fragment_device_right_device_info_school_name; + @ViewInject(R.id.fragment_device_left_parent) + private LinearLayout fragment_device_left_parent; + @ViewInject(R.id.fragment_device_right_parent) + private LinearLayout fragment_device_right_parent; + private View wifiView; private View lanView; @@ -111,6 +117,7 @@ private DeviceQueryItem camera1; private DeviceQueryItem camera2; + private Device androidDevice; public DeviceQueryItem getCamera2() { return camera2; @@ -144,8 +151,23 @@ ViewUtils.inject(this, camera2View); fragment_device_left_wifi_check_box.setChecked(true); loadSharedPreferenceValues(); - setupUI(getLeftView()); - setupUI(getRightView()); + setupUI(fragment_device_left_parent); + setupUI(fragment_device_right_parent); + setupUI(wifiView); + setupUI(lanView); + setupUI(schoolView); + setupUI(camera1View); + setupUI(camera2View); + } + + @OnClick(R.id.fragment_device_left_parent) + public void fragment_device_left_parent_click(View view) { + System.out.println("aa"); + } + + @OnClick(R.id.fragment_device_right_parent) + public void fragment_device_right_parent_click(View view) { + System.out.println("aa"); } private void loadSharedPreferenceValues() { @@ -367,7 +389,10 @@ } public void setAndroidDevice(Device androidDevice) { - + this.androidDevice = androidDevice; + fragment_device_right_device_info_school_name.setText(androidDevice.getSchoolName()); + fragment_device_right_device_info_sn.setText(androidDevice.getSn()); + fragment_device_right_device_info_device_address.setText(androidDevice.getInstallAddress()); } public void setCamera1(DeviceQueryItem camera1) { diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java index 01d36d3..49b6366 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java @@ -1,7 +1,10 @@ package cn.com.basic.face.fragment; -import android.app.AlarmManager; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.net.Uri; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Bundle; @@ -17,12 +20,17 @@ import com.bsk.zhangbo.demoforbsk.R; +import cn.com.basic.face.base.BaseApplication; import cn.com.basic.face.base.BaseFragment; import cn.com.basic.face.base.MainActivity; import cn.com.basic.face.discern.common.CommonVariables; -import cn.com.basic.face.service.DeviceMng; +import cn.com.basic.face.discern.query.item.SurveillanceQueryItem; import cn.com.basic.face.thread.StartCameraThread; +import cn.com.basic.face.util.FileUtil; +import cn.com.basic.face.util.MjpegInputStream; +import cn.com.basic.face.util.MjpegView; +import cn.com.basic.face.util.NativeImg; import cn.com.basic.face.util.RtspFaceNative; import cn.com.basic.face.service.SurveillanceMng; @@ -32,8 +40,9 @@ import com.lidroid.xutils.view.annotation.ViewInject; import com.lidroid.xutils.view.annotation.event.OnClick; +import com.luxand.FSDK; -import java.io.DataOutputStream; +import java.io.File; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; @@ -67,6 +76,8 @@ private RelativeLayout fragment_supervisory_enter_camera_relative_layout; @ViewInject(R.id.fragment_surveillance_bottom_linear_layout) private LinearLayout fragment_surveillance_bottom_linear_layout; + @ViewInject(R.id.myVideoView) + private MjpegView myVideoView; StartCameraThread startEnterCameraThread = null; StartCameraThread startExitCameraThread = null; @@ -187,6 +198,99 @@ fragment_supervisory_enter_camera_relative_layout.addView(MainActivity.getInstance().mPreview); fragment_supervisory_enter_camera_relative_layout.addView(MainActivity.getInstance().mDraw); } + Uri vidUri = Uri.parse("http://192.168.1.13:8080/video"); + //myVideoView.setVideoURI(vidUri); + //myVideoView.setVideoPath("http://192.168.1.13:8080/video"); + //myVideoView.start(); + if (1!=1) { + new Thread() { + @Override + public void run() { + FSDK.HCamera cameraHandle = new FSDK.HCamera(); + boolean opened = false; + int res = FSDK.ActivateLibrary(""); + if (res == FSDK.FSDKE_OK) { + FSDK.Initialize(); + + FSDK.FSDK_VIDEOCOMPRESSIONTYPE type = new FSDK.FSDK_VIDEOCOMPRESSIONTYPE(); + type.type=FSDK.FSDK_VIDEOCOMPRESSIONTYPE.FSDK_MJPEG; + FSDK.OpenIPVideoCamera(type,"http://192.168.1.13:8080/video", + "username","password",500, cameraHandle); + opened = true; + } + int tracId = 0; + while(true) { + try { + if (opened) { + FSDK.HImage imageHandle = new FSDK.HImage(); + int res1 = FSDK.GrabFrame(cameraHandle, imageHandle); + if (res1 == FSDK.FSDKE_OK) {// grab the current frame from the camera + FSDK.TFaces FacePositions = new FSDK.TFaces(); + int res3 = FSDK.DetectMultipleFaces(imageHandle, FacePositions); + if(res3 == FSDK.FSDKE_OK) { + if (FacePositions.faces != null) { + for (FSDK.TFacePosition fp : FacePositions.faces ) { + System.out.println("2:"+fp.xc); + int x1 = (int)(fp.xc - 1.2*fp.w / 2); + int y1 = (int)(fp.yc - 1.4*fp.w / 2); + int x2 = (int)(fp.xc + 1.2*fp.w / 2); + int y2 = (int)(fp.yc + 1.4*fp.w / 2); + FSDK.HImage img2 = new FSDK.HImage(); + FSDK.CreateEmptyImage(img2); + FSDK.CopyRect(imageHandle, x1, y1, x2, y2, img2); + FSDK.SetJpegCompressionQuality(100); + String fileName = MainActivity.getInstance().getFilesDir()+"/"+System.currentTimeMillis()+".jpg"; + int res4 = FSDK.SaveImageToFile(img2, fileName); + if (res4 == FSDK.FSDKE_OK) { + System.out.println(fileName); + } + List bitmapList = new ArrayList(); + for (int i = 0; i < 1; i++) { + NativeImg nativeImg = new NativeImg(); + nativeImg.image = FileUtil.readFile(new File(fileName)); + nativeImg.size = nativeImg.image.length; + SurveillanceQueryItem surveillanceQueryItem = new SurveillanceQueryItem(); + surveillanceQueryItem.setNativeImg(nativeImg); + nativeImg.st_track_id = ++tracId; + surveillanceQueryItem.setStTrackId(nativeImg.st_track_id); + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inMutable = true; + Bitmap bmp = BitmapFactory.decodeByteArray(nativeImg.image, 0, nativeImg.image.length, options); + Canvas canvas1 = new Canvas(bmp); + + surveillanceQueryItem.setBitmap(bmp); + surveillanceQueryItem.setWidth("100"); + surveillanceQueryItem.setHeight("100"); + surveillanceQueryItem.setRegisterOrCheckIn(CommonVariables.Surveillance.OFFLINE_SURVEILLANCE_ITEM_TYPE); + surveillanceQueryItem.setCreateTime(new Date()); + bitmapList.add(surveillanceQueryItem); + + if (BaseApplication.getInstance().networkAvailable()) { + SurveillanceMng.getInstance().addBitmap(bitmapList, nativeImg.image, 0, CommonVariables.Camera.IN+"", nativeImg.image); + } else { + SurveillanceMng.getInstance().addOfflineBitmap(bitmapList, nativeImg.image, CommonVariables.Camera.IN+""); + } + } + + } + } + } + + } + } + Thread.sleep(5); + } catch (Exception e) { + e.printStackTrace(); + } + } + /*myVideoView.setSource(MjpegInputStream.read("http://192.168.1.13:8080/video")); + myVideoView.setDisplayMode(MjpegView.SIZE_BEST_FIT); + myVideoView.showFps(false); + */ + } + }.start(); + } + //fragment_supervisory_enter_camera.setVisibility(View.GONE); fragment_supervisory_enter_camera.getHolder().addCallback(new SurfaceHolder.Callback() { public void surfaceCreated(SurfaceHolder holder) { if (CommonVariables.EMULATOR) { diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java index bc5dc95..353dec7 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java @@ -2,7 +2,12 @@ import android.content.Context; import android.content.SharedPreferences; +import android.view.View; +import android.view.inputmethod.InputMethodManager; import android.widget.Toast; + +import com.bsk.zhangbo.demoforbsk.R; +import com.lidroid.xutils.view.annotation.event.OnClick; import cn.com.basic.face.base.BaseApplication; import cn.com.basic.face.base.MainActivity; @@ -30,6 +35,7 @@ import cn.com.basic.face.util.SharedPreferencesUtils; import cn.com.basic.face.service.sync.SyncUpThread; import cn.com.basic.face.util.SqliteSqlUtil; +import cn.com.basic.face.util.ToastUtil; public class DeviceMng { public static DeviceMng instance = new DeviceMng(); @@ -172,7 +178,7 @@ } } } else { - Toast.makeText(BaseApplication.getInstance(), "鏁版嵁搴撲腑鎵句笉鍒拌璁惧", Toast.LENGTH_SHORT).show(); + ToastUtil.show("鏁版嵁搴撲腑鎵句笉鍒拌璁惧"); } } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/InternetAccessThread.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/InternetAccessThread.java index 84e1c79..afd902b 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/InternetAccessThread.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/InternetAccessThread.java @@ -1,8 +1,10 @@ package cn.com.basic.face.service; +import android.app.ActivityManager; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.text.format.Formatter; import java.io.BufferedInputStream; import java.io.BufferedReader; @@ -10,6 +12,7 @@ import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; +import java.util.List; import cn.com.basic.face.base.BaseApplication; import cn.com.basic.face.base.MainActivity; @@ -28,6 +31,25 @@ } else { MainActivity.getInstance().setInternetAccessible(CommonVariables.InternetAccess.INTERNET_NOT_ACCESSIBLE); } + + +// ActivityManager activityManager = (ActivityManager)MainActivity.getInstance().getSystemService(Context.ACTIVITY_SERVICE); +// List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = activityManager.getRunningAppProcesses(); +// int size = runningAppProcessInfos.size(); +// +// ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); +// +// activityManager.getMemoryInfo(memoryInfo); +// +// long availMem = memoryInfo.availMem; +// +// long totalMem = memoryInfo.totalMem; +// +// System.out.println("availMem="+Formatter.formatFileSize(MainActivity.getInstance(), availMem)+",totalMem="+ +// Formatter.formatFileSize(MainActivity.getInstance(), totalMem)); + + + } catch (Exception e) { e.printStackTrace(); } @@ -83,29 +105,30 @@ } catch (Exception e) { return false; } - StringBuilder cPlusPlusServerResponse = new StringBuilder(); - try { - URL url = new URL("http://60.205.222.4:8080"); - URLConnection urlCon = url.openConnection(); - urlCon.setConnectTimeout(1500); - InputStream is = urlCon.getInputStream(); - BufferedInputStream bis = new BufferedInputStream(is); - - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(bis)); - - String line; - while ((line = bufferedReader.readLine()) != null) { - cPlusPlusServerResponse.append(line).append('\n'); - } - bufferedReader.close(); - bis.close(); - is.close(); - } catch (Exception e) { - return false; - } - if (javaServerResponse.toString().indexOf("Hello World!") > -1 && - cPlusPlusServerResponse.indexOf("ip") > -1 - ) { +// StringBuilder cPlusPlusServerResponse = new StringBuilder(); +// try { +// URL url = new URL("http://60.205.222.4:8080"); +// URLConnection urlCon = url.openConnection(); +// urlCon.setConnectTimeout(1500); +// InputStream is = urlCon.getInputStream(); +// BufferedInputStream bis = new BufferedInputStream(is); +// +// BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(bis)); +// +// String line; +// while ((line = bufferedReader.readLine()) != null) { +// cPlusPlusServerResponse.append(line).append('\n'); +// } +// bufferedReader.close(); +// bis.close(); +// is.close(); +// } catch (Exception e) { +// return false; +// } +// if (cPlusPlusServerResponse.indexOf("ip") < 0) { +// return false; +// } + if (javaServerResponse.toString().indexOf("Hello World!") > -1) { return true; } else { return false; diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/PhoneCallMng.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/PhoneCallMng.java index 4c1f763..1d63e26 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/PhoneCallMng.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/PhoneCallMng.java @@ -26,7 +26,9 @@ import cn.com.basic.face.service.sqlite.PhoneCallDao; import cn.com.basic.face.util.AppApi; import cn.com.basic.face.util.CharacterParser; +import cn.com.basic.face.util.RtspFaceNative; import cn.com.basic.face.util.SqliteSqlUtil; +import cn.com.basic.face.util.ToastUtil; public class PhoneCallMng extends BaseMng { @@ -137,17 +139,33 @@ }); } - public void addPhoneCall(CheckInQueryItem visitor, CheckInQueryItem interviewee) { + public void addPhoneCall(CheckInQueryItem visitor, CheckInQueryItem interviewee, boolean isMobilePhone) { if (visitor == null) { - Toast.makeText(MainActivity.getInstance(), "璇峰厛閫夋嫨鏉ヨ浜�", Toast.LENGTH_SHORT).show(); + ToastUtil.show("璇峰厛閫夋嫨鏉ヨ浜�"); return; } if (interviewee == null) { - Toast.makeText(MainActivity.getInstance(), "璇峰厛閫夋嫨琚浜�", Toast.LENGTH_SHORT).show(); + ToastUtil.show("璇峰厛閫夋嫨琚浜�"); return; } + if (isMobilePhone) { + String mobilePhone = interviewee.getMobilePhone(); + if (mobilePhone == null || mobilePhone.trim().length() != 11) { + ToastUtil.show("鎵嬫満鍙风爜涓嶆纭�"); + return; + } + RtspFaceNative.teleCall(mobilePhone); + } else { + String tel = interviewee.getTel(); + if (tel == null || tel.trim().length() == 0) { + ToastUtil.show("搴ф満涓嶆纭�"); + return; + } + RtspFaceNative.teleCall(tel); + } + if (BaseApplication.getInstance().networkAvailable()) { - Toast.makeText(MainActivity.getInstance(), "宸叉坊鍔犲埌鍛煎彨璁板綍", Toast.LENGTH_SHORT).show(); + Toast.makeText(MainActivity.getInstance(), "", Toast.LENGTH_SHORT).show(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); RequestParams params = new RequestParams(AppApi.BASE_URL +AppApi.PHONE_CALL_ADD); params.addBodyParameter(PhoneCall.FieldNames.date, sdf.format(new Date())); @@ -163,6 +181,7 @@ } else { PhoneCallDao.getInstance().addPhoneCall(visitor, interviewee); } + ToastUtil.show("宸叉坊鍔犲埌鍛煎彨璁板綍"); } } diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java index b05aa76..7e6d480 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java @@ -8,7 +8,7 @@ //public final static String BASE_URL = "http://192.168.1.51/face/"; // public final static String BASE_URL = "http://192.168.1.51:8333/face/"; //public final static String BASE_URL = "http://192.168.1.101:8080/face/"; - public final static String BASE_URL = "http://192.168.1.36:8080/face/"; + public final static String BASE_URL = "http://192.168.1.92:8080/face/"; // public final static String BASE_URL = "http://192.168.1.51:8333/face/"; // public final static String BASE_URL = "http://192.168.1.53:8082/face/"; diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MD5Encoder.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MD5Encoder.java new file mode 100644 index 0000000..d277e14 --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MD5Encoder.java @@ -0,0 +1,19 @@ +package cn.com.basic.face.util; + +import java.security.MessageDigest; + +public class MD5Encoder { + + public static String encode(String string) throws Exception { + byte[] hash = MessageDigest.getInstance("MD5").digest( + string.getBytes("UTF-8")); + StringBuilder hex = new StringBuilder(hash.length * 2); + for (byte b : hash) { + if ((b & 0xFF) < 0x10) { + hex.append("0"); + } + hex.append(Integer.toHexString(b & 0xFF)); + } + return hex.toString(); + } +} diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegInputStream.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegInputStream.java new file mode 100644 index 0000000..58a212e --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegInputStream.java @@ -0,0 +1,82 @@ +package cn.com.basic.face.util; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.util.Properties; + +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +public class MjpegInputStream extends DataInputStream { + private final byte[] SOI_MARKER = { (byte) 0xFF, (byte) 0xD8 }; + private final byte[] EOF_MARKER = { (byte) 0xFF, (byte) 0xD9 }; + private final String CONTENT_LENGTH = "Content-Length"; + private final static int HEADER_MAX_LENGTH = 100; + private final static int FRAME_MAX_LENGTH = 40000 + HEADER_MAX_LENGTH; + private int mContentLength = -1; + + public static MjpegInputStream read(String url) { + HttpResponse res; + DefaultHttpClient httpclient = new DefaultHttpClient(); + try { + res = httpclient.execute(new HttpGet(URI.create(url))); + return new MjpegInputStream(res.getEntity().getContent()); + } catch (ClientProtocolException e) { + } catch (IOException e) {} + return null; + } + + public MjpegInputStream(InputStream in) { super(new BufferedInputStream(in, FRAME_MAX_LENGTH)); } + + private int getEndOfSeqeunce(DataInputStream in, byte[] sequence) throws IOException { + int seqIndex = 0; + byte c; + for(int i=0; i < FRAME_MAX_LENGTH; i++) { + c = (byte) in.readUnsignedByte(); + if(c == sequence[seqIndex]) { + seqIndex++; + if(seqIndex == sequence.length) return i + 1; + } else seqIndex = 0; + } + return -1; + } + + private int getStartOfSequence(DataInputStream in, byte[] sequence) throws IOException { + int end = getEndOfSeqeunce(in, sequence); + return (end < 0) ? (-1) : (end - sequence.length); + } + + private int parseContentLength(byte[] headerBytes) throws IOException, NumberFormatException { + ByteArrayInputStream headerIn = new ByteArrayInputStream(headerBytes); + Properties props = new Properties(); + props.load(headerIn); + return Integer.parseInt(props.getProperty(CONTENT_LENGTH)); + } + + public Bitmap readMjpegFrame() throws IOException { + mark(FRAME_MAX_LENGTH); + int headerLen = getStartOfSequence(this, SOI_MARKER); + reset(); + byte[] header = new byte[headerLen]; + readFully(header); + try { + mContentLength = parseContentLength(header); + } catch (NumberFormatException nfe) { + mContentLength = getEndOfSeqeunce(this, EOF_MARKER); + } + reset(); + byte[] frameData = new byte[mContentLength]; + skipBytes(headerLen); + readFully(frameData); + return BitmapFactory.decodeStream(new ByteArrayInputStream(frameData)); + } +} \ No newline at end of file diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegView.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegView.java new file mode 100644 index 0000000..650617c --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegView.java @@ -0,0 +1,210 @@ +package cn.com.basic.face.util; + +import java.io.IOException; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.AttributeSet; +import android.view.SurfaceHolder; +import android.view.SurfaceView; + +public class MjpegView extends SurfaceView implements SurfaceHolder.Callback { + public final static int POSITION_UPPER_LEFT = 9; + public final static int POSITION_UPPER_RIGHT = 3; + public final static int POSITION_LOWER_LEFT = 12; + public final static int POSITION_LOWER_RIGHT = 6; + + public final static int SIZE_STANDARD = 1; + public final static int SIZE_BEST_FIT = 4; + public final static int SIZE_FULLSCREEN = 8; + + private MjpegViewThread thread; + private MjpegInputStream mIn = null; + private boolean showFps = false; + private boolean mRun = false; + private boolean surfaceDone = false; + private Paint overlayPaint; + private int overlayTextColor; + private int overlayBackgroundColor; + private int ovlPos; + private int dispWidth; + private int dispHeight; + private int displayMode; + + public class MjpegViewThread extends Thread { + private SurfaceHolder mSurfaceHolder; + private int frameCounter = 0; + private long start; + private Bitmap ovl; + + public MjpegViewThread(SurfaceHolder surfaceHolder, Context context) { mSurfaceHolder = surfaceHolder; } + + private Rect destRect(int bmw, int bmh) { + int tempx; + int tempy; + if (displayMode == MjpegView.SIZE_STANDARD) { + tempx = (dispWidth / 2) - (bmw / 2); + tempy = (dispHeight / 2) - (bmh / 2); + return new Rect(tempx, tempy, bmw + tempx, bmh + tempy); + } + if (displayMode == MjpegView.SIZE_BEST_FIT) { + float bmasp = (float) bmw / (float) bmh; + bmw = dispWidth; + bmh = (int) (dispWidth / bmasp); + if (bmh > dispHeight) { + bmh = dispHeight; + bmw = (int) (dispHeight * bmasp); + } + tempx = (dispWidth / 2) - (bmw / 2); + tempy = (dispHeight / 2) - (bmh / 2); + return new Rect(tempx, tempy, bmw + tempx, bmh + tempy); + } + if (displayMode == MjpegView.SIZE_FULLSCREEN) return new Rect(0, 0, dispWidth, dispHeight); + return null; + } + + public void setSurfaceSize(int width, int height) { + synchronized(mSurfaceHolder) { + dispWidth = width; + dispHeight = height; + } + } + + private Bitmap makeFpsOverlay(Paint p, String text) { + Rect b = new Rect(); + p.getTextBounds(text, 0, text.length(), b); + int bwidth = b.width()+2; + int bheight = b.height()+2; + Bitmap bm = Bitmap.createBitmap(bwidth, bheight, Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(bm); + p.setColor(overlayBackgroundColor); + c.drawRect(0, 0, bwidth, bheight, p); + p.setColor(overlayTextColor); + c.drawText(text, -b.left+1, (bheight/2)-((p.ascent()+p.descent())/2)+1, p); + return bm; + } + + public void run() { + start = System.currentTimeMillis(); + PorterDuffXfermode mode = new PorterDuffXfermode(PorterDuff.Mode.DST_OVER); + Bitmap bm; + int width; + int height; + Rect destRect; + Canvas c = null; + Paint p = new Paint(); + String fps = ""; + while (mRun) { + if(surfaceDone) { + try { + c = mSurfaceHolder.lockCanvas(); + synchronized (mSurfaceHolder) { + try { + bm = mIn.readMjpegFrame(); + destRect = destRect(bm.getWidth(),bm.getHeight()); + c.drawColor(Color.BLACK); + c.drawBitmap(bm, null, destRect, p); + if(showFps) { + p.setXfermode(mode); + if(ovl != null) { + height = ((ovlPos & 1) == 1) ? destRect.top : destRect.bottom-ovl.getHeight(); + width = ((ovlPos & 8) == 8) ? destRect.left : destRect.right -ovl.getWidth(); + c.drawBitmap(ovl, width, height, null); + } + p.setXfermode(null); + frameCounter++; + if((System.currentTimeMillis() - start) >= 1000) { + fps = String.valueOf(frameCounter)+"fps"; + frameCounter = 0; + start = System.currentTimeMillis(); + ovl = makeFpsOverlay(overlayPaint, fps); + } + } + } catch (IOException e) {} + } + } finally { if (c != null) mSurfaceHolder.unlockCanvasAndPost(c); } + } + } + } + } + + private void init(Context context) { + SurfaceHolder holder = getHolder(); + holder.addCallback(this); + thread = new MjpegViewThread(holder, context); + setFocusable(true); + overlayPaint = new Paint(); + overlayPaint.setTextAlign(Paint.Align.LEFT); + overlayPaint.setTextSize(12); + overlayPaint.setTypeface(Typeface.DEFAULT); + overlayTextColor = Color.WHITE; + overlayBackgroundColor = Color.BLACK; + ovlPos = MjpegView.POSITION_LOWER_RIGHT; + displayMode = MjpegView.SIZE_STANDARD; + dispWidth = getWidth(); + dispHeight = getHeight(); + } + + public void startPlayback() { + if(mIn != null) { + mRun = true; + thread.start(); + } + } + + public void stopPlayback() { + mRun = false; + boolean retry = true; + while(retry) { + try { + thread.join(); + retry = false; + } catch (InterruptedException e) {} + } + } + + public MjpegView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } + public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) { thread.setSurfaceSize(w, h); } + + public void surfaceDestroyed(SurfaceHolder holder) { + surfaceDone = false; + stopPlayback(); + } + + public MjpegView(Context context) { + super(context); + init(context); + } + public void surfaceCreated(SurfaceHolder holder) { + surfaceDone = true; + } + public void showFps(boolean b) { + showFps = b; + } + public void setSource(MjpegInputStream source) { + mIn = source; + startPlayback(); + } + public void setOverlayPaint(Paint p) { + overlayPaint = p; + } + public void setOverlayTextColor(int c) { + overlayTextColor = c; + } + public void setOverlayBackgroundColor(int c) { + overlayBackgroundColor = c; + } + public void setOverlayPosition(int p) { + ovlPos = p; + } + public void setDisplayMode(int s) { + displayMode = s; + } +} \ No newline at end of file diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/SurveillanceQueryItemUtil.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/SurveillanceQueryItemUtil.java index 71c0940..32791e7 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/SurveillanceQueryItemUtil.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/SurveillanceQueryItemUtil.java @@ -44,7 +44,7 @@ } public void addItem(SurveillanceQueryItem returnItem, SurveillanceQueryItem requestItem, String cameraInOrOut) { - if (!CommonVariables.FACE_SERVER) { + if (!CommonVariables.FACE_SERVER && !CommonVariables.EMULATOR) { RtspFaceNative.setFaceLabel(Integer.parseInt(cameraInOrOut), requestItem.getStTrackId(), returnItem.getVisitorType()==null?"":returnItem.getVisitorType().substring(0, returnItem.getVisitorType().length() > 3 ? 3 : returnItem.getVisitorType().length() )); diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/ToastUtil.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/ToastUtil.java new file mode 100644 index 0000000..3fbd2b1 --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/ToastUtil.java @@ -0,0 +1,18 @@ +package cn.com.basic.face.util; + +import android.widget.Toast; + +import cn.com.basic.face.base.MainActivity; + +public class ToastUtil { + + public static void show(final String message) { + MainActivity.getInstance().runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.getInstance(), message, Toast.LENGTH_SHORT).show(); + } + }); + } + +} diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/LocalCacheUtils.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/LocalCacheUtils.java new file mode 100644 index 0000000..75d9159 --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/LocalCacheUtils.java @@ -0,0 +1,71 @@ +package cn.com.basic.face.util.bitmap; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import cn.com.basic.face.util.MD5Encoder; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.CompressFormat; +import android.graphics.BitmapFactory; +import android.os.Environment; + +/** + * 鏈湴缂撳瓨 + * + * @author Kevin + * + */ +public class LocalCacheUtils { + + public static final String CACHE_PATH = Environment + .getExternalStorageDirectory().getAbsolutePath() + "/zhbj_cache_52"; + + /** + * 浠庢湰鍦皊dcard璇诲浘鐗� + */ + public Bitmap getBitmapFromLocal(String url) { + try { + String fileName = MD5Encoder.encode(url); + File file = new File(CACHE_PATH, fileName); + + if (file.exists()) { + Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream( + file)); + return bitmap; + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 鍚憇dcard鍐欏浘鐗� + * + * @param url + * @param bitmap + */ + public void setBitmapToLocal(String url, Bitmap bitmap) { + try { + String fileName = MD5Encoder.encode(url); + + File file = new File(CACHE_PATH, fileName); + + File parentFile = file.getParentFile(); + if (!parentFile.exists()) {// 濡傛灉鏂囦欢澶逛笉瀛樺湪, 鍒涘缓鏂囦欢澶� + parentFile.mkdirs(); + } + + // 灏嗗浘鐗囦繚瀛樺湪鏈湴 + bitmap.compress(CompressFormat.JPEG, 100, + new FileOutputStream(file)); + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MemoryCacheUtils.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MemoryCacheUtils.java new file mode 100644 index 0000000..6ba9952 --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MemoryCacheUtils.java @@ -0,0 +1,57 @@ +package cn.com.basic.face.util.bitmap; + +import android.graphics.Bitmap; +import android.support.v4.util.LruCache; + +import java.lang.ref.SoftReference; + +/** + * 鍐呭瓨缂撳瓨 + * + * @author Kevin + * + */ +public class MemoryCacheUtils { + +// private HashMap<String, SoftReference<Bitmap>> mMemoryCache = new +// HashMap<String, SoftReference<Bitmap>>(); + private LruCache<String, Bitmap> mMemoryCache; + + public MemoryCacheUtils() { + long maxMemory = Runtime.getRuntime().maxMemory() / 8;// 妯℃嫙鍣ㄩ粯璁ゆ槸16M + mMemoryCache = new LruCache<String, Bitmap>((int) maxMemory) { + @Override + protected int sizeOf(String key, Bitmap value) { + int byteCount = value.getRowBytes() * value.getHeight();// 鑾峰彇鍥剧墖鍗犵敤鍐呭瓨澶у皬 + return byteCount; + } + }; + } + + /** + * 浠庡唴瀛樿 + * + * @param url + */ + public Bitmap getBitmapFromMemory(String url) { + // SoftReference<Bitmap> softReference = mMemoryCache.get(url); + // if (softReference != null) { + // Bitmap bitmap = softReference.get(); + // return bitmap; + // } + return mMemoryCache.get(url); + } + + /** + * 鍐欏唴瀛� + * + * @param url + * @param bitmap + */ + public void setBitmapToMemory(String url, Bitmap bitmap) { +// SoftReference<Bitmap> softReference = new +// SoftReference<Bitmap>(bitmap); +// mMemoryCache.put(url, softReference); + mMemoryCache.put(url, bitmap); + } +} diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MyBitmapUtils.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MyBitmapUtils.java new file mode 100644 index 0000000..f4aa926 --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MyBitmapUtils.java @@ -0,0 +1,51 @@ +package cn.com.basic.face.util.bitmap; + +import android.graphics.Bitmap; +import android.widget.ImageView; + +//import com.itheima.zhbj52.R; + +/** + * 鑷畾涔夊浘鐗囧姞杞藉伐鍏� + * + * @author Kevin + * + */ +public class MyBitmapUtils { + + NetCacheUtils mNetCacheUtils; + LocalCacheUtils mLocalCacheUtils; + MemoryCacheUtils mMemoryCacheUtils; + + public MyBitmapUtils() { + mMemoryCacheUtils = new MemoryCacheUtils(); + mLocalCacheUtils = new LocalCacheUtils(); + mNetCacheUtils = new NetCacheUtils(mLocalCacheUtils, mMemoryCacheUtils); + } + + public void display(ImageView ivPic, String url) { + //ivPic.setImageResource(R.drawable.news_pic_default);// 璁剧疆榛樿鍔犺浇鍥剧墖 + + Bitmap bitmap = null; + // 浠庡唴瀛樿 + bitmap = mMemoryCacheUtils.getBitmapFromMemory(url); + if (bitmap != null) { + ivPic.setImageBitmap(bitmap); + System.out.println("浠庡唴瀛樿鍙栧浘鐗囧暒..."); + return; + } + + // 浠庢湰鍦拌 + bitmap = mLocalCacheUtils.getBitmapFromLocal(url); + if (bitmap != null) { + ivPic.setImageBitmap(bitmap); + System.out.println("浠庢湰鍦拌鍙栧浘鐗囧暒..."); + mMemoryCacheUtils.setBitmapToMemory(url, bitmap);// 灏嗗浘鐗囦繚瀛樺湪鍐呭瓨 + return; + } + + // 浠庣綉缁滆 + mNetCacheUtils.getBitmapFromNet(ivPic, url); + } + +} diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/NetCacheUtils.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/NetCacheUtils.java new file mode 100644 index 0000000..f3299bf --- /dev/null +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/NetCacheUtils.java @@ -0,0 +1,131 @@ +package cn.com.basic.face.util.bitmap; + +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.AsyncTask; +import android.widget.ImageView; + +/** + * 缃戠粶缂撳瓨 + * + * @author Kevin + * + */ +public class NetCacheUtils { + + private LocalCacheUtils mLocalCacheUtils; + private MemoryCacheUtils mMemoryCacheUtils; + + public NetCacheUtils(LocalCacheUtils localCacheUtils, + MemoryCacheUtils memoryCacheUtils) { + mLocalCacheUtils = localCacheUtils; + mMemoryCacheUtils = memoryCacheUtils; + } + + /** + * 浠庣綉缁滀笅杞藉浘鐗� + * + * @param ivPic + * @param url + */ + public void getBitmapFromNet(ImageView ivPic, String url) { + new BitmapTask().execute(ivPic, url);// 鍚姩AsyncTask, + // 鍙傛暟浼氬湪doInbackground涓幏鍙� + } + + /** + * Handler鍜岀嚎绋嬫睜鐨勫皝瑁� + * + * 绗竴涓硾鍨�: 鍙傛暟绫诲瀷 绗簩涓硾鍨�: 鏇存柊杩涘害鐨勬硾鍨�, 绗笁涓硾鍨嬫槸onPostExecute鐨勮繑鍥炵粨鏋� + * + * @author Kevin + * + */ + class BitmapTask extends AsyncTask<Object, Void, Bitmap> { + + private ImageView ivPic; + private String url; + + /** + * 鍚庡彴鑰楁椂鏂规硶鍦ㄦ鎵ц, 瀛愮嚎绋� + */ + @Override + protected Bitmap doInBackground(Object... params) { + ivPic = (ImageView) params[0]; + url = (String) params[1]; + + ivPic.setTag(url);// 灏唘rl鍜宨mageview缁戝畾 + + return downloadBitmap(url); + } + + /** + * 鏇存柊杩涘害, 涓荤嚎绋� + */ + @Override + protected void onProgressUpdate(Void... values) { + super.onProgressUpdate(values); + } + + /** + * 鑰楁椂鏂规硶缁撴潫鍚�,鎵ц璇ユ柟娉�, 涓荤嚎绋� + */ + @Override + protected void onPostExecute(Bitmap result) { + if (result != null) { + String bindUrl = (String) ivPic.getTag(); + + if (url.equals(bindUrl)) {// 纭繚鍥剧墖璁惧畾缁欎簡姝g‘鐨刬mageview + ivPic.setImageBitmap(result); + mLocalCacheUtils.setBitmapToLocal(url, result);// 灏嗗浘鐗囦繚瀛樺湪鏈湴 + mMemoryCacheUtils.setBitmapToMemory(url, result);// 灏嗗浘鐗囦繚瀛樺湪鍐呭瓨 + System.out.println("浠庣綉缁滅紦瀛樿鍙栧浘鐗囧暒..."); + } + } + } + } + + /** + * 涓嬭浇鍥剧墖 + * + * @param url + * @return + */ + private Bitmap downloadBitmap(String url) { + + HttpURLConnection conn = null; + try { + conn = (HttpURLConnection) new URL(url).openConnection(); + + conn.setConnectTimeout(5000); + conn.setReadTimeout(5000); + conn.setRequestMethod("GET"); + conn.connect(); + + int responseCode = conn.getResponseCode(); + if (responseCode == 200) { + InputStream inputStream = conn.getInputStream(); + + //鍥剧墖鍘嬬缉澶勭悊 + BitmapFactory.Options option = new BitmapFactory.Options(); + option.inSampleSize = 2;//瀹介珮閮藉帇缂╀负鍘熸潵鐨勪簩鍒嗕箣涓�, 姝ゅ弬鏁伴渶瑕佹牴鎹浘鐗囪灞曠ず鐨勫ぇ灏忔潵纭畾 + option.inPreferredConfig = Bitmap.Config.RGB_565;//璁剧疆鍥剧墖鏍煎紡 + + Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, option); + return bitmap; + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + conn.disconnect(); + } + + return null; + } + +} diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/widget/checkin/CheckInRightIntervieweeCell.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/widget/checkin/CheckInRightIntervieweeCell.java index ac58a71..ff82c75 100644 --- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/widget/checkin/CheckInRightIntervieweeCell.java +++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/widget/checkin/CheckInRightIntervieweeCell.java @@ -90,12 +90,12 @@ @OnClick(R.id.fragment_check_in_right_interviewee_cell_call_tel) public void fragment_check_in_right_interviewee_cell_call_tel_click(View view) { - PhoneCallMng.getInstance().addPhoneCall(CheckInFragment.getInstance().getFragment_check_in_right_visitor_cell().getVisitor(), item); + PhoneCallMng.getInstance().addPhoneCall(CheckInFragment.getInstance().getFragment_check_in_right_visitor_cell().getVisitor(), item, false); } @OnClick(R.id.fragment_check_in_right_interviewee_cell_call_mobile) public void fragment_check_in_right_interviewee_cell_call_mobile_click(View view) { - PhoneCallMng.getInstance().addPhoneCall(CheckInFragment.getInstance().getFragment_check_in_right_visitor_cell().getVisitor(), item); + PhoneCallMng.getInstance().addPhoneCall(CheckInFragment.getInstance().getFragment_check_in_right_visitor_cell().getVisitor(), item, true); } public void resetForm() { -- Gitblit v1.8.0