Commit 31cde7c5d39ddec17da5dd1fd7b5b18153cb2227

Authored by YangShuai
1 parent 70f46c48

重构项目

Showing 39 changed files with 0 additions and 4193 deletions

Too many changes to show.

To preserve performance only 39 of 138 files are displayed.

core/base/src/main/java/com/cjt2325/cameralibrary/CameraInterface.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary;  
2 -  
3 -import android.animation.AnimatorSet;  
4 -import android.animation.ObjectAnimator;  
5 -import android.content.Context;  
6 -import android.graphics.Bitmap;  
7 -import android.graphics.BitmapFactory;  
8 -import android.graphics.ImageFormat;  
9 -import android.graphics.Matrix;  
10 -import android.graphics.Rect;  
11 -import android.graphics.RectF;  
12 -import android.hardware.Camera;  
13 -import android.hardware.Sensor;  
14 -import android.hardware.SensorEvent;  
15 -import android.hardware.SensorEventListener;  
16 -import android.hardware.SensorManager;  
17 -import android.media.MediaRecorder;  
18 -import android.os.Build;  
19 -import android.os.Environment;  
20 -import android.util.Log;  
21 -import android.view.Surface;  
22 -import android.view.SurfaceHolder;  
23 -import android.widget.ImageView;  
24 -  
25 -import com.cjt2325.cameralibrary.listener.ErrorListener;  
26 -import com.cjt2325.cameralibrary.util.AngleUtil;  
27 -import com.cjt2325.cameralibrary.util.CameraParamUtil;  
28 -import com.cjt2325.cameralibrary.util.CheckPermission;  
29 -import com.cjt2325.cameralibrary.util.DeviceUtil;  
30 -import com.cjt2325.cameralibrary.util.FileUtil;  
31 -import com.cjt2325.cameralibrary.util.LogUtil;  
32 -import com.cjt2325.cameralibrary.util.ScreenUtils;  
33 -  
34 -import java.io.File;  
35 -import java.io.IOException;  
36 -import java.util.ArrayList;  
37 -import java.util.List;  
38 -  
39 -import static android.graphics.Bitmap.createBitmap;  
40 -  
41 -/**  
42 - * =====================================  
43 - * 作 者: 陈嘉桐  
44 - * 版 本:1.1.4  
45 - * 创建日期:2017/4/25  
46 - * 描 述:camera操作单例  
47 - * =====================================  
48 - */  
49 -@SuppressWarnings("deprecation")  
50 -public class CameraInterface implements Camera.PreviewCallback {  
51 -  
52 - private static final String TAG = "CJT";  
53 -  
54 - private volatile static CameraInterface mCameraInterface;  
55 -  
56 - public static void destroyCameraInterface() {  
57 - if (mCameraInterface != null) {  
58 - mCameraInterface = null;  
59 - }  
60 - }  
61 -  
62 - private Camera mCamera;  
63 - private Camera.Parameters mParams;  
64 - private boolean isPreviewing = false;  
65 -  
66 - private int SELECTED_CAMERA = -1;  
67 - private int CAMERA_POST_POSITION = -1;  
68 - private int CAMERA_FRONT_POSITION = -1;  
69 -  
70 - private SurfaceHolder mHolder = null;  
71 - private float screenProp = -1.0f;  
72 -  
73 - private boolean isRecorder = false;  
74 - private MediaRecorder mediaRecorder;  
75 - private String videoFileName;  
76 - private String saveVideoPath;  
77 - private String videoFileAbsPath;  
78 -  
79 - private ErrorListener errorLisenter;  
80 -  
81 - private ImageView mSwitchView;  
82 - private ImageView mFlashLamp;  
83 -  
84 - private int preview_width;  
85 - private int preview_height;  
86 -  
87 - private int angle = 0;  
88 - private int cameraAngle = 90;//摄像头角度 默认为90度  
89 - private int rotation = 0;  
90 - private byte[] firstFrame_data;  
91 -  
92 - public static final int TYPE_RECORDER = 0x090;  
93 - public static final int TYPE_CAPTURE = 0x091;  
94 - private int nowScaleRate = 0;  
95 - private int recordScleRate = 0;  
96 -  
97 - //视频质量  
98 - private int mediaQuality = JCameraView.MEDIA_QUALITY_HIGH;  
99 -  
100 - //获取CameraInterface单例  
101 - public static synchronized CameraInterface getInstance() {  
102 - if (mCameraInterface == null)  
103 - synchronized (CameraInterface.class) {  
104 - if (mCameraInterface == null)  
105 - mCameraInterface = new CameraInterface();  
106 - }  
107 - return mCameraInterface;  
108 - }  
109 -  
110 - public void setSwitchView(ImageView mSwitchView, ImageView mFlashLamp) {  
111 - this.mSwitchView = mSwitchView;  
112 - this.mFlashLamp = mFlashLamp;  
113 - if (mSwitchView != null) {  
114 - cameraAngle = CameraParamUtil.getInstance().getCameraDisplayOrientation(mSwitchView.getContext(),  
115 - SELECTED_CAMERA);  
116 - }  
117 - }  
118 -  
119 - private SensorEventListener sensorEventListener = new SensorEventListener() {  
120 - public void onSensorChanged(SensorEvent event) {  
121 - if (Sensor.TYPE_ACCELEROMETER != event.sensor.getType()) {  
122 - return;  
123 - }  
124 - float[] values = event.values;  
125 - angle = AngleUtil.getSensorAngle(values[0], values[1]);  
126 - rotationAnimation();  
127 - }  
128 -  
129 - public void onAccuracyChanged(Sensor sensor, int accuracy) {  
130 - }  
131 - };  
132 -  
133 - //切换摄像头icon跟随手机角度进行旋转  
134 - private void rotationAnimation() {  
135 - if (mSwitchView == null) {  
136 - return;  
137 - }  
138 - if (rotation != angle) {  
139 - int start_rotaion = 0;  
140 - int end_rotation = 0;  
141 - switch (rotation) {  
142 - case 0:  
143 - start_rotaion = 0;  
144 - switch (angle) {  
145 - case 90:  
146 - end_rotation = -90;  
147 - break;  
148 - case 270:  
149 - end_rotation = 90;  
150 - break;  
151 - }  
152 - break;  
153 - case 90:  
154 - start_rotaion = -90;  
155 - switch (angle) {  
156 - case 0:  
157 - end_rotation = 0;  
158 - break;  
159 - case 180:  
160 - end_rotation = -180;  
161 - break;  
162 - }  
163 - break;  
164 - case 180:  
165 - start_rotaion = 180;  
166 - switch (angle) {  
167 - case 90:  
168 - end_rotation = 270;  
169 - break;  
170 - case 270:  
171 - end_rotation = 90;  
172 - break;  
173 - }  
174 - break;  
175 - case 270:  
176 - start_rotaion = 90;  
177 - switch (angle) {  
178 - case 0:  
179 - end_rotation = 0;  
180 - break;  
181 - case 180:  
182 - end_rotation = 180;  
183 - break;  
184 - }  
185 - break;  
186 - }  
187 - ObjectAnimator animC = ObjectAnimator.ofFloat(mSwitchView, "rotation", start_rotaion, end_rotation);  
188 -// ObjectAnimator animF = ObjectAnimator.ofFloat(mFlashLamp, "rotation", start_rotaion, end_rotation);  
189 - AnimatorSet set = new AnimatorSet();  
190 - set.playTogether(animC);  
191 - set.setDuration(500);  
192 - set.start();  
193 - rotation = angle;  
194 - }  
195 - }  
196 -  
197 - @SuppressWarnings("ResultOfMethodCallIgnored")  
198 - void setSaveVideoPath(String saveVideoPath) {  
199 - this.saveVideoPath = saveVideoPath;  
200 - File file = new File(saveVideoPath);  
201 - if (!file.exists()) {  
202 - file.mkdirs();  
203 - }  
204 - }  
205 -  
206 -  
207 - public void setZoom(float zoom, int type) {  
208 - if (mCamera == null) {  
209 - return;  
210 - }  
211 - try {  
212 - if (mParams == null) {  
213 - mParams = mCamera.getParameters();  
214 - }  
215 - if (!mParams.isZoomSupported() || !mParams.isSmoothZoomSupported()) {  
216 - return;  
217 - }  
218 - switch (type) {  
219 - case TYPE_RECORDER:  
220 - //如果不是录制视频中,上滑不会缩放  
221 - if (!isRecorder) {  
222 - return;  
223 - }  
224 - if (zoom >= 0) {  
225 - //每移动50个像素缩放一个级别  
226 - int scaleRate = (int) (zoom / 40);  
227 - if (scaleRate <= mParams.getMaxZoom() && scaleRate >= nowScaleRate && recordScleRate != scaleRate) {  
228 - mParams.setZoom(scaleRate);  
229 - mCamera.setParameters(mParams);  
230 - recordScleRate = scaleRate;  
231 - }  
232 - }  
233 - break;  
234 - case TYPE_CAPTURE:  
235 - if (isRecorder) {  
236 - return;  
237 - }  
238 - //每移动50个像素缩放一个级别  
239 - int scaleRate = (int) (zoom / 50);  
240 - if (scaleRate < mParams.getMaxZoom()) {  
241 - nowScaleRate += scaleRate;  
242 - if (nowScaleRate < 0) {  
243 - nowScaleRate = 0;  
244 - } else if (nowScaleRate > mParams.getMaxZoom()) {  
245 - nowScaleRate = mParams.getMaxZoom();  
246 - }  
247 - mParams.setZoom(nowScaleRate);  
248 - mCamera.setParameters(mParams);  
249 - }  
250 - LogUtil.i("setZoom = " + nowScaleRate);  
251 - break;  
252 - }  
253 - } catch (Exception ignored) {  
254 -  
255 - }  
256 - }  
257 -  
258 - void setMediaQuality(int quality) {  
259 - this.mediaQuality = quality;  
260 - }  
261 -  
262 -  
263 - @Override  
264 - public void onPreviewFrame(byte[] data, Camera camera) {  
265 - firstFrame_data = data;  
266 - }  
267 -  
268 - public void setFlashMode(String flashMode) {  
269 - if (mCamera == null)  
270 - return;  
271 - try {  
272 -  
273 - Camera.Parameters parameters = mCamera.getParameters();  
274 - List<String> flashModes = parameters.getSupportedFlashModes();  
275 - if (flashModes == null) {  
276 - return;  
277 - }  
278 -  
279 - if (flashMode.contains(Camera.Parameters.FLASH_MODE_ON)) {  
280 - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);  
281 - mCamera.setParameters(parameters);  
282 - } else if (flashMode.contains(Camera.Parameters.FLASH_MODE_OFF)) {  
283 - parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);  
284 - mCamera.setParameters(parameters);  
285 - }  
286 -  
287 - return;  
288 - } catch (Exception e) {  
289 - Log.e("Camera", "闪光灯异常", e);  
290 - }  
291 - return;  
292 - }  
293 -  
294 - public int getSelectedCamera() {  
295 - return SELECTED_CAMERA;  
296 - }  
297 -  
298 - public interface CameraOpenOverCallback {  
299 - void cameraHasOpened();  
300 - }  
301 -  
302 - private CameraInterface() {  
303 - findAvailableCameras();  
304 - SELECTED_CAMERA = CAMERA_POST_POSITION;  
305 - saveVideoPath = "";  
306 - }  
307 -  
308 -  
309 - /**  
310 - * open Camera  
311 - */  
312 - void doOpenCamera(CameraOpenOverCallback callback) {  
313 - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {  
314 - if (!CheckPermission.isCameraUseable(SELECTED_CAMERA) && this.errorLisenter != null) {  
315 - this.errorLisenter.onError();  
316 - return;  
317 - }  
318 - }  
319 - if (mCamera == null) {  
320 - openCamera(SELECTED_CAMERA);  
321 - }  
322 - callback.cameraHasOpened();  
323 - }  
324 -  
325 - private void setFlashModel() {  
326 - mParams = mCamera.getParameters();  
327 - mParams.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); //设置camera参数为Torch模式  
328 - mCamera.setParameters(mParams);  
329 - }  
330 -  
331 - private synchronized boolean openCamera(int id) {  
332 - try {  
333 - this.mCamera = Camera.open(id);  
334 - } catch (Exception e) {  
335 - if (this.errorLisenter != null) this.errorLisenter.onError();  
336 - Log.e("CJT", "enable shutter sound faild", e);  
337 - }  
338 -  
339 - try {  
340 - if (Build.VERSION.SDK_INT > 17 && this.mCamera != null) {  
341 - this.mCamera.enableShutterSound(false);  
342 - }  
343 - } catch (Exception e) {  
344 - Log.e("CJT", "enable shutter sound faild", e);  
345 - }  
346 -  
347 - return mCamera != null;  
348 - }  
349 -  
350 - public synchronized boolean switchCamera(SurfaceHolder holder, float screenProp) {  
351 - if (SELECTED_CAMERA == CAMERA_POST_POSITION) {  
352 - SELECTED_CAMERA = CAMERA_FRONT_POSITION;  
353 - } else {  
354 - SELECTED_CAMERA = CAMERA_POST_POSITION;  
355 - }  
356 - doDestroyCamera();  
357 - LogUtil.i("open start");  
358 - openCamera(SELECTED_CAMERA);  
359 - LogUtil.i("open end");  
360 - return doStartPreview(holder, screenProp);  
361 - }  
362 -  
363 - /**  
364 - * doStartPreview  
365 - */  
366 - public boolean doStartPreview(SurfaceHolder holder, float screenProp) {  
367 - if (isPreviewing) {  
368 - LogUtil.i("doStartPreview isPreviewing");  
369 - }  
370 - if (this.screenProp < 0) {  
371 - this.screenProp = screenProp;  
372 - }  
373 - if (holder == null) {  
374 - return false;  
375 - }  
376 - this.mHolder = holder;  
377 - if (mCamera != null) {  
378 - try {  
379 - mParams = mCamera.getParameters();  
380 - Camera.Size previewSize = CameraParamUtil.getInstance().getPreviewSize(mParams  
381 - .getSupportedPreviewSizes(), 1000, screenProp);  
382 - Camera.Size pictureSize = CameraParamUtil.getInstance().getPictureSize(mParams  
383 - .getSupportedPictureSizes(), 1200, screenProp);  
384 -  
385 - mParams.setPreviewSize(previewSize.width, previewSize.height);  
386 -  
387 - preview_width = previewSize.width;  
388 - preview_height = previewSize.height;  
389 -  
390 - mParams.setPictureSize(pictureSize.width, pictureSize.height);  
391 -  
392 - if (CameraParamUtil.getInstance().isSupportedFocusMode(  
393 - mParams.getSupportedFocusModes(),  
394 - Camera.Parameters.FOCUS_MODE_AUTO)) {  
395 - mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);  
396 - }  
397 - if (CameraParamUtil.getInstance().isSupportedPictureFormats(mParams.getSupportedPictureFormats(),  
398 - ImageFormat.JPEG)) {  
399 - mParams.setPictureFormat(ImageFormat.JPEG);  
400 - mParams.setJpegQuality(100);  
401 - }  
402 - try {  
403 - mCamera.setParameters(mParams);  
404 - } catch (Exception e) {  
405 - Log.e("Camera", "开启预览异常", e);  
406 - }  
407 - // mParams = mCamera.getParameters();  
408 - mCamera.setPreviewDisplay(holder); //SurfaceView  
409 - mCamera.setDisplayOrientation(cameraAngle);//浏览角度  
410 - mCamera.setPreviewCallback(this); //每一帧回调  
411 - mCamera.startPreview();//启动浏览  
412 - isPreviewing = true;  
413 - Log.i(TAG, "=== Start Preview ===");  
414 - return true;  
415 - } catch (Exception e) {  
416 - Log.e("Camera", "开启预览异常", e);  
417 - }  
418 - }  
419 - return false;  
420 - }  
421 -  
422 - /**  
423 - * 停止预览  
424 - */  
425 - public void doStopPreview() {  
426 - if (null != mCamera) {  
427 - try {  
428 - mCamera.setPreviewCallback(null);  
429 - mCamera.stopPreview();  
430 - //这句要在stopPreview后执行,不然会卡顿或者花屏  
431 - mCamera.setPreviewDisplay(null);  
432 - isPreviewing = false;  
433 - mCamera.lock();  
434 - Log.i(TAG, "=== Stop Preview ===");  
435 - } catch (Exception e) {  
436 - Log.e("Camera", "", e);  
437 - }  
438 - }  
439 - }  
440 -  
441 - /**  
442 - * 销毁Camera  
443 - */  
444 - boolean doDestroyCamera() {  
445 - errorLisenter = null;  
446 - if (null != mCamera) {  
447 - try {  
448 - mCamera.setPreviewCallback(null);  
449 - mSwitchView = null;  
450 -// mFlashLamp = null;  
451 - mCamera.stopPreview();  
452 - //这句要在stopPreview后执行,不然会卡顿或者花屏  
453 - mCamera.setPreviewDisplay(null);  
454 - mHolder = null;  
455 - isPreviewing = false;  
456 - mCamera.lock();  
457 - mCamera.release();  
458 - mCamera = null;  
459 -// destroyCameraInterface();  
460 - Log.i(TAG, "=== Destroy Camera ===");  
461 - return true;  
462 - } catch (Exception e) {  
463 - Log.e("Camera", "", e);  
464 - }  
465 - return false;  
466 - } else {  
467 - Log.i(TAG, "=== Camera Null===");  
468 - }  
469 - return true;  
470 - }  
471 -  
472 - /**  
473 - * 拍照  
474 - */  
475 - private int nowAngle;  
476 -  
477 - public boolean takePicture(TakePictureCallback callback) {  
478 - if (mCamera == null) {  
479 - return false;  
480 - }  
481 - switch (cameraAngle) {  
482 - case 90:  
483 - nowAngle = Math.abs(angle + cameraAngle) % 360;  
484 - break;  
485 - case 270:  
486 - nowAngle = Math.abs(cameraAngle - angle);  
487 - break;  
488 - }  
489 -//  
490 - Log.i("CJT", angle + " = " + cameraAngle + " = " + nowAngle);  
491 - try {  
492 - mCamera.takePicture(null, null, new Camera.PictureCallback() {  
493 - @Override  
494 - public void onPictureTaken(byte[] data, Camera camera) {  
495 - Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);  
496 - Matrix matrix = new Matrix();  
497 - if (SELECTED_CAMERA == CAMERA_POST_POSITION) {  
498 - matrix.setRotate(nowAngle);  
499 - } else if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) {  
500 - matrix.setRotate(360 - nowAngle);  
501 - matrix.postScale(-1, 1);  
502 - }  
503 -  
504 - bitmap = createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
505 - if (callback != null) {  
506 - if (nowAngle == 90 || nowAngle == 270) {  
507 - callback.captureResult(bitmap, true);  
508 - } else {  
509 - callback.captureResult(bitmap, false);  
510 - }  
511 - }  
512 - }  
513 - });  
514 - return true;  
515 - } catch (Exception e) {  
516 - Log.e("Camera", "拍摄异常", e);  
517 - }  
518 - return false;  
519 - }  
520 -  
521 - //启动录像  
522 - public boolean startRecord(Surface surface, float screenProp, ErrorCallback callback,Context context) {  
523 - if (mCamera == null) return false;  
524 - mCamera.setPreviewCallback(null);  
525 - final int nowAngle = (angle + 90) % 360;  
526 - //获取第一帧图片  
527 -// Camera.Parameters parameters = mCamera.getParameters();  
528 -// int width = parameters.getPreviewSize().width;  
529 -// int height = parameters.getPreviewSize().height;  
530 -// YuvImage yuv = new YuvImage(firstFrame_data, parameters.getPreviewFormat(), width, height, null);  
531 -// ByteArrayOutputStream out = new ByteArrayOutputStream();  
532 -// yuv.compressToJpeg(new Rect(0, 0, width, height), 50, out);  
533 -// Matrix matrix = new Matrix();  
534 -// if (SELECTED_CAMERA == CAMERA_POST_POSITION) {  
535 -// matrix.setRotate(nowAngle);  
536 -// } else if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) {  
537 -// matrix.setRotate(270);  
538 -// }  
539 -  
540 - if (isRecorder) {  
541 - return true;  
542 - }  
543 - if (mCamera == null) {  
544 - openCamera(SELECTED_CAMERA);  
545 - }  
546 - if (mCamera == null) {  
547 - return false;  
548 - }  
549 - if (mediaRecorder == null) {  
550 - mediaRecorder = new MediaRecorder();  
551 - }  
552 - if (mParams == null) {  
553 - mParams = mCamera.getParameters();  
554 - }  
555 - List<String> focusModes = mParams.getSupportedFocusModes();  
556 - if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {  
557 - mParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);  
558 - }  
559 - try {  
560 - mCamera.setParameters(mParams);  
561 - } catch (Exception e) {  
562 -  
563 - }  
564 - try {  
565 - mCamera.unlock();  
566 - } catch (Exception e) {  
567 -  
568 - }  
569 - try {  
570 - mediaRecorder.reset();  
571 - mediaRecorder.setCamera(mCamera);  
572 - mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
573 - mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
574 - mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);  
575 - mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);  
576 - mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);  
577 -  
578 -  
579 - Camera.Size videoSize;  
580 - if (mParams.getSupportedVideoSizes() == null) {  
581 - videoSize = CameraParamUtil.getInstance().getPreviewSize(mParams.getSupportedPreviewSizes(), 600,  
582 - screenProp);  
583 - } else {  
584 - videoSize = CameraParamUtil.getInstance().getPreviewSize(mParams.getSupportedVideoSizes(), 600,  
585 - screenProp);  
586 - }  
587 - Log.i(TAG, "setVideoSize width = " + videoSize.width + "height = " + videoSize.height);  
588 - if (videoSize.width == videoSize.height) {  
589 - mediaRecorder.setVideoSize(preview_width, preview_height);  
590 - } else {  
591 - mediaRecorder.setVideoSize(videoSize.width, videoSize.height);  
592 - }  
593 -// if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) {  
594 -// mediaRecorder.setOrientationHint(270);  
595 -// } else {  
596 -// mediaRecorder.setOrientationHint(nowAngle);  
597 -//// mediaRecorder.setOrientationHint(90);  
598 -// }  
599 -  
600 - if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) {  
601 - //手机预览倒立的处理  
602 - if (cameraAngle == 270) {  
603 - //横屏  
604 - if (nowAngle == 0) {  
605 - mediaRecorder.setOrientationHint(180);  
606 - } else if (nowAngle == 270) {  
607 - mediaRecorder.setOrientationHint(270);  
608 - } else {  
609 - mediaRecorder.setOrientationHint(90);  
610 - }  
611 - } else {  
612 - if (nowAngle == 90) {  
613 - mediaRecorder.setOrientationHint(270);  
614 - } else if (nowAngle == 270) {  
615 - mediaRecorder.setOrientationHint(90);  
616 - } else {  
617 - mediaRecorder.setOrientationHint(nowAngle);  
618 - }  
619 - }  
620 - } else {  
621 - mediaRecorder.setOrientationHint(nowAngle);  
622 - }  
623 -  
624 -  
625 - if (DeviceUtil.isHuaWeiRongyao()) {  
626 - mediaRecorder.setVideoEncodingBitRate(4 * 100000);  
627 - } else {  
628 - mediaRecorder.setVideoEncodingBitRate(mediaQuality);  
629 - }  
630 - mediaRecorder.setPreviewDisplay(surface);  
631 -  
632 - videoFileName = "video_" + System.currentTimeMillis() + ".mp4";  
633 - if (saveVideoPath.equals("")) {  
634 - saveVideoPath = (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q ?context.getExternalFilesDir("") : Environment.getExternalStorageDirectory()).getPath();  
635 - }  
636 - videoFileAbsPath = saveVideoPath + File.separator + videoFileName;  
637 - mediaRecorder.setOutputFile(videoFileAbsPath);  
638 -  
639 - mediaRecorder.prepare();  
640 - mediaRecorder.start();  
641 - isRecorder = true;  
642 - return true;  
643 - } catch (IllegalStateException e) {  
644 - e.printStackTrace();  
645 - Log.i("CJT", "startRecord IllegalStateException");  
646 - if (this.errorLisenter != null) {  
647 - this.errorLisenter.onError();  
648 - }  
649 - } catch (IOException e) {  
650 - e.printStackTrace();  
651 - Log.i("CJT", "startRecord IOException");  
652 - if (this.errorLisenter != null) {  
653 - this.errorLisenter.onError();  
654 - }  
655 - } catch (RuntimeException e) {  
656 - Log.i("CJT", "startRecord RuntimeException");  
657 - } catch (Exception e) {  
658 - Log.i("CJT", "startRecord Exception");  
659 - }  
660 - return false;  
661 - }  
662 -  
663 - public void onDestroy() {  
664 - if (isRecorder) {  
665 - return;  
666 - }  
667 - if (mediaRecorder != null) {  
668 - mediaRecorder.setOnErrorListener(null);  
669 - mediaRecorder.setOnInfoListener(null);  
670 - mediaRecorder.setPreviewDisplay(null);  
671 - try {  
672 - mediaRecorder.stop();  
673 - } catch (RuntimeException e) {  
674 - e.printStackTrace();  
675 - mediaRecorder = null;  
676 - mediaRecorder = new MediaRecorder();  
677 - } finally {  
678 - if (mediaRecorder != null) mediaRecorder.release();  
679 - mediaRecorder = null;  
680 - isRecorder = false;  
681 - }  
682 - }  
683 - doStopPreview();  
684 - }  
685 -  
686 - //停止录像  
687 - public void stopRecord(boolean isShort, StopRecordCallback callback) {  
688 - if (!isRecorder) {  
689 - return;  
690 - }  
691 - if (mediaRecorder != null) {  
692 - mediaRecorder.setOnErrorListener(null);  
693 - mediaRecorder.setOnInfoListener(null);  
694 - mediaRecorder.setPreviewDisplay(null);  
695 - try {  
696 - mediaRecorder.stop();  
697 - } catch (RuntimeException e) {  
698 - e.printStackTrace();  
699 - mediaRecorder = null;  
700 - mediaRecorder = new MediaRecorder();  
701 - } finally {  
702 - if (mediaRecorder != null) {  
703 - mediaRecorder.release();  
704 - }  
705 - mediaRecorder = null;  
706 - isRecorder = false;  
707 - }  
708 - if (isShort) {  
709 - if (FileUtil.deleteFile(videoFileAbsPath)) {  
710 - callback.recordResult(null);  
711 - }  
712 - return;  
713 - }  
714 - doStopPreview();  
715 - String fileName = saveVideoPath + File.separator + videoFileName;  
716 - callback.recordResult(fileName);  
717 - }  
718 - }  
719 -  
720 - private void findAvailableCameras() {  
721 - Camera.CameraInfo info = new Camera.CameraInfo();  
722 - int cameraNum = Camera.getNumberOfCameras();  
723 - for (int i = 0; i < cameraNum; i++) {  
724 - //TODO 存在异常隐患  
725 - try {  
726 - Camera.getCameraInfo(i, info);  
727 - } catch (Exception e) {  
728 - Log.e("CameraInterface", "相机信息获取异常", e);  
729 - continue;  
730 - }  
731 - switch (info.facing) {  
732 - case Camera.CameraInfo.CAMERA_FACING_FRONT:  
733 - CAMERA_FRONT_POSITION = info.facing;  
734 - break;  
735 - case Camera.CameraInfo.CAMERA_FACING_BACK:  
736 - CAMERA_POST_POSITION = info.facing;  
737 - break;  
738 - }  
739 - }  
740 - }  
741 -  
742 - private int handlerTime = 0;  
743 -  
744 - public boolean handleFocus(final Context context, final float x, final float y, final FocusCallback callback) {  
745 - if (mCamera == null) {  
746 - return false;  
747 - }  
748 - try {  
749 - final Camera.Parameters params = mCamera.getParameters();  
750 - Rect focusRect = calculateTapArea(x, y, 1f, context);  
751 - mCamera.cancelAutoFocus();  
752 - if (params.getMaxNumFocusAreas() > 0) {  
753 - List<Camera.Area> focusAreas = new ArrayList<>();  
754 - focusAreas.add(new Camera.Area(focusRect, 800));  
755 - params.setFocusAreas(focusAreas);  
756 - } else {  
757 - Log.i(TAG, "focus areas not supported");  
758 - callback.focusSuccess();  
759 - return false;  
760 - }  
761 - final String currentFocusMode = params.getFocusMode();  
762 -  
763 - params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);  
764 - mCamera.setParameters(params);  
765 - mCamera.autoFocus(new Camera.AutoFocusCallback() {  
766 - @Override  
767 - public void onAutoFocus(boolean success, Camera camera) {  
768 - if (success || handlerTime > 10) {  
769 - Camera.Parameters params = camera.getParameters();  
770 - params.setFocusMode(currentFocusMode);  
771 - camera.setParameters(params);  
772 - handlerTime = 0;  
773 - callback.focusSuccess();  
774 - } else {  
775 - handlerTime++;  
776 - handleFocus(context, x, y, callback);  
777 - }  
778 - }  
779 - });  
780 - return true;  
781 - } catch (Exception e) {  
782 - Log.e(TAG, "autoFocus failer");  
783 - }  
784 - return false;  
785 - }  
786 -  
787 -  
788 - private static Rect calculateTapArea(float x, float y, float coefficient, Context context) {  
789 - float focusAreaSize = 300;  
790 - int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();  
791 - int centerX = (int) (x / ScreenUtils.getScreenWidth(context) * 2000 - 1000);  
792 - int centerY = (int) (y / ScreenUtils.getScreenHeight(context) * 2000 - 1000);  
793 - int left = clamp(centerX - areaSize / 2, -1000, 1000);  
794 - int top = clamp(centerY - areaSize / 2, -1000, 1000);  
795 - RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);  
796 - return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF  
797 - .bottom));  
798 - }  
799 -  
800 - private static int clamp(int x, int min, int max) {  
801 - if (x > max) {  
802 - return max;  
803 - }  
804 - if (x < min) {  
805 - return min;  
806 - }  
807 - return x;  
808 - }  
809 -  
810 - void setErrorLinsenter(ErrorListener errorLisenter) {  
811 - this.errorLisenter = errorLisenter;  
812 - }  
813 -  
814 -  
815 - public interface StopRecordCallback {  
816 - void recordResult(String url);  
817 - }  
818 -  
819 - interface ErrorCallback {  
820 - void onError();  
821 - }  
822 -  
823 - public interface TakePictureCallback {  
824 - void captureResult(Bitmap bitmap, boolean isVertical);  
825 - }  
826 -  
827 - public interface FocusCallback {  
828 - void focusSuccess();  
829 -  
830 - }  
831 -  
832 -  
833 - void registerSensorManager(Context context) {  
834 - SensorManager sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);  
835 - if (sm == null) return;  
836 - Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);  
837 - sm.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL);  
838 - }  
839 -  
840 - void unregisterSensorManager(Context context) {  
841 - SensorManager sm = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);  
842 - if (sm == null) return;  
843 - sm.unregisterListener(sensorEventListener);  
844 - }  
845 -  
846 - void isPreview(boolean res) {  
847 - this.isPreviewing = res;  
848 - }  
849 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/CaptureButton.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary;  
2 -  
3 -import android.animation.Animator;  
4 -import android.animation.AnimatorListenerAdapter;  
5 -import android.animation.AnimatorSet;  
6 -import android.animation.ValueAnimator;  
7 -import android.content.Context;  
8 -import android.graphics.Canvas;  
9 -import android.graphics.Color;  
10 -import android.graphics.Paint;  
11 -import android.graphics.RectF;  
12 -import android.os.CountDownTimer;  
13 -import android.view.MotionEvent;  
14 -import android.view.View;  
15 -  
16 -import com.cjt2325.cameralibrary.listener.CaptureListener;  
17 -import com.cjt2325.cameralibrary.util.CheckPermission;  
18 -import com.cjt2325.cameralibrary.util.LogUtil;  
19 -  
20 -import static com.cjt2325.cameralibrary.JCameraView.BUTTON_STATE_BOTH;  
21 -import static com.cjt2325.cameralibrary.JCameraView.BUTTON_STATE_ONLY_CAPTURE;  
22 -import static com.cjt2325.cameralibrary.JCameraView.BUTTON_STATE_ONLY_RECORDER;  
23 -  
24 -  
25 -/**  
26 - * =====================================  
27 - * 作 者: 陈嘉桐 445263848@qq.com  
28 - * 版 本:1.1.4  
29 - * 创建日期:2017/4/25  
30 - * 描 述:拍照按钮  
31 - * =====================================  
32 - */  
33 -public class CaptureButton extends View {  
34 -  
35 - private int state; //当前按钮状态  
36 - private int button_state; //按钮可执行的功能状态(拍照,录制,两者)  
37 -  
38 - public static final int STATE_IDLE = 0x001; //空闲状态  
39 - public static final int STATE_PRESS = 0x002; //按下状态  
40 - public static final int STATE_LONG_PRESS = 0x003; //长按状态  
41 - public static final int STATE_RECORDERING = 0x004; //录制状态  
42 - public static final int STATE_BAN = 0x005; //禁止状态  
43 -  
44 - private int progress_color = Color.GREEN; //进度条颜色  
45 - private int outside_color = 0xEEf2f2f2; //外圆背景色  
46 - private int inside_color = Color.WHITE; //内圆背景色  
47 -  
48 -  
49 - private float event_Y; //Touch_Event_Down时候记录的Y值  
50 -  
51 -  
52 - private Paint mPaint;  
53 -  
54 - private float strokeWidth; //进度条宽度  
55 - private int outside_add_size; //长按外圆半径变大的Size  
56 - private int inside_reduce_size; //长安内圆缩小的Size  
57 -  
58 - //中心坐标  
59 - private float center_X;  
60 - private float center_Y;  
61 -  
62 - private float button_radius; //按钮半径  
63 - private float button_outside_radius; //外圆半径  
64 - private float button_inside_radius; //内圆半径  
65 - private int button_size; //按钮大小  
66 -  
67 - private float progress; //录制视频的进度  
68 - private int duration; //录制视频最大时间长度  
69 - private int min_duration; //最短录制时间限制  
70 - private int recorded_time; //记录当前录制的时间  
71 -  
72 - private RectF rectF;  
73 -  
74 - private LongPressRunnable longPressRunnable; //长按后处理的逻辑Runnable  
75 - private CaptureListener captureLisenter; //按钮回调接口  
76 - private RecordCountDownTimer timer; //计时器  
77 -  
78 - public CaptureButton(Context context) {  
79 - super(context);  
80 - }  
81 -  
82 - public CaptureButton(Context context, int size) {  
83 - super(context);  
84 - this.button_size = size;  
85 - button_radius = size / 2.0f;  
86 -  
87 - button_outside_radius = button_radius;  
88 - button_inside_radius = button_radius * 0.75f;  
89 -  
90 - strokeWidth = size / 15;  
91 - outside_add_size = size / 5;  
92 - inside_reduce_size = size / 8;  
93 -  
94 - mPaint = new Paint();  
95 - mPaint.setAntiAlias(true);  
96 -  
97 - progress = 0;  
98 - longPressRunnable = new LongPressRunnable();  
99 -  
100 - state = STATE_IDLE; //初始化为空闲状态  
101 - LogUtil.i("CaptureButtom start");  
102 - duration = 10 * 1000; //默认最长录制时间为10s  
103 - LogUtil.i("CaptureButtom end");  
104 - min_duration = 2000; //默认最短录制时间为1.5s  
105 -  
106 - center_X = (button_size + outside_add_size * 2) / 2;  
107 - center_Y = (button_size + outside_add_size * 2) / 2;  
108 -  
109 - rectF = new RectF(  
110 - center_X - (button_radius + outside_add_size - strokeWidth / 2),  
111 - center_Y - (button_radius + outside_add_size - strokeWidth / 2),  
112 - center_X + (button_radius + outside_add_size - strokeWidth / 2),  
113 - center_Y + (button_radius + outside_add_size - strokeWidth / 2));  
114 -  
115 - timer = new RecordCountDownTimer(duration, duration / 360); //录制定时器  
116 - }  
117 -  
118 - @Override  
119 - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
120 - super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
121 - setMeasuredDimension(button_size + outside_add_size * 2, button_size + outside_add_size * 2);  
122 - }  
123 -  
124 - @Override  
125 - protected void onDraw(Canvas canvas) {  
126 - super.onDraw(canvas);  
127 - mPaint.setStyle(Paint.Style.FILL);  
128 -  
129 - mPaint.setColor(outside_color); //外圆(半透明灰色)  
130 - canvas.drawCircle(center_X, center_Y, button_outside_radius, mPaint);  
131 -  
132 - mPaint.setColor(inside_color); //内圆(白色)  
133 - canvas.drawCircle(center_X, center_Y, button_inside_radius, mPaint);  
134 -  
135 - //如果状态为录制状态,则绘制录制进度条  
136 - if (state == STATE_RECORDERING) {  
137 - mPaint.setColor(progress_color);  
138 - mPaint.setStyle(Paint.Style.STROKE);  
139 - mPaint.setStrokeWidth(strokeWidth);  
140 - canvas.drawArc(rectF, -90, progress, false, mPaint);  
141 - }  
142 - }  
143 -  
144 -  
145 - @Override  
146 - public boolean onTouchEvent(MotionEvent event) {  
147 - switch (event.getAction()) {  
148 - case MotionEvent.ACTION_DOWN:  
149 - LogUtil.i("state = " + state);  
150 - if (event.getPointerCount() > 1 || state != STATE_IDLE)  
151 - break;  
152 - event_Y = event.getY(); //记录Y值  
153 - state = STATE_PRESS; //修改当前状态为点击按下  
154 -  
155 - //判断按钮状态是否为可录制状态  
156 - if ((button_state == BUTTON_STATE_ONLY_RECORDER || button_state == BUTTON_STATE_BOTH))  
157 - postDelayed(longPressRunnable, 200); //同时延长500启动长按后处理的逻辑Runnable  
158 - break;  
159 - case MotionEvent.ACTION_MOVE:  
160 - if (captureLisenter != null  
161 - && state == STATE_RECORDERING  
162 - && (button_state == BUTTON_STATE_ONLY_RECORDER || button_state == BUTTON_STATE_BOTH)) {  
163 - //记录当前Y值与按下时候Y值的差值,调用缩放回调接口  
164 - captureLisenter.recordZoom(event_Y - event.getY());  
165 - }  
166 - break;  
167 - case MotionEvent.ACTION_UP:  
168 - //根据当前按钮的状态进行相应的处理  
169 - handlerUnpressByState();  
170 - break;  
171 - }  
172 - return true;  
173 - }  
174 -  
175 - //当手指松开按钮时候处理的逻辑  
176 - private void handlerUnpressByState() {  
177 - removeCallbacks(longPressRunnable); //移除长按逻辑的Runnable  
178 - //根据当前状态处理  
179 - switch (state) {  
180 - //当前是点击按下  
181 - case STATE_PRESS:  
182 - if (captureLisenter != null && (button_state == BUTTON_STATE_ONLY_CAPTURE || button_state ==  
183 - BUTTON_STATE_BOTH)) {  
184 - startCaptureAnimation(button_inside_radius);  
185 - } else {  
186 - state = STATE_IDLE;  
187 - }  
188 - break;  
189 - //当前是长按状态  
190 - case STATE_RECORDERING:  
191 - timer.cancel(); //停止计时器  
192 - recordEnd(); //录制结束  
193 - break;  
194 - }  
195 - }  
196 -  
197 - //录制结束  
198 - private void recordEnd() {  
199 - if (captureLisenter != null) {  
200 - if (recorded_time < min_duration)  
201 - captureLisenter.recordShort(recorded_time);//回调录制时间过短  
202 - else  
203 - captureLisenter.recordEnd(recorded_time); //回调录制结束  
204 - }  
205 - resetRecordAnim(); //重制按钮状态  
206 - }  
207 -  
208 - //重制状态  
209 - public void resetRecordAnim() {  
210 - state = STATE_BAN;  
211 - progress = 0; //重制进度  
212 - invalidate();  
213 - //还原按钮初始状态动画  
214 - startRecordAnimation(  
215 - button_outside_radius,  
216 - button_radius,  
217 - button_inside_radius,  
218 - button_radius * 0.75f  
219 - );  
220 - }  
221 -  
222 - //内圆动画  
223 - private void startCaptureAnimation(float inside_start) {  
224 - ValueAnimator inside_anim = ValueAnimator.ofFloat(inside_start, inside_start * 0.75f, inside_start);  
225 - inside_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
226 - @Override  
227 - public void onAnimationUpdate(ValueAnimator animation) {  
228 - button_inside_radius = (float) animation.getAnimatedValue();  
229 - invalidate();  
230 - }  
231 - });  
232 - inside_anim.addListener(new AnimatorListenerAdapter() {  
233 - @Override  
234 - public void onAnimationEnd(Animator animation) {  
235 - super.onAnimationEnd(animation);  
236 - //回调拍照接口  
237 - captureLisenter.takePictures();  
238 - state = STATE_BAN;  
239 - }  
240 - });  
241 - inside_anim.setDuration(100);  
242 - inside_anim.start();  
243 - }  
244 -  
245 - //内外圆动画  
246 - private void startRecordAnimation(float outside_start, float outside_end, float inside_start, float inside_end) {  
247 - ValueAnimator outside_anim = ValueAnimator.ofFloat(outside_start, outside_end);  
248 - ValueAnimator inside_anim = ValueAnimator.ofFloat(inside_start, inside_end);  
249 - //外圆动画监听  
250 - outside_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
251 - @Override  
252 - public void onAnimationUpdate(ValueAnimator animation) {  
253 - button_outside_radius = (float) animation.getAnimatedValue();  
254 - invalidate();  
255 - }  
256 - });  
257 - //内圆动画监听  
258 - inside_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
259 - @Override  
260 - public void onAnimationUpdate(ValueAnimator animation) {  
261 - button_inside_radius = (float) animation.getAnimatedValue();  
262 - invalidate();  
263 - }  
264 - });  
265 - AnimatorSet set = new AnimatorSet();  
266 - //当动画结束后启动录像Runnable并且回调录像开始接口  
267 - set.addListener(new AnimatorListenerAdapter() {  
268 - @Override  
269 - public void onAnimationEnd(Animator animation) {  
270 - super.onAnimationEnd(animation);  
271 - //设置为录制状态  
272 - if (state == STATE_LONG_PRESS) {  
273 - if (captureLisenter != null)  
274 - captureLisenter.recordStart();  
275 - state = STATE_RECORDERING;  
276 - timer.start();  
277 - }  
278 - }  
279 - });  
280 - set.playTogether(outside_anim, inside_anim);  
281 - set.setDuration(0);  
282 - set.start();  
283 - }  
284 -  
285 -  
286 - //更新进度条  
287 - private void updateProgress(long millisUntilFinished) {  
288 - recorded_time = (int) (duration - millisUntilFinished);  
289 - progress = 360f - millisUntilFinished / (float) duration * 360f;  
290 - invalidate();  
291 - }  
292 -  
293 - //录制视频计时器  
294 - private class RecordCountDownTimer extends CountDownTimer {  
295 - RecordCountDownTimer(long millisInFuture, long countDownInterval) {  
296 - super(millisInFuture, countDownInterval);  
297 - }  
298 -  
299 - @Override  
300 - public void onTick(long millisUntilFinished) {  
301 - updateProgress(millisUntilFinished);  
302 - }  
303 -  
304 - @Override  
305 - public void onFinish() {  
306 - updateProgress(0);  
307 - recordEnd();  
308 - }  
309 - }  
310 -  
311 - //长按线程  
312 - private class LongPressRunnable implements Runnable {  
313 - @Override  
314 - public void run() {  
315 - state = STATE_LONG_PRESS; //如果按下后经过500毫秒则会修改当前状态为长按状态  
316 - //没有录制权限  
317 - if (CheckPermission.getRecordState() != CheckPermission.STATE_SUCCESS) {  
318 - state = STATE_IDLE;  
319 - if (captureLisenter != null) {  
320 - captureLisenter.recordError();  
321 - return;  
322 - }  
323 - }  
324 - //启动按钮动画,外圆变大,内圆缩小  
325 - startRecordAnimation(  
326 - button_outside_radius,  
327 - button_outside_radius + outside_add_size,  
328 - button_inside_radius,  
329 - button_inside_radius - inside_reduce_size  
330 - );  
331 - }  
332 - }  
333 -  
334 - /**************************************************  
335 - * 对外提供的API *  
336 - **************************************************/  
337 -  
338 - //设置最长录制时间  
339 - public void setDuration(int duration) {  
340 - this.duration = duration;  
341 - timer = new RecordCountDownTimer(duration, duration / 360); //录制定时器  
342 - }  
343 -  
344 - //设置最短录制时间  
345 - public void setMinDuration(int duration) {  
346 - this.min_duration = duration;  
347 - }  
348 -  
349 - //设置回调接口  
350 - public void setCaptureLisenter(CaptureListener captureLisenter) {  
351 - this.captureLisenter = captureLisenter;  
352 - }  
353 -  
354 - //设置按钮功能(拍照和录像)  
355 - public void setButtonFeatures(int state) {  
356 - this.button_state = state;  
357 - }  
358 -  
359 - //是否空闲状态  
360 - public boolean isIdle() {  
361 - return state == STATE_IDLE ? true : false;  
362 - }  
363 -  
364 - //设置状态  
365 - public void resetState() {  
366 - state = STATE_IDLE;  
367 - }  
368 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/CaptureLayout.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary;  
2 -  
3 -import android.animation.Animator;  
4 -import android.animation.AnimatorListenerAdapter;  
5 -import android.animation.AnimatorSet;  
6 -import android.animation.ObjectAnimator;  
7 -import android.content.Context;  
8 -import android.content.res.Configuration;  
9 -import android.content.res.Resources;  
10 -import android.util.AttributeSet;  
11 -import android.view.Gravity;  
12 -import android.view.View;  
13 -import android.widget.FrameLayout;  
14 -import android.widget.ImageView;  
15 -import android.widget.TextView;  
16 -  
17 -import com.cjt2325.cameralibrary.listener.CaptureListener;  
18 -import com.cjt2325.cameralibrary.listener.ClickListener;  
19 -import com.cjt2325.cameralibrary.listener.ReturnListener;  
20 -import com.cjt2325.cameralibrary.listener.TypeListener;  
21 -  
22 -import static com.cjt2325.cameralibrary.JCameraView.BUTTON_STATE_BOTH;  
23 -import static com.cjt2325.cameralibrary.JCameraView.BUTTON_STATE_ONLY_CAPTURE;  
24 -import static com.cjt2325.cameralibrary.JCameraView.BUTTON_STATE_ONLY_RECORDER;  
25 -  
26 -/**  
27 - * =====================================  
28 - * 作 者: 陈嘉桐 445263848@qq.com  
29 - * 版 本:1.0.4  
30 - * 创建日期:2017/4/26  
31 - * 描 述:集成各个控件的布局  
32 - * =====================================  
33 - */  
34 -  
35 -public class CaptureLayout extends FrameLayout {  
36 - private boolean isErrorState = false;  
37 - private CaptureListener captureLisenter; //拍照按钮监听  
38 - private TypeListener typeLisenter; //拍照或录制后接结果按钮监听  
39 - private ReturnListener returnListener; //退出按钮监听  
40 - private ClickListener leftClickListener; //左边按钮监听  
41 - private ClickListener rightClickListener; //右边按钮监听  
42 -  
43 - public void setTypeLisenter(TypeListener typeLisenter) {  
44 - this.typeLisenter = typeLisenter;  
45 - }  
46 -  
47 - public void setCaptureLisenter(CaptureListener captureLisenter) {  
48 - this.captureLisenter = captureLisenter;  
49 - }  
50 -  
51 - public void setReturnLisenter(ReturnListener returnListener) {  
52 - this.returnListener = returnListener;  
53 - }  
54 -  
55 - private CaptureButton btn_capture; //拍照按钮  
56 - private TypeButton btn_confirm; //确认按钮  
57 - private TypeButton btn_cancel; //取消按钮  
58 - private ReturnButton btn_return; //返回按钮  
59 - private ImageView iv_custom_left; //左边自定义按钮  
60 - private ImageView iv_custom_right; //右边自定义按钮  
61 - private TextView txt_tip; //提示文本  
62 -  
63 - private int layout_width;  
64 - private int layout_height;  
65 - private int button_size;  
66 - private int iconLeft = 0;  
67 - private int iconRight = 0;  
68 -  
69 - private boolean isFirst = true;  
70 -  
71 - public CaptureLayout(Context context) {  
72 - this(context, null);  
73 - }  
74 -  
75 - public CaptureLayout(Context context, AttributeSet attrs) {  
76 - this(context, attrs, 0);  
77 - }  
78 -  
79 - public CaptureLayout(Context context, AttributeSet attrs, int defStyleAttr) {  
80 - super(context, attrs, defStyleAttr);  
81 -  
82 -  
83 - // WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
84 - // DisplayMetrics outMetrics = new DisplayMetrics();  
85 - // manager.getDefaultDisplay().getMetrics(outMetrics);  
86 - if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  
87 - layout_width = dip2px(250);  
88 - // layout_width = outMetrics.widthPixels;  
89 - } else {  
90 - layout_width = dip2px(250);  
91 - }  
92 - // button_size = (int) (layout_width / 6f);  
93 - // layout_height = button_size + (button_size / 5) * 2 + 100;  
94 - layout_height = dip2px(100);  
95 - button_size = dip2px(50);  
96 - initView();  
97 - initEvent();  
98 - }  
99 -  
100 - @Override  
101 - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
102 - super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
103 - setMeasuredDimension(layout_width, layout_height);  
104 - }  
105 -  
106 - public void initEvent() {  
107 - //默认Typebutton为隐藏  
108 - iv_custom_right.setVisibility(GONE);  
109 - btn_cancel.setVisibility(GONE);  
110 - btn_confirm.setVisibility(GONE);  
111 - }  
112 -  
113 - public void startTypeBtnAnimator() {  
114 - if (checkErrorState()) return;  
115 - //拍照录制结果后的动画  
116 - if (this.iconLeft != 0)  
117 - iv_custom_left.setVisibility(GONE);  
118 - else  
119 - btn_return.setVisibility(GONE);  
120 - if (this.iconRight != 0)  
121 - iv_custom_right.setVisibility(GONE);  
122 - btn_capture.setVisibility(GONE);  
123 - btn_cancel.setVisibility(VISIBLE);  
124 - btn_confirm.setVisibility(VISIBLE);  
125 - btn_cancel.setClickable(false);  
126 - btn_confirm.setClickable(false);  
127 - ObjectAnimator animator_cancel = ObjectAnimator.ofFloat(btn_cancel, "translationX", layout_width / 4, 0);  
128 - ObjectAnimator animator_confirm = ObjectAnimator.ofFloat(btn_confirm, "translationX", -layout_width / 4, 0);  
129 -  
130 - AnimatorSet set = new AnimatorSet();  
131 - set.playTogether(animator_cancel, animator_confirm);  
132 - set.addListener(new AnimatorListenerAdapter() {  
133 - @Override  
134 - public void onAnimationEnd(Animator animation) {  
135 - super.onAnimationEnd(animation);  
136 - btn_cancel.setClickable(true);  
137 - btn_confirm.setClickable(true);  
138 - }  
139 - });  
140 - set.setDuration(200);  
141 - set.start();  
142 - }  
143 - private void initView() {  
144 - setWillNotDraw(false);  
145 - //拍照按钮  
146 - btn_capture = new CaptureButton(getContext(), button_size);  
147 - LayoutParams btn_capture_param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
148 - btn_capture_param.gravity = Gravity.CENTER;  
149 - // btn_capture_param.setMargins(0,0,0,dip2px(-4));  
150 - btn_capture.setLayoutParams(btn_capture_param);  
151 - btn_capture.setCaptureLisenter(new CaptureListener() {  
152 - @Override  
153 - public void takePictures() {  
154 - btn_return.setClickable(false);  
155 - if (captureLisenter != null) {  
156 - captureLisenter.takePictures();  
157 - }  
158 - }  
159 -  
160 - @Override  
161 - public void recordShort(long time) {  
162 - btn_return.setClickable(true);  
163 - if (captureLisenter != null) {  
164 - captureLisenter.recordShort(time);  
165 - }  
166 - startAlphaAnimation();  
167 - }  
168 -  
169 - @Override  
170 - public void recordStart() {  
171 - btn_return.setClickable(false);  
172 - if (captureLisenter != null) {  
173 - captureLisenter.recordStart();  
174 - }  
175 - startAlphaAnimation();  
176 - }  
177 -  
178 - @Override  
179 - public void recordEnd(long time) {  
180 - if (captureLisenter != null) {  
181 - captureLisenter.recordEnd(time);  
182 - }  
183 - startAlphaAnimation();  
184 - startTypeBtnAnimator();  
185 - }  
186 -  
187 - @Override  
188 - public void recordZoom(float zoom) {  
189 - if (captureLisenter != null) {  
190 - captureLisenter.recordZoom(zoom);  
191 - }  
192 - }  
193 -  
194 - @Override  
195 - public void recordError() {  
196 - if (captureLisenter != null) {  
197 - captureLisenter.recordError();  
198 - }  
199 - }  
200 - });  
201 -  
202 - //取消按钮  
203 - btn_cancel = new TypeButton(getContext(), TypeButton.TYPE_CANCEL, button_size);  
204 - final LayoutParams btn_cancel_param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
205 - btn_cancel_param.gravity = Gravity.CENTER_VERTICAL;  
206 - btn_cancel_param.setMargins(dip2px(200), 0, 0, 0);  
207 - btn_cancel.setLayoutParams(btn_cancel_param);  
208 - btn_cancel.setOnClickListener(new OnClickListener() {  
209 - @Override  
210 - public void onClick(View view) {  
211 - if (typeLisenter != null) {  
212 - typeLisenter.cancel();  
213 - }  
214 - startAlphaAnimation();  
215 -// resetCaptureLayout();  
216 - }  
217 - });  
218 -  
219 - //确认按钮  
220 - btn_confirm = new TypeButton(getContext(), TypeButton.TYPE_CONFIRM, button_size);  
221 - LayoutParams btn_confirm_param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
222 - btn_confirm_param.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT;  
223 - btn_confirm_param.setMargins(0, 0, dip2px(200), 0);  
224 - btn_confirm.setLayoutParams(btn_confirm_param);  
225 - btn_confirm.setOnClickListener(new OnClickListener() {  
226 - @Override  
227 - public void onClick(View view) {  
228 - if (typeLisenter != null) {  
229 - typeLisenter.confirm();  
230 - }  
231 - startAlphaAnimation();  
232 -// resetCaptureLayout();  
233 - }  
234 - });  
235 -  
236 - //返回按钮  
237 - btn_return = new ReturnButton(getContext(), (int) (button_size / 2.5f));  
238 - btn_return.setPadding(5,5,5,5);  
239 - LayoutParams btn_return_param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
240 - btn_return_param.gravity = Gravity.CENTER_VERTICAL;  
241 - btn_cancel_param.height = 100;  
242 - btn_cancel_param.width = 100;  
243 - btn_return_param.setMargins(layout_width / 6, 0, 0, dip2px(-4));  
244 - btn_return.setLayoutParams(btn_return_param);  
245 - btn_return.setOnClickListener(new OnClickListener() {  
246 - @Override  
247 - public void onClick(View v) {  
248 - if (leftClickListener != null) {  
249 - leftClickListener.onClick();  
250 - }  
251 - }  
252 - });  
253 - //左边自定义按钮  
254 - iv_custom_left = new ImageView(getContext());  
255 - LayoutParams iv_custom_param_left = new LayoutParams((int) (button_size / 2.5f), (int) (button_size / 2.5f));  
256 - iv_custom_param_left.gravity = Gravity.CENTER_VERTICAL;  
257 - iv_custom_param_left.setMargins(layout_width / 6, 0, 0, 0);  
258 - iv_custom_left.setLayoutParams(iv_custom_param_left);  
259 - iv_custom_left.setOnClickListener(new OnClickListener() {  
260 - @Override  
261 - public void onClick(View v) {  
262 - if (leftClickListener != null) {  
263 - leftClickListener.onClick();  
264 - }  
265 - }  
266 - });  
267 -  
268 - //右边自定义按钮  
269 - iv_custom_right = new ImageView(getContext());  
270 - LayoutParams iv_custom_param_right = new LayoutParams((int) (button_size / 2.5f), (int) (button_size / 2.5f));  
271 - iv_custom_param_right.gravity = Gravity.CENTER_VERTICAL | Gravity.RIGHT;  
272 - iv_custom_param_right.setMargins(0, 0, layout_width / 6, 0);  
273 - iv_custom_right.setLayoutParams(iv_custom_param_right);  
274 - iv_custom_right.setOnClickListener(new OnClickListener() {  
275 - @Override  
276 - public void onClick(View v) {  
277 - if (rightClickListener != null) {  
278 - rightClickListener.onClick();  
279 - }  
280 - }  
281 - });  
282 -  
283 - txt_tip = new TextView(getContext());  
284 - LayoutParams txt_param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  
285 - txt_param.gravity = Gravity.CENTER_HORIZONTAL;  
286 - txt_param.setMargins(0, 0, 0, 0);  
287 - txt_tip.setPadding(0, 0, 0, 50);  
288 - txt_tip.setTextColor(0xFFFFFFFF);  
289 - txt_tip.setGravity(Gravity.CENTER);  
290 - txt_tip.setLayoutParams(txt_param);  
291 -  
292 - this.addView(btn_capture);  
293 - this.addView(btn_cancel);  
294 - this.addView(btn_confirm);  
295 - this.addView(btn_return);  
296 - this.addView(iv_custom_left);  
297 - this.addView(iv_custom_right);  
298 - this.addView(txt_tip);  
299 - }  
300 -  
301 - public static int dip2px(float dipValue) {  
302 - float scale = Resources.getSystem().getDisplayMetrics().density;  
303 - return (int) (dipValue * scale + 0.5F);  
304 - }  
305 -  
306 -  
307 - /**************************************************  
308 - * 对外提供的API *  
309 - **************************************************/  
310 - public void resetCaptureLayout() {  
311 - btn_capture.resetRecordAnim();  
312 - btn_capture.resetState();  
313 - btn_cancel.setVisibility(GONE);  
314 - btn_confirm.setVisibility(GONE);  
315 - btn_capture.setVisibility(VISIBLE);  
316 - if (this.iconLeft != 0)  
317 - iv_custom_left.setVisibility(VISIBLE);  
318 - else {  
319 - btn_return.setClickable(true);  
320 - btn_return.setVisibility(VISIBLE);  
321 - }  
322 - if (this.iconRight != 0)  
323 - iv_custom_right.setVisibility(VISIBLE);  
324 - }  
325 -  
326 - private boolean checkErrorState() {  
327 - if (isErrorState) {  
328 - isErrorState = false;  
329 - return true;  
330 - }  
331 - return false;  
332 - }  
333 -  
334 - public void onError() {  
335 - onError(false);  
336 - }  
337 -  
338 - public void onError(boolean state) {  
339 - isErrorState = state;  
340 - btn_return.setClickable(true);  
341 - }  
342 -  
343 - public void startAlphaAnimation() {  
344 - if (isFirst) {  
345 - ObjectAnimator animator_txt_tip = ObjectAnimator.ofFloat(txt_tip, "alpha", 1f, 0f);  
346 - animator_txt_tip.setDuration(500);  
347 - animator_txt_tip.start();  
348 - isFirst = false;  
349 - }  
350 - }  
351 -  
352 - public void setTextWithAnimation(String tip) {  
353 - txt_tip.setText(tip);  
354 - ObjectAnimator animator_txt_tip = ObjectAnimator.ofFloat(txt_tip, "alpha", 0f, 1f, 1f, 0f);  
355 - animator_txt_tip.setDuration(2500);  
356 - animator_txt_tip.start();  
357 - }  
358 -  
359 - public void setDuration(int duration) {  
360 - btn_capture.setDuration(duration);  
361 - }  
362 -  
363 - public void setButtonFeatures(int state) {  
364 - if (state == BUTTON_STATE_BOTH) {  
365 - txt_tip.setText("轻触拍照,长按摄像");  
366 - } else if (state == BUTTON_STATE_ONLY_CAPTURE) {  
367 - txt_tip.setText("轻触拍照");  
368 - } else if (state == BUTTON_STATE_ONLY_RECORDER) {  
369 - txt_tip.setText("长按摄像");  
370 - }  
371 - btn_capture.setButtonFeatures(state);  
372 - }  
373 -  
374 - public void setTip(String tip) {  
375 - txt_tip.setText(tip);  
376 - }  
377 -  
378 - public void showTip() {  
379 - txt_tip.setVisibility(VISIBLE);  
380 - }  
381 -  
382 - public void setIconSrc(int iconLeft, int iconRight) {  
383 - this.iconLeft = iconLeft;  
384 - this.iconRight = iconRight;  
385 - if (this.iconLeft != 0) {  
386 - iv_custom_left.setImageResource(iconLeft);  
387 - iv_custom_left.setVisibility(VISIBLE);  
388 - btn_return.setVisibility(GONE);  
389 - } else {  
390 - iv_custom_left.setVisibility(GONE);  
391 - btn_return.setClickable(true);  
392 - btn_return.setVisibility(VISIBLE);  
393 - }  
394 - if (this.iconRight != 0) {  
395 - iv_custom_right.setImageResource(iconRight);  
396 - iv_custom_right.setVisibility(VISIBLE);  
397 - } else {  
398 - iv_custom_right.setVisibility(GONE);  
399 - }  
400 - }  
401 -  
402 - public void setLeftClickListener(ClickListener leftClickListener) {  
403 - this.leftClickListener = leftClickListener;  
404 - }  
405 -  
406 - public void setRightClickListener(ClickListener rightClickListener) {  
407 - this.rightClickListener = rightClickListener;  
408 - }  
409 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/FoucsView.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary;  
2 -  
3 -import android.content.Context;  
4 -import android.graphics.Canvas;  
5 -import android.graphics.Paint;  
6 -import android.util.AttributeSet;  
7 -import android.view.View;  
8 -  
9 -import androidx.annotation.Nullable;  
10 -  
11 -import com.cjt2325.cameralibrary.util.ScreenUtils;  
12 -  
13 -/**  
14 - * =====================================  
15 - * 作 者: 陈嘉桐  
16 - * 版 本:1.1.4  
17 - * 创建日期:2017/4/26  
18 - * 描 述:对焦框  
19 - * =====================================  
20 - */  
21 -public class FoucsView extends View {  
22 - private int size;  
23 - private int center_x;  
24 - private int center_y;  
25 - private int length;  
26 - private Paint mPaint;  
27 -  
28 - public FoucsView(Context context) {  
29 - this(context, null);  
30 - }  
31 -  
32 - public FoucsView(Context context, @Nullable AttributeSet attrs) {  
33 - this(context, attrs, 0);  
34 - }  
35 -  
36 - public FoucsView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {  
37 - super(context, attrs, defStyleAttr);  
38 - this.size = ScreenUtils.getScreenWidth(context) / 4;  
39 - mPaint = new Paint();  
40 - mPaint.setAntiAlias(true);  
41 - mPaint.setDither(true);  
42 - mPaint.setColor(0xEE16AE16);  
43 - mPaint.setStrokeWidth(4);  
44 - mPaint.setStyle(Paint.Style.STROKE);  
45 - }  
46 -  
47 - @Override  
48 - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
49 - super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
50 - center_x = (int) (size / 2.0);  
51 - center_y = (int) (size / 2.0);  
52 - length = (int) (size / 2.0) - 2;  
53 - setMeasuredDimension(size, size);  
54 - }  
55 -  
56 - @Override  
57 - protected void onDraw(Canvas canvas) {  
58 - super.onDraw(canvas);  
59 - canvas.drawRect(center_x - length, center_y - length, center_x + length, center_y + length, mPaint);  
60 - canvas.drawLine(2, getHeight() / 2, size / 10, getHeight() / 2, mPaint);  
61 - canvas.drawLine(getWidth() - 2, getHeight() / 2, getWidth() - size / 10, getHeight() / 2, mPaint);  
62 - canvas.drawLine(getWidth() / 2, 2, getWidth() / 2, size / 10, mPaint);  
63 - canvas.drawLine(getWidth() / 2, getHeight() - 2, getWidth() / 2, getHeight() - size / 10, mPaint);  
64 - }  
65 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/JCameraView.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary;  
2 -  
3 -import android.animation.AnimatorSet;  
4 -import android.animation.ObjectAnimator;  
5 -import android.content.Context;  
6 -import android.content.res.TypedArray;  
7 -import android.graphics.Bitmap;  
8 -import android.hardware.Camera;  
9 -import android.media.AudioManager;  
10 -import android.media.MediaPlayer;  
11 -import android.os.Build;  
12 -import android.util.AttributeSet;  
13 -import android.util.Log;  
14 -import android.util.TypedValue;  
15 -import android.view.Gravity;  
16 -import android.view.LayoutInflater;  
17 -import android.view.MotionEvent;  
18 -import android.view.SurfaceHolder;  
19 -import android.view.View;  
20 -import android.view.ViewGroup;  
21 -import android.view.WindowManager;  
22 -import android.widget.FrameLayout;  
23 -import android.widget.ImageView;  
24 -import android.widget.VideoView;  
25 -  
26 -import androidx.annotation.RequiresApi;  
27 -  
28 -import com.cjt2325.cameralibrary.listener.CaptureListener;  
29 -import com.cjt2325.cameralibrary.listener.ClickListener;  
30 -import com.cjt2325.cameralibrary.listener.ErrorListener;  
31 -import com.cjt2325.cameralibrary.listener.JCameraListener;  
32 -import com.cjt2325.cameralibrary.listener.TypeListener;  
33 -import com.cjt2325.cameralibrary.state.CameraMachine;  
34 -import com.cjt2325.cameralibrary.util.FileUtil;  
35 -import com.cjt2325.cameralibrary.util.LogUtil;  
36 -import com.cjt2325.cameralibrary.util.ScreenUtils;  
37 -import com.cjt2325.cameralibrary.view.CameraView;  
38 -import com.cnlive.libs.base.util.AlertUtil;  
39 -import com.cnlive.libs.base.util.ScreenUtil;  
40 -import com.cnlive.strike.base.R;  
41 -  
42 -  
43 -/**  
44 - * =====================================  
45 - * 作 者: 陈嘉桐  
46 - * 版 本:1.0.4  
47 - * 创建日期:2017/4/25  
48 - * 描 述:  
49 - * =====================================  
50 - */  
51 -public class JCameraView extends FrameLayout implements CameraInterface.CameraOpenOverCallback, SurfaceHolder  
52 - .Callback, CameraView {  
53 -// private static final String TAG = "JCameraView";  
54 -  
55 - //Camera状态机  
56 - private CameraMachine machine;  
57 -  
58 - //闪关灯状态  
59 - // private static final int TYPE_FLASH_AUTO = 0x021;  
60 - private static final int TYPE_FLASH_ON = 0x022;  
61 - private static final int TYPE_FLASH_OFF = 0x023;  
62 - private int type_flash = TYPE_FLASH_OFF;  
63 -  
64 - //拍照浏览时候的类型  
65 - public static final int TYPE_PICTURE = 0x001;  
66 - public static final int TYPE_VIDEO = 0x002;  
67 - public static final int TYPE_SHORT = 0x003;  
68 - public static final int TYPE_DEFAULT = 0x004;  
69 -  
70 - //录制视频比特率  
71 - public static final int MEDIA_QUALITY_HIGH = 20 * 100000;  
72 - public static final int MEDIA_QUALITY_MIDDLE = 16 * 100000;  
73 - public static final int MEDIA_QUALITY_LOW = 12 * 100000;  
74 - public static final int MEDIA_QUALITY_POOR = 8 * 100000;  
75 - public static final int MEDIA_QUALITY_FUNNY = 4 * 100000;  
76 - public static final int MEDIA_QUALITY_DESPAIR = 2 * 100000;  
77 - public static final int MEDIA_QUALITY_SORRY = 1 * 80000;  
78 -  
79 -  
80 - public static final int BUTTON_STATE_ONLY_CAPTURE = 0x101; //只能拍照  
81 - public static final int BUTTON_STATE_ONLY_RECORDER = 0x102; //只能录像  
82 - public static final int BUTTON_STATE_BOTH = 0x103; //两者都可以  
83 -  
84 -  
85 - //回调监听  
86 - private JCameraListener jCameraLisenter;  
87 - private ClickListener leftClickListener;  
88 - private ClickListener rightClickListener;  
89 -  
90 - private VideoView mVideoView;  
91 - private ImageView mPhoto;  
92 - private ImageView mSwitchCamera;  
93 - private ImageView mFlashLamp;  
94 - private CaptureLayout mCaptureLayout;  
95 - private FoucsView mFoucsView;  
96 - private MediaPlayer mMediaPlayer;  
97 -  
98 - private int layout_width;  
99 - private float screenProp = 0f;  
100 -  
101 - private Bitmap captureBitmap; //捕获的图片  
102 - private String videoUrl; //视频URL  
103 -  
104 -  
105 - //切换摄像头按钮的参数  
106 - private int iconSize = 0; //图标大小  
107 - private int iconMargin = 0; //右上边距  
108 - private int iconSrc = 0; //图标资源  
109 - private int iconLeft = 0; //左图标  
110 - private int iconRight = 0; //右图标  
111 - private int duration = 0; //录制时间  
112 -  
113 - //缩放梯度  
114 - private int zoomGradient = 0;  
115 -  
116 - private boolean firstTouch = true;  
117 - private float firstTouchLength = 0;  
118 - private boolean recordEnd = false;  
119 - private long lastClick;  
120 -  
121 - public JCameraView(Context context) {  
122 - this(context, null);  
123 - }  
124 -  
125 - public JCameraView(Context context, AttributeSet attrs) {  
126 - this(context, attrs, 0);  
127 - }  
128 -  
129 - public JCameraView(Context context, AttributeSet attrs, int defStyleAttr) {  
130 - super(context, attrs, defStyleAttr);  
131 - //get AttributeSet  
132 - TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.JCameraView, defStyleAttr, 0);  
133 - iconSize = a.getDimensionPixelSize(R.styleable.JCameraView_iconSize, (int) TypedValue.applyDimension(  
134 - TypedValue.COMPLEX_UNIT_SP, 35, getResources().getDisplayMetrics()));  
135 - iconMargin = a.getDimensionPixelSize(R.styleable.JCameraView_iconMargin, (int) TypedValue.applyDimension(  
136 - TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics()));  
137 - // iconSrc = a.getResourceId(R.styleable.JCameraView_iconSrc, R.drawable.fb_xiangji);  
138 - iconLeft = a.getResourceId(R.styleable.JCameraView_iconLeft, 0);  
139 - iconRight = a.getResourceId(R.styleable.JCameraView_iconRight, 0);  
140 - duration = a.getInteger(R.styleable.JCameraView_duration_max, 10 * 1000); //没设置默认为10s  
141 - a.recycle();  
142 - initData();  
143 - initView();  
144 - }  
145 -  
146 - private void initData() {  
147 - layout_width = ScreenUtils.getScreenWidth(getContext());  
148 - //缩放梯度  
149 - zoomGradient = (int) (layout_width / 16f);  
150 - LogUtil.i("zoom = " + zoomGradient);  
151 - machine = new CameraMachine(getContext(), this, this);  
152 - }  
153 -  
154 - public int getScreenWidth() {  
155 - WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);  
156 - return wm == null ? 0 : wm.getDefaultDisplay().getWidth();  
157 - }  
158 -  
159 - private long lastClickTime = 0L;  
160 - private static final int FAST_CLICK_DELAY_TIME = 1000; // 快速点击间隔  
161 -  
162 - private void initView() {  
163 - int cameraCount = Camera.getNumberOfCameras();  
164 - setWillNotDraw(false);  
165 - int[] cid = {1};  
166 - View view = LayoutInflater.from(getContext()).inflate(R.layout.camera_view, this);  
167 - mVideoView = (VideoView) view.findViewById(R.id.video_preview);  
168 - mVideoView.setLayoutParams(new LayoutParams(getScreenWidth(), getScreenWidth() * 1920 / 1080));  
169 - mPhoto = (ImageView) view.findViewById(R.id.image_photo);  
170 - mSwitchCamera = (ImageView) view.findViewById(R.id.image_switch);  
171 - mSwitchCamera.setImageResource(R.drawable.fb_xiangji);  
172 - mFlashLamp = (ImageView) view.findViewById(R.id.image_flash);  
173 - mFlashLamp.setImageResource(R.drawable.ic_flash_off);  
174 - machine.flash(Camera.Parameters.FLASH_MODE_OFF);  
175 - if (System.currentTimeMillis() - lastClick <= 4000) {  
176 - return;  
177 - } else {  
178 - mFlashLamp.setOnClickListener(new OnClickListener() {  
179 - @Override  
180 - public void onClick(View v) {  
181 - if (CameraInterface.getInstance().getSelectedCamera() == Camera.CameraInfo.CAMERA_FACING_FRONT)  
182 - return;  
183 - type_flash++;  
184 - if (type_flash > 0x023) {  
185 - type_flash = 0x022;  
186 - }  
187 - if (type_flash == TYPE_FLASH_ON) {  
188 - mFlashLamp.setImageResource(R.drawable.ic_flash_on);  
189 - machine.flash(Camera.Parameters.FLASH_MODE_ON);  
190 - } else if (type_flash == TYPE_FLASH_OFF) {  
191 - mFlashLamp.setImageResource(R.drawable.ic_flash_off);  
192 - machine.flash(Camera.Parameters.FLASH_MODE_OFF);  
193 - } else {  
194 - AlertUtil.showDeftToast(v.getContext(), "闪光灯打开失败");  
195 - mFlashLamp.setImageResource(R.drawable.ic_flash_off);  
196 - machine.flash(Camera.Parameters.FLASH_MODE_OFF);  
197 - }  
198 - }  
199 - });  
200 - }  
201 - lastClick = System.currentTimeMillis();  
202 - if (cameraCount == 1) {  
203 - mSwitchCamera.setVisibility(GONE);  
204 - mSwitchCamera.setClickable(false);  
205 - } else {  
206 - mSwitchCamera.setVisibility(VISIBLE);  
207 - mSwitchCamera.setClickable(true);  
208 - mSwitchCamera.setImageResource(R.drawable.fb_xiangji);  
209 - //切换摄像头  
210 - long[] mHits = new long[3];  
211 - mSwitchCamera.setOnClickListener(new OnClickListener() {  
212 - @Override  
213 - public void onClick(View v) {  
214 - if (System.currentTimeMillis() - lastClickTime < FAST_CLICK_DELAY_TIME) {  
215 - } else {  
216 - if (machine.swtich(mVideoView.getHolder(), screenProp)) {  
217 - if (cid[0] == 1) {  
218 - // mFlashLamp.setVisibility(INVISIBLE);  
219 - machine.flash(Camera.Parameters.FLASH_MODE_OFF);  
220 - mFlashLamp.setImageResource(R.drawable.ic_flash_off);  
221 - cid[0] = 1;  
222 - } else if (cid[0] == 0) {  
223 - mFlashLamp.setVisibility(VISIBLE);  
224 - machine.flash(Camera.Parameters.FLASH_MODE_OFF);  
225 - mFlashLamp.setImageResource(R.drawable.ic_flash_off);  
226 - cid[0] = 0;  
227 - }  
228 - } else {  
229 - mCaptureLayout.onError();  
230 - }  
231 - }  
232 - lastClickTime = System.currentTimeMillis();  
233 -  
234 - }  
235 - });  
236 - }  
237 - mCaptureLayout = (CaptureLayout) view.findViewById(R.id.capture_layout);  
238 - mCaptureLayout.setDuration(duration);  
239 - mCaptureLayout.setIconSrc(iconLeft, iconRight);  
240 - mFoucsView = (FoucsView) view.findViewById(R.id.fouce_view);  
241 - mVideoView.getHolder().addCallback(this);  
242 - //拍照 录像  
243 - mCaptureLayout.setCaptureLisenter(new CaptureListener() {  
244 - @Override  
245 - public void takePictures() {  
246 - if (machine.capture()) {  
247 - mSwitchCamera.setVisibility(INVISIBLE);  
248 - recordEnd = true;  
249 - mFlashLamp.setVisibility(INVISIBLE);  
250 - } else {  
251 - AlertUtil.showDeftToast(getContext(), "相机拍摄失败");  
252 - Log.e("Camera", "相机拍摄失败.");  
253 - mCaptureLayout.onError();  
254 - recordEnd = true;  
255 - }  
256 - }  
257 -  
258 - @Override  
259 - public void recordStart() {  
260 - recordEnd = false;  
261 - if (machine.record(mVideoView.getHolder().getSurface(), screenProp,getContext())) {  
262 - mSwitchCamera.setVisibility(INVISIBLE);  
263 - mFlashLamp.setVisibility(INVISIBLE);  
264 - } else {  
265 - AlertUtil.showDeftToast(getContext(), "相机开启失败");  
266 - Log.e("Camera", "相机开启失败.");  
267 - mCaptureLayout.onError(true);  
268 - }  
269 - }  
270 -  
271 - @Override  
272 - public void recordShort(final long time) {  
273 - mCaptureLayout.setTextWithAnimation("录制时间过短");  
274 - mSwitchCamera.setVisibility(VISIBLE);  
275 - mFlashLamp.setVisibility(VISIBLE);  
276 - postDelayed(new Runnable() {  
277 - @Override  
278 - public void run() {  
279 - machine.stopRecord(true, time);  
280 - }  
281 - }, 1500 - time);  
282 - }  
283 -  
284 - @Override  
285 - public void recordEnd(long time) {  
286 - machine.stopRecord(false, time);  
287 - recordEnd = true;  
288 - if (jCameraLisenter != null) {  
289 - jCameraLisenter.recordEnd(videoUrl, duration);  
290 - }  
291 - }  
292 -  
293 - @Override  
294 - public void recordZoom(float zoom) {  
295 - LogUtil.i("recordZoom");  
296 - machine.zoom(zoom, CameraInterface.TYPE_RECORDER);  
297 - }  
298 -  
299 - @Override  
300 - public void recordError() {  
301 - if (errorLisenter != null) {  
302 - errorLisenter.AudioPermissionError();  
303 - }  
304 - }  
305 - });  
306 - //确认 取消  
307 - mCaptureLayout.setTypeLisenter(new TypeListener() {  
308 - @Override  
309 - public void cancel() {  
310 - machine.confirm();  
311 - }  
312 -  
313 - @Override  
314 - public void confirm() {  
315 - machine.cancle(mVideoView.getHolder(), screenProp);  
316 - stopVideo();  
317 - recordEnd = false;  
318 - mFlashLamp.setImageResource(R.drawable.ic_flash_off);  
319 - machine.flash(Camera.Parameters.FLASH_MODE_OFF);  
320 - }  
321 - });  
322 - //退出  
323 -// mCaptureLayout.setReturnLisenter(new ReturnListener() {  
324 -// @Override  
325 -// public void onReturn() {  
326 -// if (jCameraLisenter != null) {  
327 -// jCameraLisenter.quit();  
328 -// }  
329 -// }  
330 -// });  
331 - mCaptureLayout.setLeftClickListener(new ClickListener() {  
332 - @Override  
333 - public void onClick() {  
334 - if (leftClickListener != null) {  
335 - leftClickListener.onClick();  
336 - }  
337 - }  
338 - });  
339 - mCaptureLayout.setRightClickListener(new ClickListener() {  
340 - @Override  
341 - public void onClick() {  
342 - if (rightClickListener != null) {  
343 - rightClickListener.onClick();  
344 - }  
345 - }  
346 - });  
347 - }  
348 -  
349 - public void setDuration(int duration_ss) {  
350 - if (mCaptureLayout != null) mCaptureLayout.setDuration(duration = duration_ss);  
351 - }  
352 -  
353 - @Override  
354 - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
355 - super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
356 - float widthSize = mVideoView.getMeasuredWidth();  
357 - float heightSize = mVideoView.getMeasuredHeight();  
358 - if (screenProp == 0) {  
359 - screenProp = heightSize / widthSize;  
360 - }  
361 - }  
362 -  
363 - @Override  
364 - public void cameraHasOpened() {  
365 - CameraInterface.getInstance().doStartPreview(mVideoView.getHolder(), screenProp);  
366 - }  
367 -  
368 - //生命周期onResume  
369 - public void onResume() {  
370 - LogUtil.i("JCameraView onResume");  
371 - resetState(TYPE_DEFAULT); //重置状态  
372 - CameraInterface.getInstance().registerSensorManager(getContext());  
373 - CameraInterface.getInstance().setSwitchView(mSwitchCamera, mFlashLamp);  
374 - machine.setDefaultState();  
375 - machine.start(mVideoView.getHolder(), screenProp);  
376 - }  
377 -  
378 - //生命周期onPause  
379 - public void onStop() {  
380 - LogUtil.i("JCameraView onPause");  
381 - stopVideo();  
382 - resetState(TYPE_PICTURE);  
383 - CameraInterface.getInstance().isPreview(false);  
384 - CameraInterface.getInstance().unregisterSensorManager(getContext());  
385 - }  
386 -  
387 - //SurfaceView生命周期  
388 - @Override  
389 - public void surfaceCreated(SurfaceHolder holder) {  
390 - LogUtil.i("JCameraView SurfaceCreated");  
391 - if (recordEnd) {  
392 - if (mMediaPlayer != null) {  
393 - mMediaPlayer.setDisplay(holder);  
394 - mMediaPlayer.start();  
395 - }  
396 - return;  
397 - }  
398 - new Thread() {  
399 - @Override  
400 - public void run() {  
401 - CameraInterface.getInstance().doOpenCamera(JCameraView.this);  
402 - }  
403 - }.start();  
404 - }  
405 -  
406 - @Override  
407 - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  
408 - }  
409 -  
410 - @Override  
411 - public void surfaceDestroyed(SurfaceHolder holder) {  
412 - LogUtil.i("JCameraView SurfaceDestroyed");  
413 - if (recordEnd) {  
414 - if (mMediaPlayer != null)  
415 - mMediaPlayer.setDisplay(null);  
416 - pausePlayer();  
417 - return;  
418 - }  
419 - CameraInterface.getInstance().doDestroyCamera();  
420 -  
421 - }  
422 -  
423 -  
424 - @Override  
425 - public boolean onTouchEvent(MotionEvent event) {  
426 - switch (event.getAction()) {  
427 - case MotionEvent.ACTION_DOWN:  
428 - if (event.getPointerCount() == 1) {  
429 - //显示对焦指示器  
430 - setFocusViewWidthAnimation(event.getX(), event.getY());  
431 - }  
432 - if (event.getPointerCount() == 2) {  
433 - Log.i("CJT", "ACTION_DOWN = " + 2);  
434 - }  
435 - break;  
436 - case MotionEvent.ACTION_MOVE:  
437 - if (event.getPointerCount() == 1) {  
438 - firstTouch = true;  
439 - }  
440 - if (event.getPointerCount() == 2) {  
441 - //第一个点  
442 - float point_1_X = event.getX(0);  
443 - float point_1_Y = event.getY(0);  
444 - //第二个点  
445 - float point_2_X = event.getX(1);  
446 - float point_2_Y = event.getY(1);  
447 -  
448 - float result = (float) Math.sqrt(Math.pow(point_1_X - point_2_X, 2) + Math.pow(point_1_Y -  
449 - point_2_Y, 2));  
450 -  
451 - if (firstTouch) {  
452 - firstTouchLength = result;  
453 - firstTouch = false;  
454 - }  
455 - if ((int) (result - firstTouchLength) / zoomGradient != 0) {  
456 - firstTouch = true;  
457 - machine.zoom(result - firstTouchLength, CameraInterface.TYPE_CAPTURE);  
458 - }  
459 -// Log.i("CJT", "result = " + (result - firstTouchLength));  
460 - }  
461 - break;  
462 - case MotionEvent.ACTION_UP:  
463 - firstTouch = true;  
464 - break;  
465 - }  
466 - return true;  
467 - }  
468 -  
469 - //对焦框指示器动画  
470 - private void setFocusViewWidthAnimation(float x, float y) {  
471 - machine.foucs(x, y, new CameraInterface.FocusCallback() {  
472 - @Override  
473 - public void focusSuccess() {  
474 - mFoucsView.setVisibility(INVISIBLE);  
475 - }  
476 - });  
477 - }  
478 -  
479 - private void updateVideoViewSize(float videoWidth, float videoHeight) {  
480 - if (videoWidth > videoHeight) {  
481 - LayoutParams videoViewParam;  
482 - int height = (int) ((videoHeight / videoWidth) * getWidth());  
483 - videoViewParam = new LayoutParams(LayoutParams.MATCH_PARENT, height);  
484 - videoViewParam.gravity = Gravity.CENTER;  
485 - mVideoView.setLayoutParams(videoViewParam);  
486 - }  
487 - }  
488 -  
489 - /**************************************************  
490 - * 对外提供的API *  
491 - **************************************************/  
492 -  
493 - public void setSaveVideoPath(String path) {  
494 - CameraInterface.getInstance().setSaveVideoPath(path);  
495 - }  
496 -  
497 -  
498 - public void setJCameraLisenter(JCameraListener jCameraLisenter) {  
499 - this.jCameraLisenter = jCameraLisenter;  
500 - }  
501 -  
502 -  
503 - private ErrorListener errorLisenter;  
504 -  
505 - //启动Camera错误回调  
506 - public void setErrorLisenter(ErrorListener errorLisenter) {  
507 - this.errorLisenter = errorLisenter;  
508 - CameraInterface.getInstance().setErrorLinsenter(errorLisenter);  
509 - }  
510 -  
511 - //设置CaptureButton功能(拍照和录像)  
512 - public void setFeatures(int state) {  
513 - this.mCaptureLayout.setButtonFeatures(state);  
514 - }  
515 -  
516 - //设置录制质量  
517 - public void setMediaQuality(int quality) {  
518 - CameraInterface.getInstance().setMediaQuality(quality);  
519 - }  
520 -  
521 - public void setButtonVisiblity() {  
522 - mCaptureLayout.setVisibility(GONE);  
523 - }  
524 -  
525 - @Override  
526 - public void resetState(int type) {  
527 - switch (type) {  
528 - case TYPE_VIDEO:  
529 - stopVideo(); //停止播放  
530 - //初始化VideoView  
531 - FileUtil.deleteFile(videoUrl);  
532 - mVideoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
533 - machine.start(mVideoView.getHolder(), screenProp);  
534 - break;  
535 - case TYPE_PICTURE:  
536 - mPhoto.setVisibility(INVISIBLE);  
537 - break;  
538 - case TYPE_SHORT:  
539 - break;  
540 - case TYPE_DEFAULT:  
541 - mVideoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
542 - break;  
543 - }  
544 - mSwitchCamera.setVisibility(VISIBLE);  
545 - mFlashLamp.setVisibility(VISIBLE);  
546 - mCaptureLayout.resetCaptureLayout();  
547 - }  
548 -  
549 - @Override  
550 - public void confirmState(int type) {  
551 - switch (type) {  
552 - case TYPE_VIDEO:  
553 - int duration = mMediaPlayer.getDuration();  
554 - stopVideo(); //停止播放  
555 - mVideoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));  
556 - machine.start(mVideoView.getHolder(), screenProp);  
557 - if (jCameraLisenter != null) {  
558 - jCameraLisenter.recordSuccess(videoUrl, duration);  
559 - }  
560 - break;  
561 - case TYPE_PICTURE:  
562 - mPhoto.setVisibility(INVISIBLE);  
563 - if (jCameraLisenter != null) {  
564 - jCameraLisenter.captureSuccess(captureBitmap);  
565 - }  
566 - break;  
567 - case TYPE_SHORT:  
568 - break;  
569 - case TYPE_DEFAULT:  
570 - break;  
571 - }  
572 - mCaptureLayout.resetCaptureLayout();  
573 - }  
574 -  
575 - @Override  
576 - public void showPicture(Bitmap bitmap, boolean isVertical) {  
577 - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {  
578 - ViewGroup.LayoutParams layoutParams = mPhoto.getLayoutParams();  
579 - layoutParams.width = ScreenUtil.getScreenWidth(getContext());  
580 - layoutParams.height = ScreenUtil.getScreenHeight(getContext());  
581 - mPhoto.setLayoutParams(layoutParams);  
582 - } else {  
583 - if (isVertical) {  
584 - mPhoto.setScaleType(ImageView.ScaleType.FIT_XY);  
585 - } else {  
586 - mPhoto.setScaleType(ImageView.ScaleType.FIT_CENTER);  
587 - }  
588 - }  
589 - captureBitmap = bitmap;  
590 - mPhoto.setVisibility(VISIBLE);  
591 - mPhoto.setImageBitmap(captureBitmap);  
592 -  
593 - mCaptureLayout.startAlphaAnimation();  
594 - mCaptureLayout.startTypeBtnAnimator();  
595 - }  
596 -  
597 - @Override  
598 - public void playVideo(final String url) {  
599 - videoUrl = url;  
600 - new Thread(new Runnable() {  
601 - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)  
602 - @Override  
603 - public void run() {  
604 - try {  
605 - if (mMediaPlayer == null) {  
606 - mMediaPlayer = new MediaPlayer();  
607 - } else {  
608 - mMediaPlayer.reset();  
609 - }  
610 - mMediaPlayer.setDataSource(url);  
611 - mMediaPlayer.setDisplay(mVideoView.getHolder());  
612 - mMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);  
613 - mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
614 - mMediaPlayer.setOnVideoSizeChangedListener(new MediaPlayer  
615 - .OnVideoSizeChangedListener() {  
616 - @Override  
617 - public void  
618 - onVideoSizeChanged(MediaPlayer mp, int width, int height) {  
619 - updateVideoViewSize(mMediaPlayer.getVideoWidth(), mMediaPlayer  
620 - .getVideoHeight());  
621 - }  
622 - });  
623 - mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {  
624 - @Override  
625 - public void onPrepared(MediaPlayer mp) {  
626 - mMediaPlayer.start();  
627 - }  
628 - });  
629 - mMediaPlayer.setLooping(true);  
630 - mMediaPlayer.prepare();  
631 - } catch (Exception e) {  
632 - Log.e("MediaPlayer", "", e);  
633 - }  
634 - }  
635 - }).start();  
636 - }  
637 -  
638 - @Override  
639 - public void stopVideo() {  
640 - if (mMediaPlayer != null) {  
641 - mMediaPlayer.stop();  
642 - mMediaPlayer.release();  
643 - mMediaPlayer = null;  
644 - }  
645 - }  
646 -  
647 - @Override  
648 - public void setTip(String tip) {  
649 - mCaptureLayout.setTip(tip);  
650 - }  
651 -  
652 - @Override  
653 - public void startPreviewCallback() {  
654 - LogUtil.i("startPreviewCallback");  
655 - handlerFoucs(mFoucsView.getWidth() / 2, mFoucsView.getHeight() / 2);  
656 - }  
657 -  
658 - @Override  
659 - public boolean handlerFoucs(float x, float y) {  
660 - if (y > mCaptureLayout.getTop()) {  
661 - return false;  
662 - }  
663 - mFoucsView.setVisibility(VISIBLE);  
664 - if (x < mFoucsView.getWidth() / 2) {  
665 - x = mFoucsView.getWidth() / 2;  
666 - }  
667 - if (x > layout_width - mFoucsView.getWidth() / 2) {  
668 - x = layout_width - mFoucsView.getWidth() / 2;  
669 - }  
670 - if (y < mFoucsView.getWidth() / 2) {  
671 - y = mFoucsView.getWidth() / 2;  
672 - }  
673 - if (y > mCaptureLayout.getTop() - mFoucsView.getWidth() / 2) {  
674 - y = mCaptureLayout.getTop() - mFoucsView.getWidth() / 2;  
675 - }  
676 - mFoucsView.setX(x - mFoucsView.getWidth() / 2);  
677 - mFoucsView.setY(y - mFoucsView.getHeight() / 2);  
678 - ObjectAnimator scaleX = ObjectAnimator.ofFloat(mFoucsView, "scaleX", 1, 0.6f);  
679 - ObjectAnimator scaleY = ObjectAnimator.ofFloat(mFoucsView, "scaleY", 1, 0.6f);  
680 - ObjectAnimator alpha = ObjectAnimator.ofFloat(mFoucsView, "alpha", 1f, 0.4f, 1f, 0.4f, 1f, 0.4f, 1f);  
681 - AnimatorSet animSet = new AnimatorSet();  
682 - animSet.play(scaleX).with(scaleY).before(alpha);  
683 - animSet.setDuration(400);  
684 - animSet.start();  
685 - return true;  
686 - }  
687 -  
688 - @Override  
689 - public void pausePlayer() {  
690 - if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {  
691 - mMediaPlayer.pause();  
692 - }  
693 - }  
694 -  
695 - @Override  
696 - public void resumePlayer() {  
697 - if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {  
698 - mMediaPlayer.start();  
699 - }  
700 - }  
701 -  
702 - public void setLeftClickListener(ClickListener clickListener) {  
703 - this.leftClickListener = clickListener;  
704 - }  
705 -  
706 - public void setRightClickListener(ClickListener clickListener) {  
707 - this.rightClickListener = clickListener;  
708 - }  
709 -  
710 - public void onDestroy() {  
711 - if (recordEnd) {  
712 - CameraInterface.getInstance().doDestroyCamera();  
713 - }  
714 - if (machine != null) machine.onDestroy();  
715 - }  
716 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/ReturnButton.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary;  
2 -  
3 -import android.content.Context;  
4 -import android.graphics.Canvas;  
5 -import android.graphics.Paint;  
6 -import android.graphics.Path;  
7 -import android.view.View;  
8 -  
9 -/**  
10 - * =====================================  
11 - * 作 者: 陈嘉桐 445263848@qq.com  
12 - * 版 本:1.0.4  
13 - * 创建日期:2017/4/26  
14 - * 描 述:向下箭头的退出按钮  
15 - * =====================================  
16 - */  
17 -public class ReturnButton extends View {  
18 -  
19 - private int size;  
20 -  
21 - private int center_X;  
22 - private int center_Y;  
23 - private float strokeWidth;  
24 -  
25 - private Paint paint;  
26 - Path path;  
27 -  
28 - public ReturnButton(Context context, int size) {  
29 - this(context);  
30 - this.size = size;  
31 - center_X = size / 2;  
32 - center_Y = size / 2;  
33 -  
34 - strokeWidth = size / 15f;  
35 -  
36 - paint = new Paint();  
37 - paint.setAntiAlias(true);  
38 - paint.setColor(0xffffa300);  
39 - paint.setStyle(Paint.Style.STROKE);  
40 - paint.setStrokeWidth(strokeWidth);  
41 -  
42 - path = new Path();  
43 - }  
44 -  
45 - public ReturnButton(Context context) {  
46 - super(context);  
47 - }  
48 -  
49 - @Override  
50 - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
51 - setMeasuredDimension(size, size / 2);  
52 - }  
53 -  
54 - @Override  
55 - protected void onDraw(Canvas canvas) {  
56 - super.onDraw(canvas);  
57 - path.moveTo(strokeWidth, strokeWidth/2);  
58 - path.lineTo(center_X, center_Y - strokeWidth/2);  
59 - path.lineTo(size - strokeWidth, strokeWidth/2);  
60 -  
61 - canvas.drawPath(path, paint);  
62 - }  
63 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/TypeButton.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary;  
2 -  
3 -import android.content.Context;  
4 -import android.widget.ImageView;  
5 -  
6 -import com.cnlive.strike.base.R;  
7 -  
8 -  
9 -/**  
10 - * =====================================  
11 - * 作 者: 陈嘉桐 445263848@qq.com  
12 - * 版 本:1.0.4  
13 - * 创建日期:2017/4/26  
14 - * 描 述:拍照或录制完成后弹出的确认和返回按钮  
15 - * =====================================  
16 - */  
17 -public class TypeButton extends ImageView {  
18 - public static final int TYPE_CANCEL = 0x001;  
19 - public static final int TYPE_CONFIRM = 0x002;  
20 -// private int button_type;  
21 - private int button_size;  
22 -  
23 -// private float center_X;  
24 -// private float center_Y;  
25 -// private float button_radius;  
26 -  
27 -// private Paint mPaint;  
28 -// private Path path;  
29 -// private float strokeWidth;  
30 -  
31 - private float index;  
32 -// private RectF rectF;  
33 -  
34 - public TypeButton(Context context, int type, int size) {  
35 - super(context);  
36 - if (type == TYPE_CANCEL) {  
37 - setImageResource(R.drawable.fb_wancheng);  
38 - }  
39 - if (type == TYPE_CONFIRM){  
40 - setImageResource(R.drawable.fb_chongpai);  
41 - }  
42 -// this.button_type = type;  
43 - button_size = size;  
44 -// button_radius = size / 2.0f;  
45 -// center_X = size / 2.0f;  
46 -// center_Y = size / 2.0f;  
47 -  
48 -// mPaint = new Paint();  
49 -// path = new Path();  
50 -// strokeWidth = size / 50f;  
51 -// index = button_size / 12f;  
52 -// rectF = new RectF(center_X, center_Y - index, center_X + index * 2, center_Y + index);  
53 - }  
54 -  
55 - @Override  
56 - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
57 - super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
58 - setMeasuredDimension(button_size, button_size);  
59 - }  
60 -  
61 -// @Override  
62 -// protected void onDraw(Canvas canvas) {  
63 -// super.onDraw(canvas);  
64 -// //如果类型为取消,则绘制内部为返回箭头  
65 -// if (button_type == TYPE_CANCEL) {  
66 -// mPaint.setAntiAlias(true);  
67 -// mPaint.setColor(0xEEDCDCDC);  
68 -// mPaint.setStyle(Paint.Style.FILL);  
69 -// canvas.drawCircle(center_X, center_Y, button_radius, mPaint);  
70 -//  
71 -// mPaint.setColor(Color.BLACK);  
72 -// mPaint.setStyle(Paint.Style.STROKE);  
73 -// mPaint.setStrokeWidth(strokeWidth);  
74 -//  
75 -// path.moveTo(center_X - index / 7, center_Y + index);  
76 -// path.lineTo(center_X + index, center_Y + index);  
77 -//  
78 -// path.arcTo(rectF, 90, -180);  
79 -// path.lineTo(center_X - index, center_Y - index);  
80 -// canvas.drawPath(path, mPaint);  
81 -// mPaint.setStyle(Paint.Style.FILL);  
82 -// path.reset();  
83 -// path.moveTo(center_X - index, (float) (center_Y - index * 1.5));  
84 -// path.lineTo(center_X - index, (float) (center_Y - index / 2.3));  
85 -// path.lineTo((float) (center_X - index * 1.6), center_Y - index);  
86 -// path.close();  
87 -// canvas.drawPath(path, mPaint);  
88 -//  
89 -// }  
90 -// //如果类型为确认,则绘制绿色勾  
91 -// if (button_type == TYPE_CONFIRM) {  
92 -// mPaint.setAntiAlias(true);  
93 -// mPaint.setColor(0xFFFFFFFF);  
94 -// mPaint.setStyle(Paint.Style.FILL);  
95 -// canvas.drawCircle(center_X, center_Y, button_radius, mPaint);  
96 -// mPaint.setAntiAlias(true);  
97 -// mPaint.setStyle(Paint.Style.STROKE);  
98 -// mPaint.setColor(0xFF00CC00);  
99 -// mPaint.setStrokeWidth(strokeWidth);  
100 -//  
101 -// path.moveTo(center_X - button_size / 6f, center_Y);  
102 -// path.lineTo(center_X - button_size / 21.2f, center_Y + button_size / 7.7f);  
103 -// path.lineTo(center_X + button_size / 4.0f, center_Y - button_size / 8.5f);  
104 -// path.lineTo(center_X - button_size / 21.2f, center_Y + button_size / 9.4f);  
105 -// path.close();  
106 -// canvas.drawPath(path, mPaint);  
107 -// }  
108 -// }  
109 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/listener/CaptureListener.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.listener;  
2 -  
3 -/**  
4 - * create by CJT2325  
5 - * 445263848@qq.com.  
6 - */  
7 -  
8 -public interface CaptureListener {  
9 - void takePictures();  
10 -  
11 - void recordShort(long time);  
12 -  
13 - void recordStart();  
14 -  
15 - void recordEnd(long time);  
16 -  
17 - void recordZoom(float zoom);  
18 -  
19 - void recordError();  
20 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/listener/ClickListener.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.listener;  
2 -  
3 -/**  
4 - * =====================================  
5 - * 作 者: 陈嘉桐  
6 - * 版 本:1.1.9  
7 - * 创建日期:2017/10/7  
8 - * 描 述:  
9 - * =====================================  
10 - */  
11 -public interface ClickListener {  
12 - void onClick();  
13 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/listener/ErrorListener.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.listener;  
2 -  
3 -/**  
4 - * =====================================  
5 - * 作 者: 陈嘉桐  
6 - * 版 本:1.1.4  
7 - * 创建日期:2017/6/5  
8 - * 描 述:  
9 - * =====================================  
10 - */  
11 -public interface ErrorListener {  
12 - void onError();  
13 - void AudioPermissionError();  
14 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/listener/JCameraListener.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.listener;  
2 -  
3 -import android.graphics.Bitmap;  
4 -  
5 -/**  
6 - * =====================================  
7 - * 作 者: 陈嘉桐  
8 - * 版 本:1.1.4  
9 - * 创建日期:2017/4/26  
10 - * 描 述:  
11 - * =====================================  
12 - */  
13 -public interface JCameraListener {  
14 -  
15 - void captureSuccess(Bitmap bitmap);  
16 -  
17 - void recordSuccess(String url, int duration);  
18 -  
19 - void recordEnd(String url, int duration);  
20 -  
21 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/listener/ResultListener.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.listener;  
2 -  
3 -/**  
4 - * =====================================  
5 - * 作 者: 陈嘉桐  
6 - * 版 本:1.1.4  
7 - * 创建日期:2017/9/8  
8 - * 描 述:  
9 - * =====================================  
10 - */  
11 -public interface ResultListener {  
12 - void callback();  
13 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/listener/ReturnListener.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.listener;  
2 -  
3 -/**  
4 - * =====================================  
5 - * 作 者: 陈嘉桐  
6 - * 版 本:1.1.4  
7 - * 创建日期:2017/4/26  
8 - * 描 述:  
9 - * =====================================  
10 - */  
11 -public interface ReturnListener {  
12 - void onReturn();  
13 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/listener/TypeListener.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.listener;  
2 -  
3 -/**  
4 - * =====================================  
5 - * 作 者: 陈嘉桐  
6 - * 版 本:1.1.4  
7 - * 创建日期:2017/4/25  
8 - * 描 述:  
9 - * =====================================  
10 - */  
11 -public interface TypeListener {  
12 - void cancel();  
13 -  
14 - void confirm();  
15 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/state/BorrowPictureState.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.state;  
2 -  
3 -import android.content.Context;  
4 -import android.view.Surface;  
5 -import android.view.SurfaceHolder;  
6 -  
7 -import com.cjt2325.cameralibrary.CameraInterface;  
8 -import com.cjt2325.cameralibrary.JCameraView;  
9 -import com.cjt2325.cameralibrary.util.LogUtil;  
10 -  
11 -/**  
12 - * =====================================  
13 - * 作 者: 陈嘉桐  
14 - * 版 本:1.1.4  
15 - * 创建日期:2017/9/8  
16 - * 描 述:  
17 - * =====================================  
18 - */  
19 -public class BorrowPictureState implements State {  
20 - private final String TAG = "BorrowPictureState";  
21 - private CameraMachine machine;  
22 -  
23 - public BorrowPictureState(CameraMachine machine) {  
24 - this.machine = machine;  
25 - }  
26 -  
27 - @Override  
28 - public boolean start(SurfaceHolder holder, float screenProp) {  
29 - if (CameraInterface.getInstance().doStartPreview(holder, screenProp)) {  
30 - machine.setState(machine.getPreviewState());  
31 - return true;  
32 - }  
33 - return false;  
34 - }  
35 -  
36 - @Override  
37 - public void stop() {  
38 -  
39 - }  
40 -  
41 -  
42 - @Override  
43 - public boolean foucs(float x, float y, CameraInterface.FocusCallback callback) {  
44 - return false;  
45 - }  
46 -  
47 - @Override  
48 - public boolean swtich(SurfaceHolder holder, float screenProp) {  
49 - return false;  
50 - }  
51 -  
52 - @Override  
53 - public void restart() {  
54 -  
55 - }  
56 -  
57 - @Override  
58 - public boolean capture() {  
59 - return false;  
60 - }  
61 -  
62 - @Override  
63 - public boolean record(Surface surface, float screenProp, Context context) {  
64 - return false;  
65 - }  
66 -  
67 - @Override  
68 - public void stopRecord(boolean isShort, long time) {  
69 - }  
70 -  
71 - @Override  
72 - public void cancle(SurfaceHolder holder, float screenProp) {  
73 - CameraInterface.getInstance().doStartPreview(holder, screenProp);  
74 - machine.getView().resetState(JCameraView.TYPE_PICTURE);  
75 - machine.setState(machine.getPreviewState());  
76 - }  
77 -  
78 - @Override  
79 - public void confirm() {  
80 - machine.getView().confirmState(JCameraView.TYPE_PICTURE);  
81 - machine.setState(machine.getPreviewState());  
82 - }  
83 -  
84 - @Override  
85 - public void zoom(float zoom, int type) {  
86 - LogUtil.i(TAG, "zoom");  
87 - }  
88 -  
89 - @Override  
90 - public void flash(String mode) {  
91 - return ;  
92 - }  
93 -  
94 - @Override  
95 - public void onDestroy() {  
96 - CameraInterface.getInstance().onDestroy();  
97 - }  
98 -  
99 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/state/BorrowVideoState.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.state;  
2 -  
3 -import android.content.Context;  
4 -import android.view.Surface;  
5 -import android.view.SurfaceHolder;  
6 -  
7 -import com.cjt2325.cameralibrary.CameraInterface;  
8 -import com.cjt2325.cameralibrary.JCameraView;  
9 -import com.cjt2325.cameralibrary.util.LogUtil;  
10 -  
11 -/**  
12 - * =====================================  
13 - * 作 者: 陈嘉桐  
14 - * 版 本:1.1.4  
15 - * 创建日期:2017/9/8  
16 - * 描 述:  
17 - * =====================================  
18 - */  
19 -public class BorrowVideoState implements State {  
20 - private final String TAG = "BorrowVideoState";  
21 - private CameraMachine machine;  
22 -  
23 - public BorrowVideoState(CameraMachine machine) {  
24 - this.machine = machine;  
25 - }  
26 -  
27 - @Override  
28 - public boolean start(SurfaceHolder holder, float screenProp) {  
29 - if (CameraInterface.getInstance().doStartPreview(holder, screenProp)) {  
30 - machine.setState(machine.getPreviewState());  
31 - return true;  
32 - }  
33 - return false;  
34 - }  
35 -  
36 - @Override  
37 - public void stop() {  
38 -  
39 - }  
40 -  
41 - @Override  
42 - public boolean foucs(float x, float y, CameraInterface.FocusCallback callback) {  
43 - return false;  
44 - }  
45 -  
46 -  
47 - @Override  
48 - public boolean swtich(SurfaceHolder holder, float screenProp) {  
49 - return false;  
50 - }  
51 -  
52 - @Override  
53 - public void restart() {  
54 -  
55 - }  
56 -  
57 - @Override  
58 - public boolean capture() {  
59 - return false;  
60 - }  
61 -  
62 - @Override  
63 - public boolean record(Surface surface, float screenProp, Context context) {  
64 - return false;  
65 - }  
66 -  
67 - @Override  
68 - public void stopRecord(boolean isShort, long time) {  
69 -  
70 - }  
71 -  
72 - @Override  
73 - public void cancle(SurfaceHolder holder, float screenProp) {  
74 - machine.getView().resetState(JCameraView.TYPE_VIDEO);  
75 - machine.setState(machine.getPreviewState());  
76 - }  
77 -  
78 - @Override  
79 - public void confirm() {  
80 - machine.getView().confirmState(JCameraView.TYPE_VIDEO);  
81 - machine.setState(machine.getPreviewState());  
82 - }  
83 -  
84 - @Override  
85 - public void zoom(float zoom, int type) {  
86 - LogUtil.i(TAG, "zoom");  
87 - }  
88 -  
89 - @Override  
90 - public void flash(String mode) {  
91 - return ;  
92 - }  
93 -  
94 - @Override  
95 - public void onDestroy() {  
96 - CameraInterface.getInstance().onDestroy();  
97 - }  
98 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/state/CameraMachine.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.state;  
2 -  
3 -import android.content.Context;  
4 -import android.view.Surface;  
5 -import android.view.SurfaceHolder;  
6 -  
7 -import com.cjt2325.cameralibrary.CameraInterface;  
8 -import com.cjt2325.cameralibrary.view.CameraView;  
9 -  
10 -/**  
11 - * =====================================  
12 - * 作 者: 陈嘉桐  
13 - * 版 本:1.1.4  
14 - * 创建日期:2017/9/8  
15 - * 描 述:  
16 - * =====================================  
17 - */  
18 -public class CameraMachine implements State {  
19 -  
20 -  
21 - private Context context;  
22 - private State state;  
23 - private CameraView view;  
24 -// private CameraInterface.CameraOpenOverCallback cameraOpenOverCallback;  
25 -  
26 - private State previewState; //浏览状态(空闲)  
27 - private State borrowPictureState; //浏览图片  
28 - private State borrowVideoState; //浏览视频  
29 -  
30 - public CameraMachine(Context context, CameraView view, CameraInterface.CameraOpenOverCallback  
31 - cameraOpenOverCallback) {  
32 - this.context = context;  
33 - previewState = new PreviewState(this);  
34 - borrowPictureState = new BorrowPictureState(this);  
35 - borrowVideoState = new BorrowVideoState(this);  
36 - //默认设置为空闲状态  
37 - this.state = previewState;  
38 -// this.cameraOpenOverCallback = cameraOpenOverCallback;  
39 - this.view = view;  
40 - }  
41 -  
42 - public CameraView getView() {  
43 - return view;  
44 - }  
45 -  
46 - public Context getContext() {  
47 - return context;  
48 - }  
49 -  
50 - public void setState(State state) {  
51 - this.state = state;  
52 - }  
53 -  
54 - public void setDefaultState() {  
55 - this.state = previewState;  
56 - }  
57 -  
58 - //获取浏览图片状态  
59 - State getBorrowPictureState() {  
60 - return borrowPictureState;  
61 - }  
62 -  
63 - //获取浏览视频状态  
64 - State getBorrowVideoState() {  
65 - return borrowVideoState;  
66 - }  
67 -  
68 - //获取空闲状态  
69 - public State getPreviewState() {  
70 - return previewState;  
71 - }  
72 -  
73 - @Override  
74 - public boolean start(SurfaceHolder holder, float screenProp) {  
75 - return state.start(holder, screenProp);  
76 - }  
77 -  
78 - @Override  
79 - public void stop() {  
80 - state.stop();  
81 - }  
82 -  
83 - @Override  
84 - public boolean foucs(float x, float y, CameraInterface.FocusCallback callback) {  
85 - return state.foucs(x, y, callback);  
86 - }  
87 -  
88 - @Override  
89 - public boolean swtich(SurfaceHolder holder, float screenProp) {  
90 - return state.swtich(holder, screenProp);  
91 - }  
92 -  
93 - @Override  
94 - public void restart() {  
95 - state.restart();  
96 - }  
97 -  
98 - @Override  
99 - public boolean capture() {  
100 - return state.capture();  
101 - }  
102 -  
103 - @Override  
104 - public boolean record(Surface surface, float screenProp,Context context) {  
105 - return state.record(surface, screenProp,context);  
106 - }  
107 -  
108 - @Override  
109 - public void stopRecord(boolean isShort, long time) {  
110 - state.stopRecord(isShort, time);  
111 - }  
112 -  
113 - @Override  
114 - public void cancle(SurfaceHolder holder, float screenProp) {  
115 - state.cancle(holder, screenProp);  
116 - }  
117 -  
118 - @Override  
119 - public void confirm() {  
120 - state.confirm();  
121 - }  
122 -  
123 -  
124 - @Override  
125 - public void zoom(float zoom, int type) {  
126 - state.zoom(zoom, type);  
127 - }  
128 -  
129 - @Override  
130 - public void flash(String mode) {  
131 - state.flash(mode);  
132 - }  
133 -  
134 - @Override  
135 - public void onDestroy() {  
136 - if (state != null) state.onDestroy();  
137 - }  
138 -  
139 - public State getState() {  
140 - return this.state;  
141 - }  
142 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/state/PreviewState.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.state;  
2 -  
3 -import android.content.Context;  
4 -import android.graphics.Bitmap;  
5 -import android.util.Log;  
6 -import android.view.Surface;  
7 -import android.view.SurfaceHolder;  
8 -  
9 -import com.cjt2325.cameralibrary.CameraInterface;  
10 -import com.cjt2325.cameralibrary.JCameraView;  
11 -import com.cjt2325.cameralibrary.util.LogUtil;  
12 -  
13 -/**  
14 - * =====================================  
15 - * 作 者: 陈嘉桐  
16 - * 版 本:1.1.4  
17 - * 创建日期:2017/9/8  
18 - * 描 述:空闲状态  
19 - * =====================================  
20 - */  
21 -class PreviewState implements State {  
22 - public static final String TAG = "PreviewState";  
23 -  
24 - private CameraMachine machine;  
25 -  
26 - PreviewState(CameraMachine machine) {  
27 - this.machine = machine;  
28 - }  
29 -  
30 - @Override  
31 - public boolean start(SurfaceHolder holder, float screenProp) {  
32 - return CameraInterface.getInstance().doStartPreview(holder, screenProp);  
33 - }  
34 -  
35 - @Override  
36 - public void stop() {  
37 - CameraInterface.getInstance().doStopPreview();  
38 - }  
39 -  
40 -  
41 - @Override  
42 - public boolean foucs(float x, float y, CameraInterface.FocusCallback callback) {  
43 - LogUtil.i("preview state foucs");  
44 - try {  
45 - if (machine.getView().handlerFoucs(x, y)) {  
46 - return CameraInterface.getInstance().handleFocus(machine.getContext(), x, y, callback);  
47 - }  
48 - } catch (Exception e) {  
49 - Log.e("Camera", "", e);  
50 - }  
51 -  
52 - return false;  
53 - }  
54 -  
55 - @Override  
56 - public boolean swtich(SurfaceHolder holder, float screenProp) {  
57 - return CameraInterface.getInstance().switchCamera(holder, screenProp);  
58 - }  
59 -  
60 - @Override  
61 - public void restart() {  
62 -  
63 - }  
64 -  
65 - @Override  
66 - public boolean capture() {  
67 - return CameraInterface.getInstance().takePicture(new CameraInterface.TakePictureCallback() {  
68 - @Override  
69 - public void captureResult(Bitmap bitmap, boolean isVertical) {  
70 - machine.getView().showPicture(bitmap, isVertical);  
71 - machine.setState(machine.getBorrowPictureState());  
72 - LogUtil.i("capture");  
73 - }  
74 - });  
75 - }  
76 -  
77 - @Override  
78 - public boolean record(Surface surface, float screenProp, Context context) {  
79 - return CameraInterface.getInstance().startRecord(surface, screenProp, null,context);  
80 - }  
81 -  
82 - @Override  
83 - public void stopRecord(final boolean isShort, long time) {  
84 - CameraInterface.getInstance().stopRecord(isShort, new CameraInterface.StopRecordCallback() {  
85 - @Override  
86 - public void recordResult(String url) {  
87 - if (isShort) {  
88 - machine.getView().resetState(JCameraView.TYPE_SHORT);  
89 - } else {  
90 - machine.getView().playVideo(url);  
91 - machine.setState(machine.getBorrowVideoState());  
92 - }  
93 - }  
94 - });  
95 - }  
96 -  
97 - @Override  
98 - public void cancle(SurfaceHolder holder, float screenProp) {  
99 - LogUtil.i("浏览状态下,没有 cancle 事件");  
100 - }  
101 -  
102 - @Override  
103 - public void confirm() {  
104 - LogUtil.i("浏览状态下,没有 confirm 事件");  
105 - }  
106 -  
107 - @Override  
108 - public void zoom(float zoom, int type) {  
109 - LogUtil.i(TAG, "zoom");  
110 - CameraInterface.getInstance().setZoom(zoom, type);  
111 - }  
112 -  
113 - @Override  
114 - public void flash(String mode) {  
115 - CameraInterface.getInstance().setFlashMode(mode);  
116 - }  
117 -  
118 - @Override  
119 - public void onDestroy() {  
120 - CameraInterface.getInstance().onDestroy();  
121 - }  
122 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/state/State.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.state;  
2 -  
3 -import android.content.Context;  
4 -import android.view.Surface;  
5 -import android.view.SurfaceHolder;  
6 -  
7 -import com.cjt2325.cameralibrary.CameraInterface;  
8 -  
9 -/**  
10 - * =====================================  
11 - * 作 者: 陈嘉桐  
12 - * 版 本:1.1.4  
13 - * 创建日期:2017/9/8  
14 - * 描 述:  
15 - * =====================================  
16 - */  
17 -public interface State {  
18 -  
19 - boolean start(SurfaceHolder holder, float screenProp);  
20 -  
21 - void stop();  
22 -  
23 - boolean foucs(float x, float y, CameraInterface.FocusCallback callback);  
24 -  
25 - boolean swtich(SurfaceHolder holder, float screenProp);  
26 -  
27 - void restart();  
28 -  
29 - boolean capture();  
30 -  
31 - boolean record(Surface surface, float screenProp, Context context);  
32 -  
33 - void stopRecord(boolean isShort, long time);  
34 -  
35 - void cancle(SurfaceHolder holder, float screenProp);  
36 -  
37 - void confirm();  
38 -  
39 - void zoom(float zoom, int type);  
40 -  
41 - void flash(String mode);  
42 -  
43 - void onDestroy();  
44 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/util/AngleUtil.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -/**  
4 - * =====================================  
5 - * 作 者: 陈嘉桐  
6 - * 版 本:1.1.4  
7 - * 创建日期:2017/5/2  
8 - * 描 述:  
9 - * =====================================  
10 - */  
11 -public class AngleUtil {  
12 - public static int getSensorAngle(float x, float y) {  
13 - if (Math.abs(x) > Math.abs(y)) {  
14 - /**  
15 - * 横屏倾斜角度比较大  
16 - */  
17 - if (x > 4) {  
18 - /**  
19 - * 左边倾斜  
20 - */  
21 - return 270;  
22 - } else if (x < -4) {  
23 - /**  
24 - * 右边倾斜  
25 - */  
26 - return 90;  
27 - } else {  
28 - /**  
29 - * 倾斜角度不够大  
30 - */  
31 - return 0;  
32 - }  
33 - } else {  
34 - if (y > 7) {  
35 - /**  
36 - * 左边倾斜  
37 - */  
38 - return 0;  
39 - } else if (y < -7) {  
40 - /**  
41 - * 右边倾斜  
42 - */  
43 - return 180;  
44 - } else {  
45 - /**  
46 - * 倾斜角度不够大  
47 - */  
48 - return 0;  
49 - }  
50 - }  
51 - }  
52 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/util/AudioUtil.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -import android.content.Context;  
4 -import android.media.AudioManager;  
5 -  
6 -/**  
7 - * =====================================  
8 - * 作 者: 陈嘉桐  
9 - * 版 本:1.1.4  
10 - * 创建日期:2017/4/26  
11 - * 描 述:  
12 - * =====================================  
13 - */  
14 -public class AudioUtil {  
15 - public static void setAudioManage(Context context) {  
16 - AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);  
17 - audioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);  
18 - audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);  
19 - audioManager.setStreamVolume(AudioManager.STREAM_ALARM, 0, 0);  
20 - audioManager.setStreamVolume(AudioManager.STREAM_DTMF, 0, 0);  
21 - audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, 0, 0);  
22 - audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0);  
23 - }  
24 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/util/CameraParamUtil.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -import android.content.Context;  
4 -import android.hardware.Camera;  
5 -import android.util.Log;  
6 -import android.view.Surface;  
7 -import android.view.WindowManager;  
8 -  
9 -import com.cnlive.libs.base.util.AlertUtil;  
10 -  
11 -import java.util.Collections;  
12 -import java.util.Comparator;  
13 -import java.util.List;  
14 -  
15 -/**  
16 - * =====================================  
17 - * 作 者: 陈嘉桐  
18 - * 版 本:1.1.4  
19 - * 创建日期:2017/4/25  
20 - * 描 述:  
21 - * =====================================  
22 - */  
23 -public class CameraParamUtil {  
24 - private static final String TAG = "JCameraView";  
25 - private CameraSizeComparator sizeComparator = new CameraSizeComparator();  
26 - private static CameraParamUtil cameraParamUtil = null;  
27 -  
28 - private CameraParamUtil() {  
29 -  
30 - }  
31 -  
32 - public static CameraParamUtil getInstance() {  
33 - if (cameraParamUtil == null) {  
34 - cameraParamUtil = new CameraParamUtil();  
35 - return cameraParamUtil;  
36 - } else {  
37 - return cameraParamUtil;  
38 - }  
39 - }  
40 -  
41 - public Camera.Size getPreviewSize(List<Camera.Size> list, int th, float rate) {  
42 - Collections.sort(list, sizeComparator);  
43 - int i = 0;  
44 - for (Camera.Size s : list) {  
45 - if ((s.width > th) && equalRate(s, rate)) {  
46 - Log.i(TAG, "MakeSure Preview :w = " + s.width + " h = " + s.height);  
47 - break;  
48 - }  
49 - i++;  
50 - }  
51 - if (i == list.size()) {  
52 - return getBestSize(list, rate);  
53 - } else {  
54 - return list.get(i);  
55 - }  
56 - }  
57 -  
58 - public Camera.Size getPictureSize(List<Camera.Size> list, int th, float rate) {  
59 - Collections.sort(list, sizeComparator);  
60 - int i = 0;  
61 - for (Camera.Size s : list) {  
62 - if ((s.width > th) && equalRate(s, rate)) {  
63 - Log.i(TAG, "MakeSure Picture :w = " + s.width + " h = " + s.height);  
64 - break;  
65 - }  
66 - i++;  
67 - }  
68 - if (i == list.size()) {  
69 - return getBestSize(list, rate);  
70 - } else {  
71 - return list.get(i);  
72 - }  
73 - }  
74 -  
75 - private Camera.Size getBestSize(List<Camera.Size> list, float rate) {  
76 - float previewDisparity = 100;  
77 - int index = 0;  
78 - for (int i = 0; i < list.size(); i++) {  
79 - Camera.Size cur = list.get(i);  
80 - float prop = (float) cur.width / (float) cur.height;  
81 - if (Math.abs(rate - prop) < previewDisparity) {  
82 - previewDisparity = Math.abs(rate - prop);  
83 - index = i;  
84 - }  
85 - }  
86 - return list.get(index);  
87 - }  
88 -  
89 -  
90 - private boolean equalRate(Camera.Size s, float rate) {  
91 - float r = (float) (s.width) / (float) (s.height);  
92 - return Math.abs(r - rate) <= 0.2;  
93 - }  
94 -  
95 - public boolean isSupportedFocusMode(List<String> focusList, String focusMode) {  
96 - for (int i = 0; i < focusList.size(); i++) {  
97 - if (focusMode.equals(focusList.get(i))) {  
98 - Log.i(TAG, "FocusMode supported " + focusMode);  
99 - return true;  
100 - }  
101 - }  
102 - Log.i(TAG, "FocusMode not supported " + focusMode);  
103 - return false;  
104 - }  
105 -  
106 - public boolean isSupportedPictureFormats(List<Integer> supportedPictureFormats, int jpeg) {  
107 - for (int i = 0; i < supportedPictureFormats.size(); i++) {  
108 - if (jpeg == supportedPictureFormats.get(i)) {  
109 - Log.i(TAG, "Formats supported " + jpeg);  
110 - return true;  
111 - }  
112 - }  
113 - Log.i(TAG, "Formats not supported " + jpeg);  
114 - return false;  
115 - }  
116 -  
117 - private class CameraSizeComparator implements Comparator<Camera.Size> {  
118 - public int compare(Camera.Size lhs, Camera.Size rhs) {  
119 - if (lhs.width == rhs.width) {  
120 - return 0;  
121 - } else if (lhs.width > rhs.width) {  
122 - return 1;  
123 - } else {  
124 - return -1;  
125 - }  
126 - }  
127 -  
128 - }  
129 -  
130 - public int getCameraDisplayOrientation(Context context, int cameraId) {  
131 - Camera.CameraInfo info = new Camera.CameraInfo();  
132 - try {  
133 - Camera.getCameraInfo(cameraId, info);  
134 - } catch (Exception e) {  
135 - Log.e("CameraInterface", "像机ID识别错误", e);  
136 - AlertUtil.showFailedToast(context,"像机ID识别错误"+cameraId);  
137 - }  
138 - WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
139 - int rotation = wm.getDefaultDisplay().getRotation();  
140 - int degrees = 0;  
141 - switch (rotation) {  
142 - case Surface.ROTATION_0:  
143 - degrees = 0;  
144 - break;  
145 - case Surface.ROTATION_90:  
146 - degrees = 90;  
147 - break;  
148 - case Surface.ROTATION_180:  
149 - degrees = 180;  
150 - break;  
151 - case Surface.ROTATION_270:  
152 - degrees = 270;  
153 - break;  
154 - }  
155 - int result;  
156 - if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {  
157 - result = (info.orientation + degrees) % 360;  
158 - result = (360 - result) % 360; // compensate the mirror  
159 - } else {  
160 - // back-facing  
161 - result = (info.orientation - degrees + 360) % 360;  
162 - }  
163 - return result;  
164 - }  
165 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/util/CheckPermission.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -import android.hardware.Camera;  
4 -import android.media.AudioFormat;  
5 -import android.media.AudioRecord;  
6 -import android.media.MediaRecorder;  
7 -import android.util.Log;  
8 -  
9 -/**  
10 - * =====================================  
11 - * 作 者: 陈嘉桐  
12 - * 版 本:1.1.4  
13 - * 创建日期:2017/6/8  
14 - * 描 述:  
15 - * =====================================  
16 - */  
17 -public class CheckPermission {  
18 - public static final int STATE_RECORDING = -1;  
19 - public static final int STATE_NO_PERMISSION = -2;  
20 - public static final int STATE_SUCCESS = 1;  
21 -  
22 - /**  
23 - * 用于检测是否具有录音权限  
24 - *  
25 - * @return  
26 - */  
27 - public static int getRecordState() {  
28 - AudioRecord audioRecord =null;  
29 - int minBuffer = AudioRecord.getMinBufferSize(44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat  
30 - .ENCODING_PCM_16BIT);  
31 - try {  
32 - audioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 44100, AudioFormat  
33 - .CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, (minBuffer * 100));  
34 - }catch (Exception e){  
35 -  
36 - };  
37 - if(audioRecord==null){  
38 - return STATE_NO_PERMISSION;  
39 - }  
40 - short[] point = new short[minBuffer];  
41 - int readSize = 0;  
42 - try {  
43 -  
44 - audioRecord.startRecording();//检测是否可以进入初始化状态  
45 - } catch (Exception e) {  
46 - if (audioRecord != null) {  
47 - audioRecord.release();  
48 - audioRecord = null;  
49 - }  
50 - return STATE_NO_PERMISSION;  
51 - }  
52 - if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {  
53 - //6.0以下机型都会返回此状态,故使用时需要判断bulid版本  
54 - //检测是否在录音中  
55 - if (audioRecord != null) {  
56 - audioRecord.stop();  
57 - audioRecord.release();  
58 - audioRecord = null;  
59 - Log.d("CheckAudioPermission", "录音机被占用");  
60 - }  
61 - return STATE_RECORDING;  
62 - } else {  
63 - //检测是否可以获取录音结果  
64 -  
65 - readSize = audioRecord.read(point, 0, point.length);  
66 -  
67 -  
68 - if (readSize <= 0) {  
69 - if (audioRecord != null) {  
70 - audioRecord.stop();  
71 - audioRecord.release();  
72 - audioRecord = null;  
73 -  
74 - }  
75 - Log.d("CheckAudioPermission", "录音的结果为空");  
76 - return STATE_NO_PERMISSION;  
77 -  
78 - } else {  
79 - if (audioRecord != null) {  
80 - audioRecord.stop();  
81 - audioRecord.release();  
82 - audioRecord = null;  
83 -  
84 - }  
85 -  
86 - return STATE_SUCCESS;  
87 - }  
88 - }  
89 - }  
90 -  
91 - public synchronized static boolean isCameraUseable(int cameraID) {  
92 - boolean canUse = true;  
93 - Camera mCamera = null;  
94 - try {  
95 - mCamera = Camera.open(cameraID);  
96 - // setParameters 是针对魅族MX5。MX5通过Camera.open()拿到的Camera对象不为null  
97 - Camera.Parameters mParameters = mCamera.getParameters();  
98 - mCamera.setParameters(mParameters);  
99 - } catch (Exception e) {  
100 - e.printStackTrace();  
101 - canUse = false;  
102 - } finally {  
103 - if (mCamera != null) {  
104 - mCamera.release();  
105 - } else {  
106 - canUse = false;  
107 - }  
108 - mCamera = null;  
109 - }  
110 - return canUse;  
111 - }  
112 -}  
113 \ No newline at end of file 0 \ No newline at end of file
core/base/src/main/java/com/cjt2325/cameralibrary/util/DeviceUtil.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -import android.os.Build;  
4 -  
5 -/**  
6 - * =====================================  
7 - * 作 者: 陈嘉桐  
8 - * 版 本:1.1.4  
9 - * 创建日期:2017/6/9  
10 - * 描 述:  
11 - * =====================================  
12 - */  
13 -public class DeviceUtil {  
14 -  
15 - private static String[] huaweiRongyao = {  
16 - "hwH60", //荣耀6  
17 - "hwPE", //荣耀6 plus  
18 - "hwH30", //3c  
19 - "hwHol", //3c畅玩版  
20 - "hwG750", //3x  
21 - "hw7D", //x1  
22 - "hwChe2", //x1  
23 - };  
24 -  
25 - public static String getDeviceInfo() {  
26 - String handSetInfo =  
27 - "手机型号:" + Build.DEVICE +  
28 - "\n系统版本:" + Build.VERSION.RELEASE +  
29 - "\nSDK版本:" + Build.VERSION.SDK_INT;  
30 - return handSetInfo;  
31 - }  
32 -  
33 - public static String getDeviceModel() {  
34 - return Build.DEVICE;  
35 - }  
36 -  
37 - public static boolean isHuaWeiRongyao() {  
38 - int length = huaweiRongyao.length;  
39 - for (int i = 0; i < length; i++) {  
40 - if (huaweiRongyao[i].equals(getDeviceModel())) {  
41 - return true;  
42 - }  
43 - }  
44 - return false;  
45 - }  
46 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/util/FileUtil.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -import android.content.Context;  
4 -import android.graphics.Bitmap;  
5 -import android.os.Build;  
6 -import android.os.Environment;  
7 -  
8 -import java.io.BufferedOutputStream;  
9 -import java.io.File;  
10 -import java.io.FileOutputStream;  
11 -import java.io.IOException;  
12 -  
13 -/**  
14 - * =====================================  
15 - * 作 者: 陈嘉桐  
16 - * 版 本:1.1.4  
17 - * 创建日期:2017/4/25  
18 - * 描 述:  
19 - * =====================================  
20 - */  
21 -public class FileUtil {  
22 - private static final String TAG = "CJT";  
23 - private static String storagePath = "";  
24 - private static String DST_FOLDER_NAME = "JCamera";  
25 -  
26 - private static String initPath(Context context) {  
27 - if (storagePath.equals("")) {  
28 - storagePath = (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q ? context.getExternalFilesDir("") : Environment.getExternalStorageDirectory()).getAbsolutePath() + File.separator + DST_FOLDER_NAME;  
29 - File f = new File(storagePath);  
30 - if (!f.exists()) {  
31 - f.mkdir();  
32 - }  
33 - }  
34 - return storagePath;  
35 - }  
36 -  
37 - public static String saveBitmap(Context context,String dir, Bitmap b) {  
38 - DST_FOLDER_NAME = dir;  
39 -  
40 - String path = initPath(context);  
41 - long dataTake = System.currentTimeMillis();  
42 - String jpegName = path + File.separator + "picture_" + dataTake + ".jpg";  
43 - try {  
44 - FileOutputStream fout = new FileOutputStream(jpegName);  
45 - BufferedOutputStream bos = new BufferedOutputStream(fout);  
46 - b.compress(Bitmap.CompressFormat.JPEG, 100, bos);  
47 - bos.flush();  
48 - bos.close();  
49 - return jpegName;  
50 - } catch (IOException e) {  
51 - e.printStackTrace();  
52 - return "";  
53 - }  
54 - }  
55 -  
56 - public static boolean deleteFile(String url) {  
57 - boolean result = false;  
58 - File file = new File(url);  
59 - if (file.exists()) {  
60 - result = file.delete();  
61 - }  
62 - return result;  
63 - }  
64 -  
65 - public static boolean isExternalStorageWritable() {  
66 - String state = Environment.getExternalStorageState();  
67 - if (Environment.MEDIA_MOUNTED.equals(state)) {  
68 - return true;  
69 - }  
70 - return false;  
71 - }  
72 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/util/LogUtil.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -import android.util.Log;  
4 -  
5 -  
6 -/**  
7 - * =====================================  
8 - * 作 者: 陈嘉桐  
9 - * 版 本:1.1.4  
10 - * 创建日期:2017/9/7  
11 - * 描 述:  
12 - * =====================================  
13 - */  
14 -public class LogUtil {  
15 -  
16 - private static final String DEFAULT_TAG = "CJT";  
17 -  
18 - public static void i(String tag, String msg) {  
19 -// if (DEBUG)  
20 - Log.i(tag, msg);  
21 - }  
22 -  
23 - public static void v(String tag, String msg) {  
24 - Log.v(tag, msg);  
25 - }  
26 -  
27 - public static void d(String tag, String msg) {  
28 - Log.d(tag, msg);  
29 - }  
30 -  
31 - public static void e(String tag, String msg) {  
32 - Log.e(tag, msg);  
33 - }  
34 -  
35 - public static void i(String msg) {  
36 - i(DEFAULT_TAG, msg);  
37 - }  
38 -  
39 - public static void v(String msg) {  
40 - v(DEFAULT_TAG, msg);  
41 - }  
42 -  
43 - public static void d(String msg) {  
44 - d(DEFAULT_TAG, msg);  
45 - }  
46 -  
47 - public static void e(String msg) {  
48 - e(DEFAULT_TAG, msg);  
49 - }  
50 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/util/ScreenUtils.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.util;  
2 -  
3 -import android.content.Context;  
4 -import android.util.DisplayMetrics;  
5 -import android.util.TypedValue;  
6 -import android.view.WindowManager;  
7 -  
8 -/**  
9 - * =====================================  
10 - * 作 者: 陈嘉桐  
11 - * 版 本:1.1.4  
12 - * 创建日期:2017/5/25  
13 - * 描 述:  
14 - * =====================================  
15 - */  
16 -public class ScreenUtils {  
17 - public static int getScreenHeight(Context context) {  
18 - DisplayMetrics metric = new DisplayMetrics();  
19 - WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
20 - wm.getDefaultDisplay().getMetrics(metric);  
21 - return metric.heightPixels;  
22 - }  
23 -  
24 - public static int getScreenWidth(Context context) {  
25 - DisplayMetrics metric = new DisplayMetrics();  
26 - WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
27 - wm.getDefaultDisplay().getMetrics(metric);  
28 - return metric.widthPixels;  
29 - }  
30 - /**  
31 - * dp转px  
32 - *  
33 - * @param context  
34 - * @param dpVal  
35 - * @return  
36 - */  
37 - public static int dp2px(Context context, float dpVal) {  
38 - return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,  
39 - dpVal, context.getResources().getDisplayMetrics());  
40 - }  
41 -  
42 - /**  
43 - * sp转px  
44 - *  
45 - * @param context  
46 - * @param spVal  
47 - * @return  
48 - */  
49 - public static int sp2px(Context context, float spVal) {  
50 - return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,  
51 - spVal, context.getResources().getDisplayMetrics());  
52 - }  
53 -  
54 - /**  
55 - * px转dp  
56 - *  
57 - * @param context  
58 - * @param pxVal  
59 - * @return  
60 - */  
61 - public static float px2dp(Context context, float pxVal) {  
62 - final float scale = context.getResources().getDisplayMetrics().density;  
63 - return (pxVal / scale);  
64 - }  
65 -  
66 - /**  
67 - * px转sp  
68 - *  
69 - * @param context  
70 - * @param pxVal  
71 - * @return  
72 - */  
73 - public static float px2sp(Context context, float pxVal) {  
74 - return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);  
75 - }  
76 -}  
core/base/src/main/java/com/cjt2325/cameralibrary/view/CameraView.java deleted 100644 → 0
1 -package com.cjt2325.cameralibrary.view;  
2 -  
3 -import android.graphics.Bitmap;  
4 -  
5 -/**  
6 - * =====================================  
7 - * 作 者: 陈嘉桐  
8 - * 版 本:1.1.4  
9 - * 创建日期:2017/9/8  
10 - * 描 述:  
11 - * =====================================  
12 - */  
13 -public interface CameraView {  
14 - void resetState(int type);  
15 -  
16 - void confirmState(int type);  
17 -  
18 - void showPicture(Bitmap bitmap, boolean isVertical);  
19 -  
20 - void playVideo(String url);  
21 -  
22 - void stopVideo();  
23 -  
24 - void setTip(String tip);  
25 -  
26 - void startPreviewCallback();  
27 -  
28 - boolean handlerFoucs(float x, float y);  
29 -  
30 - void pausePlayer();  
31 - void resumePlayer();  
32 -}  
core/base/src/main/java/com/cnlive/libs/base/frame/activity/BaseActivity.java
@@ -4,7 +4,6 @@ package com.cnlive.libs.base.frame.activity; @@ -4,7 +4,6 @@ package com.cnlive.libs.base.frame.activity;
4 import android.annotation.SuppressLint; 4 import android.annotation.SuppressLint;
5 import android.content.Context; 5 import android.content.Context;
6 import android.content.pm.ActivityInfo; 6 import android.content.pm.ActivityInfo;
7 -import android.database.DatabaseUtils;  
8 import android.os.Bundle; 7 import android.os.Bundle;
9 import android.os.Looper; 8 import android.os.Looper;
10 import android.view.View; 9 import android.view.View;
@@ -23,7 +22,6 @@ import androidx.databinding.ViewDataBinding; @@ -23,7 +22,6 @@ import androidx.databinding.ViewDataBinding;
23 22
24 import com.cnlive.libs.base.util.StatusBarConfig; 23 import com.cnlive.libs.base.util.StatusBarConfig;
25 import com.cnlive.libs.base.util.StatusBarUtil; 24 import com.cnlive.libs.base.util.StatusBarUtil;
26 -import com.cnlive.libs.base.util.lib_permisshelper.PermissionsUtils;  
27 import com.cnlive.libs.base.util.ActivityCollector; 25 import com.cnlive.libs.base.util.ActivityCollector;
28 26
29 /** 27 /**
@@ -42,7 +40,6 @@ public abstract class BaseActivity extends AppCompatActivity { @@ -42,7 +40,6 @@ public abstract class BaseActivity extends AppCompatActivity {
42 //封装Toast对象 40 //封装Toast对象
43 private static Toast toast; 41 private static Toast toast;
44 public Context context; 42 public Context context;
45 - private PermissionsUtils mPermissionsUtils;//权限申请  
46 private int stateBarColor = -1; 43 private int stateBarColor = -1;
47 public ViewDataBinding binding; 44 public ViewDataBinding binding;
48 45
@@ -68,7 +65,6 @@ public abstract class BaseActivity extends AppCompatActivity { @@ -68,7 +65,6 @@ public abstract class BaseActivity extends AppCompatActivity {
68 } else { 65 } else {
69 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 66 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
70 } 67 }
71 - mPermissionsUtils = new PermissionsUtils();//权限申请  
72 //初始化控件 68 //初始化控件
73 initView(); 69 initView();
74 //设置数据 70 //设置数据
core/base/src/main/java/com/cnlive/libs/base/logic/Config.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic;  
2 -  
3 -/**  
4 - * Created by xiansong on 2018/1/4.  
5 - */  
6 -  
7 -public class Config {  
8 -  
9 - //成功状态  
10 - public static final int SUCCESS = 0;  
11 - //失败状态  
12 - public static final int FAIL = -1;  
13 - //系统错误  
14 - public static final int ERROR_SYSTEM = 2003;  
15 - //上传/下载错误  
16 - public static final int ERROR_UPLOAD = 2004;  
17 - //空闲状态  
18 - public static final int STATE_IDLE = 3001;  
19 - //加载状态  
20 - public static final int STATE_LOAD = 3002;  
21 -  
22 - public static final String ERROR_DEF = "%S_ERROR_%s code:%s message:%s";  
23 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/Event.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic;  
2 -  
3 -  
4 -  
5 -import com.cnlive.libs.base.logic.callback.Callback;  
6 -import com.cnlive.libs.base.logic.callback.FailureCallback;  
7 -import com.cnlive.libs.base.logic.callback.CancelCallback;  
8 -import com.cnlive.libs.base.logic.callback.ProgressCallback;  
9 -import com.cnlive.libs.base.logic.callback.StateCallback;  
10 -import com.cnlive.libs.base.logic.callback.SuccessCallback;  
11 -  
12 -import java.util.ArrayList;  
13 -import java.util.HashMap;  
14 -import java.util.List;  
15 -import java.util.Map;  
16 -  
17 -import io.reactivex.disposables.Disposable;  
18 -  
19 -/**  
20 - * Created by xiansong on 2018/1/8.  
21 - */  
22 -  
23 -public class Event<T> {  
24 -  
25 - private static final int success_call = 1;  
26 - private static final int failure_call = 2;  
27 - private static final int state_call = 3;  
28 - private static final int cancel_call = 4;  
29 - private static final int progress_call = 5;  
30 -  
31 - public boolean active = true;  
32 - private Logic logic;  
33 - private List<Disposable> disposables = new ArrayList<>();  
34 - private Map<Integer, Callback> callbackArray;  
35 -  
36 - public Event() {  
37 - this.callbackArray = new HashMap<>();  
38 - }  
39 -  
40 - public void setLogic(Logic logic) {  
41 - this.logic = logic;  
42 - }  
43 -  
44 - public Event<T> setSuccessCallback(SuccessCallback<T> callback) {  
45 - callbackArray.put(success_call, callback);  
46 - return this;  
47 - }  
48 -  
49 - public Event<T> setFailureCallback(FailureCallback callback) {  
50 - callbackArray.put(failure_call, callback);  
51 - return this;  
52 - }  
53 -  
54 - public Event<T> setStateCallback(StateCallback callback) {  
55 - callbackArray.put(state_call, callback);  
56 - return this;  
57 - }  
58 -  
59 - public Event<T> setCancelCallback(CancelCallback callback) {  
60 - callbackArray.put(cancel_call, callback);  
61 - return this;  
62 - }  
63 -  
64 - public Event<T> setProgressCallback(ProgressCallback callback) {  
65 - callbackArray.put(progress_call, callback);  
66 - return this;  
67 - }  
68 -  
69 - public Event<T> addDisposable(Disposable disposable) {  
70 - if (disposable != null) disposables.add(disposable);  
71 - return this;  
72 - }  
73 -  
74 - public void onSuccess(T data) {  
75 - active = false;  
76 - SuccessCallback<T> callback = (SuccessCallback<T>) callbackArray.get(success_call);  
77 - if (callback != null) callback.onSuccess(data);  
78 - }  
79 -  
80 - public void onFailure(int state, String message) {  
81 - active = false;  
82 - FailureCallback callback = (FailureCallback) callbackArray.get(failure_call);  
83 - if (callback != null) callback.onFailure(state, message);  
84 - }  
85 -  
86 - public void onState(int state) {  
87 - StateCallback callback = (StateCallback) callbackArray.get(state_call);  
88 - if (callback != null) callback.onState(state);  
89 - }  
90 -  
91 - public void onCancle() {  
92 - CancelCallback callback = (CancelCallback) callbackArray.get(cancel_call);  
93 - if (callback != null) callback.onCancel();  
94 - destroy();  
95 - }  
96 -  
97 - public void onProgress(double progress) {  
98 - ProgressCallback callback = (ProgressCallback) callbackArray.get(progress_call);  
99 - if (callback != null) callback.onProgress(progress);  
100 - }  
101 -  
102 - public void cencel() {  
103 - onCancle();  
104 - }  
105 -  
106 - private void destroy() {  
107 - active = false;  
108 - callbackArray.clear();  
109 - if (disposables != null) for (Disposable disposable : disposables) disposable.dispose();  
110 - }  
111 -  
112 - public Event<T> start() {  
113 - if (logic != null) logic.start(this);  
114 - return this;  
115 - }  
116 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/Logic.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic;  
2 -  
3 -  
4 -import android.util.Log;  
5 -  
6 -import com.cnlive.libs.base.logic.callback.DataCallback;  
7 -  
8 -import java.util.ArrayList;  
9 -import java.util.HashMap;  
10 -import java.util.List;  
11 -import java.util.Map;  
12 -  
13 -import io.reactivex.Observable;  
14 -import io.reactivex.ObservableOnSubscribe;  
15 -import io.reactivex.android.schedulers.AndroidSchedulers;  
16 -import io.reactivex.disposables.Disposable;  
17 -import io.reactivex.functions.Consumer;  
18 -import io.reactivex.schedulers.Schedulers;  
19 -  
20 -public class Logic {  
21 - private Event event;  
22 -  
23 - protected List<BaseAction> actions;  
24 -  
25 - private Object startParem;  
26 -  
27 - private Paramer paramer = new Paramer();  
28 -  
29 - protected Logic(Object startParem) {  
30 - this.startParem = startParem;  
31 - actions = new ArrayList<>();  
32 - }  
33 -  
34 - public static Logic create(Object startParem) {  
35 - return new Logic(startParem);  
36 - }  
37 -  
38 - public static Logic create() {  
39 - return new Logic(null);  
40 - }  
41 -  
42 - public <param, result> Logic action(Action<param, result> action) {  
43 - if (action == null) return this;  
44 - actions.add(action);  
45 - return this;  
46 - }  
47 -  
48 - public <param, result> Logic action(ActionMerge<param, result> action) {  
49 - if (action == null) return this;  
50 - actions.add(action);  
51 - return this;  
52 - }  
53 -  
54 - private int action_index = -1;  
55 -  
56 - private boolean inStart() {  
57 - return action_index != -1;  
58 - }  
59 -  
60 - private <Data, Return> void next(Data data) {  
61 - BaseAction action = actions.get(action_index++);  
62 - BaseAction newAction = action_index < actions.size() ? actions.get(action_index) : null;  
63 - LogicCallback<Return> callback = new LogicCallback<>(event, newAction);  
64 - Disposable disposable = null;  
65 - Exception exception = null;  
66 - try {  
67 - if (action == null) return;  
68 - if (action instanceof Action) disposable = ((Action) action).action(data, callback);  
69 - if (action instanceof ActionMerge) disposable = ((ActionMerge) action).action(data, paramer, callback);  
70 - } catch (Exception e) {  
71 - exception = e;  
72 - Log.e("Logic", "页面逻辑出错!", e);  
73 - }  
74 -  
75 - if (disposable != null) event.addDisposable(disposable);  
76 - else if (exception != null) onError(Config.FAIL, exception.getMessage(), event);  
77 - }  
78 -  
79 - public <T> Event<T> event() {  
80 - if (event != null) return event;  
81 - event = new Event<T>();  
82 - event.setLogic(this);  
83 - return event;  
84 - }  
85 -  
86 - //  
87 - public void start(Event event) {  
88 - if (event == null) return;  
89 - if (inStart()) return;  
90 -  
91 - this.action_index = 0;  
92 - this.event = event;  
93 -  
94 - if (event.active) {  
95 - event.onState(Config.STATE_LOAD);  
96 - next(startParem);  
97 - }  
98 - }  
99 -  
100 - public interface Execute<T> {  
101 - T execute();  
102 - }  
103 -  
104 - private static String getErrorMessage(Throwable throwable) {  
105 - return throwable != null ? throwable.getMessage() : "";  
106 - }  
107 -  
108 - public static <T> Disposable process(Execute<T> exce, DataCallback<T> callback) {  
109 - Consumer<T> successEV = data -> {  
110 - if (callback != null) callback.callback(Config.SUCCESS, "", data);  
111 - };  
112 - Consumer<Throwable> errorEV = throwable -> {  
113 - if (callback != null) callback.callback(Config.FAIL, getErrorMessage(throwable), null);  
114 - };  
115 - return Observable  
116 - .create((ObservableOnSubscribe<T>) emitter -> emitter.onNext(exce.execute()))  
117 - .subscribeOn(Schedulers.io())  
118 - .observeOn(AndroidSchedulers.mainThread())  
119 - .subscribe(successEV, errorEV);  
120 - }  
121 -  
122 - private interface BaseAction {  
123 - }  
124 -  
125 - public interface Action<param, result> extends BaseAction {  
126 - Disposable action(param data, DataCallback<result> callback);  
127 - }  
128 -  
129 - public interface ActionMerge<param, result> extends BaseAction {  
130 - Disposable action(param data, Paramer paramer, DataCallback<result> callback);  
131 - }  
132 -  
133 - public class LogicCallback<T> implements DataCallback<T> {  
134 - private BaseAction action;  
135 - private Event event;  
136 -  
137 - private LogicCallback(Event event, BaseAction action) {  
138 - this.event = event;  
139 - this.action = action;  
140 - }  
141 -  
142 - @Override  
143 - public void callback(int code, String message, T data) {  
144 - if (code == Config.SUCCESS) {  
145 - if (event.active) {  
146 - if (action != null) next(data);  
147 - else {  
148 - event.onState(Config.STATE_IDLE);  
149 - event.onSuccess(data);  
150 - }  
151 - }  
152 - } else onError(code, message, event);  
153 - }  
154 - }  
155 -  
156 - private void onError(int code, String message, Event event) {  
157 - if (event.active) {  
158 - event.onState(Config.STATE_IDLE);  
159 - event.onFailure(code, message);  
160 - }  
161 - }  
162 -  
163 - public static class Paramer {  
164 - private Map<String, Object> map = new HashMap<>();  
165 -  
166 - public void addParamer(String key, Object value) {  
167 - map.put(key, value);  
168 - }  
169 -  
170 - public <T> T getParamer(String key) {  
171 - return (T) map.get(key);  
172 - }  
173 - }  
174 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/callback/Callback.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic.callback;  
2 -  
3 -/**  
4 - * Created by xiansong on 2018/1/8.  
5 - */  
6 -  
7 -public interface Callback {  
8 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/callback/CancelCallback.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic.callback;  
2 -  
3 -/**  
4 - * Created by xiansong on 2018/1/10.  
5 - */  
6 -  
7 -public interface CancelCallback extends Callback {  
8 - void onCancel();  
9 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/callback/DataCallback.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic.callback;  
2 -  
3 -/**  
4 - * Created by xiansong on 2018/1/8.  
5 - */  
6 -  
7 -public interface DataCallback<T> extends Callback{  
8 - //内部数据传递  
9 - void callback(int code, String message, T data);  
10 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/callback/FailureCallback.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic.callback;  
2 -  
3 -public interface FailureCallback extends Callback{  
4 - //逻辑操作错误事件 ,不影响逻辑代码. 如:Load_xxx_error 或 Input_xxx_empty  
5 - void onFailure(int state, String message);  
6 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/callback/ProgressCallback.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic.callback;  
2 -  
3 -/**  
4 - * Created by xiansong on 2018/2/1.  
5 - */  
6 -  
7 -public interface ProgressCallback extends Callback{  
8 - void onProgress(double progress);  
9 -}  
core/base/src/main/java/com/cnlive/libs/base/logic/callback/StateCallback.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic.callback;  
2 -  
3 -public interface StateCallback extends Callback {  
4 - //逻辑操作中的状态更新事件.  
5 - void onState(int state);  
6 -}  
7 \ No newline at end of file 0 \ No newline at end of file
core/base/src/main/java/com/cnlive/libs/base/logic/callback/SuccessCallback.java deleted 100644 → 0
1 -package com.cnlive.libs.base.logic.callback;  
2 -  
3 -public interface SuccessCallback<T> extends Callback {  
4 - //逻辑操作成功事件响应  
5 - void onSuccess(T data);  
6 -}  
7 \ No newline at end of file 0 \ No newline at end of file