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) { 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) { 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("数据库中找不到该设备"); } } 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; 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("已添加到呼叫记录"); } } 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/"; VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MD5Encoder.java
New file @@ -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(); } } VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegInputStream.java
New file @@ -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)); } } VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegView.java
New file @@ -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; } } 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() )); VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/ToastUtil.java
New file @@ -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(); } }); } } VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/LocalCacheUtils.java
New file @@ -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"; /** * 从本地sdcard读图片 */ 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; } /** * 向sdcard写图片 * * @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(); } } } VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MemoryCacheUtils.java
New file @@ -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); } } VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MyBitmapUtils.java
New file @@ -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); } } VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/NetCacheUtils.java
New file @@ -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);// 将url和imageview绑定 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)) {// 确保图片设定给了正确的imageview 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; } } 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() {