xuxiuxi
2017-05-12 714ef3d64f4707bbf3f5602d632b096a65311a9d


git-svn-id: http://192.168.1.226/svn/proxy@628 454eff88-639b-444f-9e54-f578c98de674
1个文件已添加
9个文件已修改
435 ■■■■■ 已修改文件
VisitFace/DemoForBsk/app/src/main/AndroidManifest.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/assets/license.lic 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/adapter/SurveillanceFragment.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/RegisterFragment.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/BitmapUtil.java 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/librtspface.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/res/layout/fragment_surveillance.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/AndroidManifest.xml
@@ -11,6 +11,11 @@
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <application
        android:name="cn.com.basic.face.base.BaseApplication"
        android:allowBackup="true"
@@ -24,7 +29,6 @@
            android:windowSoftInputMode="adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
VisitFace/DemoForBsk/app/src/main/assets/license.lic
New file
@@ -0,0 +1,56 @@
############################################################
# SenseTime License
# License Product: FaceSdk
# Expiration: 20170309~20170609
# License SN: 23eba58f-d927-4c8b-b531-fb588326e79d
############################################################
sGfdd5sxA8NCweDGA+vU2qzOgOjTn64wtsOftvbVw+MzmQXlL9gGE+JsM0nU
lOHN/Ai/mjyyPqGW4W5FxJgLnqgzp2g09JkRdjXGle8IEY8ag4wXH8LUT+XY
OXBBvilrGRazpr4ni1SVkpgxTHoX3GdBY09aLCaJ9uCj1p7uErIgjhC2AQAA
AAEAAAABJioS4yQz2pTIieigSTrt4ANVz5LRRa52XLWQvB2azvNdASaqkN2B
qMLx/Hy1Bq6TLqWxL0paF9Xj5t/xptpwmax0BxY+Dn4rsdJj4PnChey1B2Hx
OLlVDQUj+oZ3lgpzi1wdFp8RLKEDJVa5WRuiV8Po3o+JrDz5DvX+FJIKyrgF
5piZ69rc/zi0ohoz3VqCCr1OEUv4XSpDkK/g+1NkBHvco/EZe8wLoh0R7nQR
7yHAzGQRZMEBTaduWIATW1PeBQJxUjKGCv57aCB5jeGk0wg/60/4702f2Dth
RpZOeMvfbYedzag4SKaHN5rQ9jE+L0dCqREJvkfUVMYJ8wyvAQABAAAAAAAD
AAAAAAAAAAAAAAAdFrdcj38Pba/zw3OZ/zBgEZR1PVWeUBie2oiKNyH5oui3
TgKfJH5wsLTGRPVm9S7pvOYfkLzS36uvuwvzZDyuWR2Z4LhnnZuPmaVqjKCs
8vqKNKoYMjqRuKlLc/y+lAk4U/2HGWDkWruVyV2pwqQhUEreQjDI3kFfwPtR
Ku7yaU4WpTKlQnuqI0Obs6/RqzM+XXs3TfxMOQAiBu+kWzaZTC19BtXMPFrN
fAjbMnQde9bo7miN0Suho+Y+NJZgyHmTyQ==
------------------------------------------------------------
sGfdd4ync6ncI3nEVcIUuDiB2p7YiL+mf00nQjQQvJDzvxzxFPvWImdrzRrz
SsYr6tyb7VKTFrtomRgHb6rAdQ73f6PjkCrObDuTl8VuM5ZWsQ3+L2elXInc
CERoBcK8QD/vnFDJZrbMIVYnp/3nMfrbH4dlfsNiRjGCSKc2wfBXOc3mAQAA
AAEAAACfjNAHR/gO6dqbIlC8U/1fwvD36bQEhb4W1dCHwbF/z6XaS7IMvYQc
t3y7lDyrbWeD4WE5b5chSLgza2yF0MRicANpv7p0juOxC7UW8wAlS9Kc4fZL
PqwJAHZQX6Lvq1RyMZdRYgXfS3G9IKHjzxM0Ffzouj3ZDKxE5u+Aggxjx8CL
EGYtcutF6ucUDrxbrVxKzP1s6xTcoKg2leRaum7D6wJQrfSMjFJd6Y3t1bWz
Ta4Nwez/On6PNmGkKwf/FZtay1cp33pMzTRbciDCBuDVnzqnbLhRrRJBJwrK
IFTZETbC3EU9z62mbMOrRU6DumwmO4/JH6Y6SdG0jcNZgHiXAQABAAAAAAAD
AAAAAAAAAAAAAABaGOJAie6YMETNu9Z7SRpvDvpF+/CVNzjmbD07Pf0yCcgV
teA61Pju5L3m4SEMmmc5bQd+lCbi3iJJla6B00nvIn9oJDW5yyHeAEbD7fGz
jnMGlhA6TBroyrMS0Ioc7kWV+jPNMqpH12+/d72mSjJxzoAcJCEVrdZXQM/x
acx2zjEcCTUmB1Am6kwN3JwRkLYbmvuX3BYEFmdb/asfbrqY7XEg0QM979yt
lfDfiMbabiEq+07Hw4JNIFBpJH48gsONtIVp1z/Q4JKgWJePjCN4uqAzXjm7
OTwMy9UMwQZVvXa2uvdEBsK9uD1RZhDhhCM9cmQxSQlsPvPuBVngDk+7WfqJ
XX/t8Gvr9BHyTpfr9F9g+ycHN7I=
------------------------------------------------------------
sGfdd51jz/3P1rkqceNQHuMInGXxJ3464NMUHYbgKSCoXBJMahSemJnZS1lw
MjS3FfxgWpCUlzsjN8PdPsCvmhTySdSGbAeZG6QEGe5odctMsw70fTQaayLm
yR5PDhKsnhRz+tCWyIDm53jFT+3ne39D3a8d/8X2lOFMhITh19BLtYUNAQAA
AAIAAABsqqz6JmKzKzcOFs9F4pl4XEwqDhhCqbeGww6tX1zB8xQQnhLu9apg
CYi/GPXi8e3NTWfccJ802gfmovCeTIJVnM+9i890/Vs9ZdRexAJDePbRGA8S
wOs5w5OoGc1j7Uf0gtJTNhzrQVDSROeu64SPgK3sAOmEmfoIgvfG6BkwSuyD
alKNI4ls/2OtCSU83tlQm3+c/298/KG+rm0QQ5spiMQtK+oWZy96/vTaCC7W
fYeyPxRDdVL2eEqf3pI81T6bUVfr/PAIQY6gxWD6EjyIsSrvFTDlUjl+y2o/
VzP6XULm89mZ0KVtr0cJWCZhZWsB5k1MvRQPjNPQJzvuWiYbAAAAAAAAAAAA
AAAAAAAAAAAAAABDsOfzevB2OT/KCieqW0YYsaVPN/+VQQrNJh15Ipin5axF
PeyfcBeEkbP8P57z0Q+REKkQyHzarmD++TO7nsiklUMT0KazEWZYS7TwIEPz
ExveQ5EJzCV5+gm+zV0mA0IwTy3/TAodCWKBLaaEw8sg73boF1/qeMBBIEvQ
MGJMmBeBpx2s2W2Eas4VMs5fRxCNtljiVtSktGuCMaIHq/hUAb53mkdves+3
nrrD2MYa+opGDvt0vWvMaU+BrIgqUusoVowo2oP8LB8CMufn1O2B1gn2C8lV
OCwROzxgkMOnuhjT7LdMJUF0D2XIo1MfwVDjKTgJY3qEtK4whaV3OD+KteZN
mtTdh+F1fo/zqfQhDP3MWwF+tdd95eXJFnm7naPch+NfXmSif8O+cQ6noIQl
k+L3IpI4QiHPwdAXF+9ZnH42l4YZ
############################################################
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/adapter/SurveillanceFragment.java
@@ -22,6 +22,7 @@
import cn.com.basic.face.discern.query.item.SurveillanceQueryItem;
import cn.com.basic.face.fragment.*;
import cn.com.basic.face.util.AppApi;
import cn.com.basic.face.util.BitmapUtil;
import cn.com.basic.face.util.Constant;
public class SurveillanceFragment {
@@ -85,7 +86,8 @@
                    fragment_home_bottom_register_cell_photo.setImageURI(Uri.parse(AppApi.IMAGE_URL_BASE +item.getImagePath()));
                } else {
                    if (item.getBitmap() != null) {
                        fragment_home_bottom_register_cell_photo.setImageBitmap(item.getBitmap());
                        fragment_home_bottom_register_cell_photo.setImageBitmap(BitmapUtil.getRoundedCornerBitmap(item.getBitmap(),
                                (int)MainActivity.getInstance().getResources().getDimension(R.dimen.w10dp)));
                    } else {
                        fragment_home_bottom_register_cell_photo.setImageResource(R.drawable.u45);
                    }
@@ -95,7 +97,7 @@
                    @Override
                    public void onClick(View view) {
                        MainActivity.selectPage(1);
                        RegisterFragment.getInstance().setRegisterInfo(getVo(item));//java.lang.OutOfMemoryError: Failed to allocate a 25338980 byte allocation with 15827186 free bytes and 15MB until OOM
//                        RegisterFragment.getInstance().setRegisterInfo(getVo(item));//java.lang.OutOfMemoryError: Failed to allocate a 25338980 byte allocation with 15827186 free bytes and 15MB until OOM
                        if(item.getBitmap() != null) {
                            RegisterFragment.getInstance().setChoosePhoto(item.getBitmap());
                            RegisterFragment.getInstance().setSurveillanceQueryItem_selectPhoto(item);
@@ -314,7 +316,8 @@
                    fragment_surveillance_photo_cell_photo.setImageURI(Uri.parse(AppApi.IMAGE_URL_BASE +item.getImagePath()));
                } else {
                    if (item.getBitmap() != null) {
                        fragment_surveillance_photo_cell_photo.setImageBitmap(item.getBitmap());
                        fragment_surveillance_photo_cell_photo.setImageBitmap(BitmapUtil.getRoundedCornerBitmap(item.getBitmap(),
                                (int)MainActivity.getInstance().getResources().getDimension(R.dimen.w10dp)));
                    } else {
                        fragment_surveillance_photo_cell_photo.setImageResource(R.drawable.u45);
                    }
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/RegisterFragment.java
@@ -28,6 +28,7 @@
import cn.com.basic.face.service.DictionaryMng;
import cn.com.basic.face.service.RegisterMng;
import cn.com.basic.face.service.SurveillanceMng;
import cn.com.basic.face.util.BitmapUtil;
import cn.com.basic.face.util.Constant;
import cn.com.basic.face.util.NativeImg;
import cn.com.basic.face.util.OkClickedListener;
@@ -257,7 +258,8 @@
    public void set_fragment_register_surveillance_photo(SurveillanceQueryItem item) {
        surveillanceQueryItem_selectPhoto = item;
        fragment_register_surveillance_photo.setImageBitmap(item.getBitmap());
        fragment_register_surveillance_photo.setImageBitmap(BitmapUtil.getRoundedCornerBitmap(item.getBitmap(),
                (int)MainActivity.getInstance().getResources().getDimension(R.dimen.w10dp)));
        fragment_register_surveillance_photo_img = item.getBitmap();
        fragment_register_surveillance_photo_placeholder_image.setVisibility(View.INVISIBLE);
        fragment_register_surveillance_photo_placeholder_text_view.setVisibility(View.INVISIBLE);
@@ -265,7 +267,8 @@
    public void set_fragment_register_upload_custom_photo(SurveillanceQueryItem item) {
        surveillanceQueryItem_uploadPhoto = item;
        fragment_register_upload_custom_photo.setImageBitmap(item.getBitmap());
        fragment_register_upload_custom_photo.setImageBitmap(BitmapUtil.getRoundedCornerBitmap(item.getBitmap(),
                (int)MainActivity.getInstance().getResources().getDimension(R.dimen.w10dp)));
        fragment_register_upload_custom_photo_img = item.getBitmap();
        fragment_register_upload_custom_photo_placeholder_image.setVisibility(View.INVISIBLE);
@@ -326,7 +329,8 @@
            Uri uri = data.getData();
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
                fragment_register_id_card_photo.setImageBitmap(bitmap);
                fragment_register_id_card_photo.setImageBitmap(BitmapUtil.getRoundedCornerBitmap(bitmap,
                        (int)MainActivity.getInstance().getResources().getDimension(R.dimen.w10dp)));
                fragment_register_id_card_photo_img = bitmap;
                MainActivity.getInstance().getContentResolver().delete(uri, null, null);
@@ -468,7 +472,8 @@
    }
    public void setChoosePhoto(Bitmap bitmap) {
        fragment_register_surveillance_photo.setImageBitmap(bitmap);
        fragment_register_surveillance_photo.setImageBitmap(BitmapUtil.getRoundedCornerBitmap(bitmap,
                (int)MainActivity.getInstance().getResources().getDimension(R.dimen.w10dp)));
        fragment_register_surveillance_photo_placeholder_text_view.setVisibility(View.INVISIBLE);
        fragment_register_surveillance_photo_placeholder_image.setVisibility(View.INVISIBLE);
    }
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java
@@ -23,9 +23,16 @@
import cn.com.basic.face.widget.surveilance.SurveillanceBottomAttendanceListView;
import cn.com.basic.face.widget.surveilance.SurveillanceBottomVisitorListView;
import com.facebook.common.file.FileUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.lidroid.xutils.view.annotation.event.OnClick;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
public class SurveillanceFragment extends BaseFragment {
@@ -116,6 +123,12 @@
                    if (useNative) {
                        MainActivity.getInstance().runOnUiThread(new Runnable() {
                            public void run() {
                                try {
                                    String str = convertStreamToString(MainActivity.getInstance().getAssets().open("license.lic"));
                                    RtspFaceNative.dbgSetStfaceLicense(str);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                RtspFaceNative.setSurface(1, fragment_supervisory_enter_camera.getHolder().getSurface());
                                RtspFaceNative.setSurface(2, fragment_supervisory_exit_camera.getHolder().getSurface());
                                RtspFaceNative.createPlayer(1, DeviceMng.getInstance().getCamera1Address());
@@ -123,6 +136,24 @@
                                RtspFaceNative.setFaceCallback(1, "cn/com/basic/face/util/RtspFaceNative", "faceCallBack");
                                RtspFaceNative.setFaceCallback(2, "cn/com/basic/face/util/RtspFaceNative", "faceCallBack");
                            }
                            public String convertStreamToString(InputStream is) throws Exception {
                                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                                StringBuilder sb = new StringBuilder();
                                String line = null;
                                while ((line = reader.readLine()) != null) {
                                    sb.append(line).append("\n");
                                }
                                reader.close();
                                return sb.toString();
                            }
                            public String getStringFromFile (String filePath) throws Exception {
                                File fl = new File(filePath);
                                FileInputStream fin = new FileInputStream(fl);
                                String ret = convertStreamToString(fin);
                                //Make sure you close all streams.
                                fin.close();
                                return ret;
                            }
                        });
                    } else {
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/service/DeviceMng.java
@@ -116,7 +116,7 @@
//            port = camera1.getString("fragment_device_right_camera1_port", "");
//        }
        return "rtsp://"+username+":"+password+"@"+ip+":"+port+"/h264/ch1/sub/av_stream";
        return "rtsp://"+username+":"+password+"@"+ip+":"+port+"/h264/ch1/main/av_stream";
    }
    public String getCamera2Address() {
@@ -139,7 +139,7 @@
//            port = camera1.getString("fragment_device_right_camera1_port", "");
//        }
        return "rtsp://"+username+":"+password+"@"+ip+":"+port+"/h264/ch1/sub/av_stream";
        return "rtsp://"+username+":"+password+"@"+ip+":"+port+"/h264/ch1/main/av_stream";
    }
}
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/BitmapUtil.java
@@ -2,7 +2,9 @@
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
@@ -33,30 +35,292 @@
        return output;
    }
    public static Bitmap getCornerBitmap(Bitmap bitmap) {
        int min = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getHeight() : bitmap.getWidth();
    public static Bitmap getCornerBitmap(Bitmap mBitmap) {
//        int min = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getHeight() : bitmap.getWidth();
//
//        int width = bitmap.getWidth();
//        int height = bitmap.getHeight();
//
//        Bitmap output = Bitmap.createBitmap(width,
//                height, Bitmap.Config.ARGB_8888);
//        Canvas canvas = new Canvas(output);
//
//        final int color = 0xff424242;
//        final Paint paint = new Paint();
//        final RectF rectF = new RectF(0, 0, width, height);
//        final Rect rect = new Rect(0, 0, width, height);
//
//        paint.setAntiAlias(true);
//        canvas.drawARGB(0, 0, 0, 0);
//        paint.setColor(color);
//        //canvas.drawCircle(min / 2, min / 2, min / 2, paint);
//        canvas.drawRoundRect(rectF, 333, 333, paint);
//        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//        canvas.drawBitmap(bitmap, rect, rect, paint);
//
//        return output;
        // Create a rounded corners bitmap
//        mBitmap = getRoundedBitmap(mBitmap, cornerRadius);
//
//        // Add a border around rounded corners bitmap
//        mBitmap = addBorderToRoundedBitmap(mBitmap, cornerRadius, 10, Color.WHITE);
//
//        // Add a border around rounded corners bitmap as shadow
//        mBitmap = addBorderToRoundedBitmap(mBitmap, cornerRadius, 3, Color.LTGRAY);
        return mBitmap;
    }
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
    public static Bitmap getRoundedCornerBitmap(Bitmap mBitmap, int cornerRadius) {
//        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
//                .getHeight(), Bitmap.Config.ARGB_8888);
//        Canvas canvas = new Canvas(output);
//
//        final int color = 0xff424242;
//        final Paint paint = new Paint();
//        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
//        final RectF rectF = new RectF(rect);
//        final float roundPx = pixels;
//
//        paint.setAntiAlias(true);
//        canvas.drawARGB(0, 0, 0, 0);
//        paint.setColor(color);
//        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
//
//        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//        canvas.drawBitmap(bitmap, rect, rect, paint);
//
//        return output;
        Bitmap output = Bitmap.createBitmap(width,
                height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        mBitmap = getRoundedBitmap(mBitmap, cornerRadius);
        final int color = 0xff424242;
        final Paint paint = new Paint();
        final RectF rectF = new RectF(0, 0, width, height);
        final Rect rect = new Rect(0, 0, width, height);
        // Add a border around rounded corners bitmap
        mBitmap = addBorderToRoundedBitmap(mBitmap, cornerRadius, 10, Color.WHITE);
        // Add a border around rounded corners bitmap as shadow
        mBitmap = addBorderToRoundedBitmap(mBitmap, cornerRadius, 3, Color.LTGRAY);
        return mBitmap;
    }
    public static Path RoundedRect(
                                    float left, float top, float right, float bottom, float rx, float ry,
                                    boolean tl, boolean tr, boolean br, boolean bl
                                    ){
        Path path = new Path();
        if (rx < 0) rx = 0;
        if (ry < 0) ry = 0;
        float width = right - left;
        float height = bottom - top;
        if (rx > width / 2) rx = width / 2;
        if (ry > height / 2) ry = height / 2;
        float widthMinusCorners = (width - (2 * rx));
        float heightMinusCorners = (height - (2 * ry));
        path.moveTo(right, top + ry);
        if (tr)
            path.rQuadTo(0, -ry, -rx, -ry);//top-right corner
        else{
            path.rLineTo(0, -ry);
            path.rLineTo(-rx,0);
        }
        path.rLineTo(-widthMinusCorners, 0);
        if (tl)
            path.rQuadTo(-rx, 0, -rx, ry); //top-left corner
        else{
            path.rLineTo(-rx, 0);
            path.rLineTo(0,ry);
        }
        path.rLineTo(0, heightMinusCorners);
        if (bl)
            path.rQuadTo(0, ry, rx, ry);//bottom-left corner
        else{
            path.rLineTo(0, ry);
            path.rLineTo(rx,0);
        }
        path.rLineTo(widthMinusCorners, 0);
        if (br)
            path.rQuadTo(rx, 0, rx, -ry); //bottom-right corner
        else{
            path.rLineTo(rx,0);
            path.rLineTo(0, -ry);
        }
        path.rLineTo(0, -heightMinusCorners);
        path.close();//Given close, last lineto can be removed.
        return path;
    }
    // Custom method to create rounded bitmap from a rectangular bitmap
    public static Bitmap getRoundedBitmap(Bitmap srcBitmap, int cornerRadius) {
        // Initialize a new instance of Bitmap
        Bitmap dstBitmap = Bitmap.createBitmap(
                srcBitmap.getWidth(), // Width
                srcBitmap.getHeight(), // Height
                Bitmap.Config.ARGB_8888 // Config
        );
        /*
            Canvas
                The Canvas class holds the "draw" calls. To draw something, you need 4 basic
                components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing
                into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint
                (to describe the colors and styles for the drawing).
        */
        // Initialize a new Canvas to draw rounded bitmap
        Canvas canvas = new Canvas(dstBitmap);
        // Initialize a new Paint instance
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        //canvas.drawCircle(min / 2, min / 2, min / 2, paint);
        canvas.drawRoundRect(rectF, 333, 333, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return output;
        /*
            Rect
                Rect holds four integer coordinates for a rectangle. The rectangle is represented by
                the coordinates of its 4 edges (left, top, right bottom). These fields can be accessed
                directly. Use width() and height() to retrieve the rectangle's width and height.
                Note: most methods do not check to see that the coordinates are sorted correctly
                (i.e. left <= right and top <= bottom).
        */
        /*
            Rect(int left, int top, int right, int bottom)
                Create a new rectangle with the specified coordinates.
        */
        // Initialize a new Rect instance
        Rect rect = new Rect(0, 0, srcBitmap.getWidth(), srcBitmap.getHeight());
        /*
            RectF
                RectF holds four float coordinates for a rectangle. The rectangle is represented by
                the coordinates of its 4 edges (left, top, right bottom). These fields can be
                accessed directly. Use width() and height() to retrieve the rectangle's width and
                height. Note: most methods do not check to see that the coordinates are sorted
                correctly (i.e. left <= right and top <= bottom).
        */
        // Initialize a new RectF instance
        RectF rectF = new RectF(rect);
        /*
            public void drawRoundRect (RectF rect, float rx, float ry, Paint paint)
                Draw the specified round-rect using the specified paint. The roundrect will be
                filled or framed based on the Style in the paint.
            Parameters
                rect : The rectangular bounds of the roundRect to be drawn
                rx : The x-radius of the oval used to round the corners
                ry : The y-radius of the oval used to round the corners
                paint : The paint used to draw the roundRect
        */
        // Draw a rounded rectangle object on canvas
        canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint);
        /*
            public Xfermode setXfermode (Xfermode xfermode)
                Set or clear the xfermode object.
                Pass null to clear any previous xfermode. As a convenience, the parameter passed
                is also returned.
            Parameters
                xfermode : May be null. The xfermode to be installed in the paint
            Returns
                xfermode
        */
        /*
            public PorterDuffXfermode (PorterDuff.Mode mode)
                Create an xfermode that uses the specified porter-duff mode.
            Parameters
                mode : The porter-duff mode that is applied
        */
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        /*
            public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
                Draw the specified bitmap, with its top/left corner at (x,y), using the specified
                paint, transformed by the current matrix.
                Note: if the paint contains a maskfilter that generates a mask which extends beyond
                the bitmap's original width/height (e.g. BlurMaskFilter), then the bitmap will be
                drawn as if it were in a Shader with CLAMP mode. Thus the color outside of the
                original width/height will be the edge color replicated.
                If the bitmap and canvas have different densities, this function will take care of
                automatically scaling the bitmap to draw at the same density as the canvas.
            Parameters
                bitmap : The bitmap to be drawn
                left : The position of the left side of the bitmap being drawn
                top : The position of the top side of the bitmap being drawn
                paint : The paint used to draw the bitmap (may be null)
        */
        // Make a rounded image by copying at the exact center position of source image
        canvas.drawBitmap(srcBitmap, 0, 0, paint);
        // Free the native object associated with this bitmap.
        srcBitmap.recycle();
        // Return the circular bitmap
        return dstBitmap;
    }
    // Custom method to add a border around rounded bitmap
    public static Bitmap addBorderToRoundedBitmap(Bitmap srcBitmap, int cornerRadius, int borderWidth, int borderColor){
        // We will hide half border by bitmap
        borderWidth = borderWidth*2;
        // Initialize a new Bitmap to make it bordered rounded bitmap
        Bitmap dstBitmap = Bitmap.createBitmap(
                srcBitmap.getWidth() + borderWidth, // Width
                srcBitmap.getHeight() + borderWidth, // Height
                Bitmap.Config.ARGB_8888 // Config
        );
        // Initialize a new Canvas instance
        Canvas canvas = new Canvas(dstBitmap);
        // Initialize a new Paint instance to draw border
        Paint paint = new Paint();
        paint.setColor(borderColor);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(borderWidth);
        paint.setAntiAlias(true);
        // Initialize a new Rect instance
        Rect rect = new Rect(
                borderWidth/2,
                borderWidth/2,
                dstBitmap.getWidth() - borderWidth/2,
                dstBitmap.getHeight() - borderWidth/2
        );
        // Initialize a new instance of RectF;
        RectF rectF = new RectF(rect);
        // Draw rounded rectangle as a border/shadow on canvas
        canvas.drawRoundRect(rectF,cornerRadius,cornerRadius,paint);
        // Draw source bitmap to canvas
        canvas.drawBitmap(srcBitmap, borderWidth / 2, borderWidth / 2, null);
        /*
            public void recycle ()
                Free the native object associated with this bitmap, and clear the reference to the
                pixel data. This will not free the pixel data synchronously; it simply allows it to
                be garbage collected if there are no other references. The bitmap is marked as
                "dead", meaning it will throw an exception if getPixels() or setPixels() is called,
                and will draw nothing. This operation cannot be reversed, so it should only be
                called if you are sure there are no further uses for the bitmap. This is an advanced
                call, and normally need not be called, since the normal GC process will free up this
                memory when there are no more references to this bitmap.
        */
        srcBitmap.recycle();
        // Return the bordered circular bitmap
        return dstBitmap;
    }
}
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java
@@ -55,7 +55,7 @@
    public static native void dbgFaceAdd(NativeImg faceImage);
    public static native String dbgGetLog();
    public static native void dbgSetStfaceLicense(String lic);
    public static int COMPANY_ID = 1001;
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/librtspface.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/res/layout/fragment_surveillance.xml
@@ -30,10 +30,12 @@
    </RelativeLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/h350dp"
        android:layout_height="0dp"
        android:orientation="horizontal"
        android:paddingLeft="2dp"
        android:paddingRight="2dp">
        android:paddingRight="2dp"
        android:layout_weight="1"
        >
        <RelativeLayout
            android:layout_width="@dimen/view_size_0"
            android:layout_height="match_parent"
@@ -118,10 +120,12 @@
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_height="@dimen/h280dp"
        android:layout_marginTop="@dimen/h4dp"
        android:paddingRight="@dimen/h4dp"
        android:orientation="horizontal">
        android:orientation="horizontal"
        android:layout_weight="0"
        >
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent">
@@ -159,7 +163,6 @@
                android:layout_width="@dimen/w5dp"
                android:layout_height="match_parent"
                android:orientation="vertical">
                <View
                    android:id="@+id/fragment_supervisory_bottom_visitor_background"
                    android:layout_width="match_parent"
@@ -186,7 +189,6 @@
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="vertical"/>
            <cn.com.basic.face.widget.surveilance.SurveillanceBottomAttendanceListView
                android:id="@+id/fragment_supervisory_bottom_attendance_list_view"
                android:layout_width="wrap_content"