Android 摄像头调用(不含拍照)

private Camera camera;

使用getPackageManager().hasSystemFeature的方法查看是否有摄像头设备

private boolean checkCameraHadware(){

if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))

return true;

else return false;

}

打开前置摄像头的方法,先确定摄像头的个数,然后获取前置摄像头的id

用mCamera = android.hardware.Camera.open(camIdx)得到摄像头然后返回它

private android.hardware.Camera openFrontFacingCameraGingerbread(){

int cameraCount; //摄像头个数

Camera mCamera = null; //声明相机变量

Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); //创建相机对象

cameraCount = android.hardware.Camera.getNumberOfCameras();

for(int camIdx = 0 ; camIdx < cameraCount ; camIdx++){

Camera.getCameraInfo(camIdx,cameraInfo); //获取相机对象

//判断是否前置摄像头

if(cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){

try{

mCamera = android.hardware.Camera.open(camIdx); //打开前置摄像头

mCurrentCamIndex = camIdx; //设置前置摄像头id

}catch (RuntimeException e){

Log.e(TAG,“相机打开失败:” + e.getLocalizedMessage());

}

}

}

return mCamera;

}

设置旋转角度

private void setCameraDisplayOrientation(Activity activity,int cameraId,Camera camera){

Camera.CameraInfo info = new Camera.CameraInfo();

Camera.getCameraInfo(cameraId,info);

//获得旋转角度

int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();

int degrees = 0;

switch (rotation) {

case Surface.ROTATION_0: //没有旋转

degrees = 0;

break;

case Surface.ROTATION_90: //旋转90°

degrees = 90;

break;

case Surface.ROTATION_180: //180

degrees = 180;

break;

case Surface.ROTATION_270:

degrees = 270;

break;

}

int result = 0;

if(info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){

//前置摄像头旋转算法

result = (info.orientation + degrees) % 360;

result = (360 - result) % 360;

}else{

result = (info.orientation - degrees + 360) % 360;

}

ROTATE = result + 180;

camera.setDisplayOrientation(result); //设置拍摄角度

}

然后设置焦距和打开的竖屏横屏

private void setCamera(){

if(checkCameraHadware()){

camera = openFrontFacingCameraGingerbread();

//设置摄像头方向调整摄像头旋转90度,成竖屏

setCameraDisplayOrientation(this,mCurrentCamIndex,camera);

Camera.Parameters parameters = camera.getParameters();

parameters.setPictureFormat(ImageFormat.JPEG);

List list= parameters.getSupportedFocusModes(); //获取支持的对焦格式

for(String str : list){

Log.e(TAG,“支持的对焦模式:”+ str );

}

//手机支持的图片尺寸合集

List<Camera.Size> pictureList = parameters.getSupportedPictureSizes();

//手机支持的预览尺寸集合

List<Camera.Size> previewList = parameters.getSupportedPreviewSizes();

//设置为当前使用手机的最大尺寸

parameters.setPictureSize(pictureList.get(0).width,pictureList.get(0).height);

minFocus = parameters.getZoom(); //获得最小焦距

maxFocus = parameters.getMaxZoom();

everyFocus = 1; //每次增加及减少值

nowFocus = minFocus; //当前焦距为最小值

seekBar.setMax(maxFocus); //设置最大焦距

Log.e(TAG,“当前镜头距离:” + minFocus + “\t\t获取最大距离:” + maxFocus); //日志打印

camera.setParameters(parameters);

}

}

最后在surfaceview上打开摄像头

使用了 camera.setPreviewDisplay(holder)来打开

camera.setPreviewCallback(null)、 camera.stopPreview()来关闭

@Override

public void surfaceCreated(SurfaceHolder holder) {

Log.e(“surfaceCreated”,“绘制开始”);

try{

setCamera();

camera.setPreviewDisplay(holder);

} catch (IOException e) {

camera.release();

camera = null;

e.printStackTrace();

}

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{

Log.e(“surfaceChanged”,“绘制改变”);

try{

camera.stopPreview();

camera.setPreviewDisplay(holder);

camera.startPreview();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

Log.e(“surfaceDestroyed”,“绘制结束”);

camera.setPreviewCallback(null);

camera.stopPreview();

camera.release();

camera = null;

}

还有其中对seekbar和buttom的调焦操作

//设置相机参数

private void setZoomValues(int want){

Camera.Parameters parameters = camera.getParameters(); //获得相机参数

seekBar.setProgress(want); //设置进度

parameters.setZoom(want); //设置焦距参数

camera.setParameters(parameters); //设置相机参数,焦距

}

//获取相机参数和当前焦距

private int getZoomValues(){

Camera.Parameters parameters = camera.getParameters();

int values = parameters.getZoom();

return values;

}

//调节焦距

//添加

private void addZoomValues(){

if(nowFocus > maxFocus){

Log.e(TAG,“大于maxFocus是不可能的”);

}else if(nowFocus == maxFocus){

}else {

setZoomValues(getZoomValues() + everyFocus);

}

}

//缩小

private void minusZoomValues(){

if(nowFocus < minFocus){

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取
升又不知道该从何学起的朋友。**

[外链图片转存中…(img-9MoWZ2La-1719168981544)]

[外链图片转存中…(img-J2GLCG5Q-1719168981544)]

[外链图片转存中…(img-Pa4H7qJl-1719168981545)]

[外链图片转存中…(img-ZzB3t64M-1719168981546)]

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码 【微信小程序-毕设期末大作业】微信小程序源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值