xuxiuxi
2017-08-11 5f12988a77d078a5e5155c9a301e45bfd288d7e5


git-svn-id: http://192.168.1.226/svn/proxy@1004 454eff88-639b-444f-9e54-f578c98de674
8个文件已添加
8个文件已修改
892 ■■■■■ 已修改文件
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/DeviceFragment.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/InternetAccessThread.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/PhoneCallMng.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MD5Encoder.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegInputStream.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/MjpegView.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/SurveillanceQueryItemUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/ToastUtil.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/LocalCacheUtils.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MemoryCacheUtils.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/MyBitmapUtils.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/bitmap/NetCacheUtils.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/widget/checkin/CheckInRightIntervieweeCell.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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() {