package you.xiaochen.camera;
import android.app.Application;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import you.xiaochen.utils.LogUtils;
/**
* Created by you on 2016/10/22.
* 相机管理类
*/
public final class CameraManager {
private Application context;
/**
* camera
*/
private Camera mCamera;
/**
* 视频录制
*/
private MediaRecorder mMediaRecorder;
/**
* 相机闪光状态
*/
private int cameraFlash;
/**
* 前后置状态
*/
private int cameraFacing = Camera.CameraInfo.CAMERA_FACING_BACK;
/**
* 是否支持前置摄像,是否支持闪光
*/
private boolean isSupportFrontCamera, isSupportFlashCamera;
/**
* 录制视频的相关参数
*/
private CamcorderProfile mProfile;
/**
* 0为拍照, 1为录像
*/
private int cameraType;
private CameraManager(Application context) {
this.context = context;
isSupportFrontCamera = CameraUtils.isSupportFrontCamera();
isSupportFlashCamera = CameraUtils.isSupportFlashCamera(context);
if (isSupportFrontCamera) {
cameraFacing = CameraUtils.getCameraFacing(context, Camera.CameraInfo.CAMERA_FACING_BACK);
}
if (isSupportFlashCamera) {
cameraFlash = CameraUtils.getCameraFlash(context);
}
}
private static CameraManager INSTANCE;
public static CameraManager getInstance(Application context) {
if (INSTANCE == null) {
synchronized (CameraManager.class) {
if (INSTANCE == null) {
INSTANCE = new CameraManager(context);
}
}
}
return INSTANCE;
}
/**
* 打开camera
*/
public void openCamera(SurfaceTexture surfaceTexture, int width, int height) {
if (mCamera == null) {
mCamera = Camera.open(cameraFacing);//打开当前选中的摄像头
mProfile = CamcorderProfile.get(cameraFacing, CamcorderProfile.QUALITY_HIGH);
try {
mCamera.setDisplayOrientation(90);//默认竖直拍照
mCamera.setPreviewTexture(surfaceTexture);
initCameraParameters(cameraFacing, width, height);
mCamera.startPreview();
} catch (Exception e) {
LogUtils.i(e);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
}
}
/**
* 开启预览,前提是camera初始化了
*/
public void restartPreview() {
if (mCamera == null) return;
try {
Camera.Parameters parameters = mCamera.getParameters();
int zoom = parameters.getZoom();
if (zoom > 0) {
parameters.setZoom(0);
mCamera.setParameters(parameters);
}
mCamera.startPreview();
} catch (Exception e) {
LogUtils.i(e);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
}
private void initCameraParameters(int cameraId, int width, int height) {
Camera.Parameters parameters = mCamera.getParameters();
if (cameraId == Camera.CameraInfo.CAMERA_FACING_BACK) {
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes != null) {
if (cameraType == 0) {
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
} else {
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
}
}
}
parameters.setRotation(90);//设置旋转代码,
switch (cameraFlash) {
case 0:
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
break;
case 1:
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
break;
case 2:
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
break;
}
List<Camera.Size> pictureSizes = parameters.getSupportedPictureSizes();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
if (!isEmpty(pictureSizes) && !isEmpty(previewSizes)) {
/*for (Camera.Size size : pictureSizes) {
LogUtils.i("pictureSize " + size.width + " " + size.height);
}
for (Camera.Size size : pictureSizes) {
LogUtils.i("previewSize " + size.width + " " + size.height);
}*/
Camera.Size optimalPicSize = getOptimalSize(pictureSizes, width, height);
Camera.Size optimalPreSize = getOptimalSize(previewSizes, width, height);
LogUtils.i("TextureSize "+width+" "+height+" optimalSize pic " + optimalPicSize.width + " " + optimalPicSize.height + " pre " + optimalPreSize.width + " " + optimalPreSize.height);
parameters.setPictureSize(optimalPicSize.width, optimalPicSize.height);
parameters.setPreviewSize(optimalPreSize.width, optimalPreSize.height);
mProfile.videoFrameWidth = optimalPreSize.width;
mProfile.videoFrameHeight = optimalPreSize.height;
mProfile.videoBitRate = 5000000;//此参数主要决定视频拍出大小
}
mCamera.setParameters(parameters);
}
/**
* 释放摄像头
*/
public void closeCamera() {
this.cameraType = 0;
if (mCamera != null) {
try {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
} catch (Exception e) {
LogUtils.i(e);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
}
}
/**
* 集合不为空
*
* @param list
* @param <E>
* @return
*/
private <E> boolean isEmpty(List<E> list) {
return list == null || list.isEmpty();
}
/**
* 获取最佳预览相机Size参数
*
* @return
*/
private Camera.Size getOptimalSize(List<Camera.Size> sizes, int w, int h) {
Camera.Size optimalSize = null;
float targetRadio = h / (float) w;
float optimalDif = Float.MAX_VALUE; //最匹配的比例
int optimalMaxDif = Integer.MAX_VALUE;//最优的最大值差距
for (Camera.Size size : sizes) {
float newOptimal = size.width / (float) size.height;
float newDiff = Math.abs(newOptimal - targetRadio);
if (newDiff < optimalDif) { //更好的尺寸
optimalDif = newDiff;
optimalSize = size;
optimalMaxDif = Math.abs(h - size.width);
} else if (newDiff == optimalDif) {//更好的尺寸
int newOptimalMaxDif = Math.abs(h - size.width);
if (newOptimalMaxDif < optimalMaxDif) {
optimalDif = newDiff;
optimalSize = size;
optimalMaxDif = newOptimal
没有合适的资源?快使用搜索试试~ 我知道了~
高仿微信拍摄
共91个文件
xml:43个
java:13个
png:10个
4星 · 超过85%的资源 需积分: 17 280 下载量 193 浏览量
2017-03-29
09:20:01
上传
评论 3
收藏 127KB ZIP 举报
温馨提示
高仿微信拍照与录制视频
资源推荐
资源详情
资源评论
收起资源包目录
CameraDemo.zip (91个子文件)
CameraDemo
gradlew 5KB
settings.gradle 16B
.idea
libraries
junit_4_12.xml 477B
javax_inject_1.xml 324B
support_compat_25_3_0.xml 595B
support_annotations_25_3_0.xml 495B
javax_annotation_api_1_2.xml 358B
appcompat_v7_25_3_0.xml 585B
exposed_instrumentation_api_publish_0_5.xml 700B
rxandroid_1_2_1.xml 589B
hamcrest_library_1_3.xml 342B
espresso_idling_resource_2_2_2.xml 682B
hamcrest_core_1_3.xml 526B
support_vector_drawable_25_3_0.xml 640B
jsr305_2_0_1.xml 330B
support_core_ui_25_3_0.xml 600B
hamcrest_integration_1_3.xml 354B
support_fragment_25_3_0.xml 605B
espresso_core_2_2_2.xml 627B
support_core_utils_25_3_0.xml 615B
rxjava_1_1_6.xml 501B
rules_0_5.xml 550B
support_media_compat_25_3_0.xml 625B
support_v4_25_3_0.xml 420B
javawriter_2_1_1.xml 330B
animated_vector_drawable_25_3_0.xml 645B
runner_0_5.xml 555B
runConfigurations.xml 564B
misc.xml 2KB
compiler.xml 686B
workspace.xml 173KB
gradle.xml 722B
modules.xml 357B
copyright
profiles_settings.xml 76B
build
intermediates
dex-cache
cache.xml 7KB
generated
mockable-android-25.jar 32.3MB
gradle
wrapper
gradle-wrapper.properties 233B
gradle-wrapper.jar 52KB
.gradle
2.14.1
tasks
_app_compileDebugJavaWithJavac
localJarClasspathSnapshot
localJarClasspathSnapshot.bin 20KB
localJarClasspathSnapshot.lock 17B
localClassSetAnalysis
localClassSetAnalysis.bin 31KB
localClassSetAnalysis.lock 17B
taskArtifacts
fileSnapshotsToTreeSnapshotsIndex.bin 29KB
cache.properties.lock 17B
fileHashes.bin 157KB
taskArtifacts.bin 133KB
fileSnapshots.bin 4.16MB
cache.properties 31B
local.properties 428B
CameraDemo.iml 864B
gradlew.bat 2KB
gradle.properties 747B
.gitignore 127B
app
src
androidTest
java
you
xiaochen
ExampleInstrumentedTest.java 754B
test
java
you
xiaochen
ExampleUnitTest.java 406B
main
AndroidManifest.xml 2KB
res
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
drawable
btn_camera_flash.xml 304B
layout
activity_camera.xml 3KB
activity_main.xml 756B
drawable-xhdpi
camera_facing.png 2KB
camera_close.png 3KB
camera_flash_close.png 2KB
camera_choice.png 3KB
camera_flash_open.png 2KB
values-w820dp
dimens.xml 364B
values
colors.xml 214B
attrs.xml 669B
strings.xml 76B
styles.xml 706B
dimens.xml 216B
mipmap-xxhdpi
ic_launcher.png 8KB
java
you
xiaochen
utils
FileUtils.java 11KB
SPUtils.java 3KB
LogUtils.java 2KB
camera
CameraProgressBar.java 11KB
CameraUtils.java 2KB
MediaPlayerManager.java 2KB
CameraView.java 7KB
ViewClickOnSubscribe.java 2KB
CameraManager.java 17KB
MainActivity.java 940B
CameraActivity.java 15KB
libs
app.iml 13KB
.gitignore 8B
build.gradle 933B
proguard-rules.pro 662B
build.gradle 521B
共 91 条
- 1
RangoY
- 粉丝: 45
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页