android开发,sdk版本是4.4,camera权限写了,但是还是无法调用相机,这是为什么?求大神帮忙

2022-03-21 财经 200阅读
可能是java代码上有问题,可以参考如下拍照流程检查一下:
拍照流程
上面简单介绍了下准备工作,下面结合拍照过程中的需要用到的API对拍照流程做下简单描述
1、在Activity的OnCreate函数中设置好SurfaceView,包括设置SurfaceHolder.Callback对象和SurfaceHolder对象的类型,具体如下
SurfaceViewmpreview=(SurfaceView)this.findViewById(R.id.camera_preview);
SurfaceHoldermSurfaceHolder=mpreview.getHolder();
mSurfaceHolder.addCallback(this);
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
2、在SurfaceHolder.Callback的surfaceCreated函数中,使用Camera的Open函数开机摄像头硬件,这个API在SDK2.3之前,是没有参数的,2.3以后支持多摄像头,所以开启前可以通过getNumberOfCameras先获取摄像头数目,再通过getCameraInfo得到需要开启的摄像头id,然后传入Open函数开启摄像头,假如摄像头开启成功则返回一个Camera对象,否则就抛出异常;
3、开启成功的情况下,在SurfaceHolder.Callback的surfaceChanged函数中调用getParameters函数得到已打开的摄像头的配置参数Parameters对象,如果有需要就修改对象的参数,然后调用setParameters函数设置进去(SDK2.2以后,还可以通过Camera::setDisplayOrientation设置方向);
4、同样在surfaceChanged函数中,通过Camera::setPreviewDisplay为摄像头设置SurfaceHolder对象,设置成功后调用Camera::startPreview函数开启预览功能,上面3,4两步的代码可以如下所示
publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intw,inth)
{
//已经获得Surface的width和height,设置Camera的参数
Camera.Parametersparameters=camera.getParameters();
parameters.setPreviewSize(w,h);
ListvSizeList=parameters.getSupportedPictureSizes();
for(intnum=0;num{
SizevSize=vSizeList.get(num);
}
if(this.getResources().getConfiguration().orientation!=Configuration.ORIENTATION_LANDSCAPE)
{
//如果是竖屏
parameters.set("orientation","portrait");
//在2.2以上可以使用
//camera.setDisplayOrientation(90);
}
else
{
parameters.set("orientation","landscape");
//在2.2以上可以使用
//camera.setDisplayOrientation(0);
}
camera.setParameters(parameters);
try{
//设置显示
camera.setPreviewDisplay(holder);
}catch(IOExceptionexception){
camera.release();
camera=null;
}
//开始预览
camera.startPreview();
}
5、假设要支持自动对焦功能,则在需要的情况下,或者在上述surfaceChanged调用完startPreview函数后,可以调用Camera::autoFocus函数来设置自动对焦回调函数,该步是可选操作,有些设备可能不支持,可以通过Camera::getFocusMode函数查询。代码可以参考如下:
//自动对焦
camera.autoFocus(newAutoFocusCallback()
{
@Override
publicvoidonAutoFocus(booleansuccess,Cameracamera)
{
if(success)
{
//success为true表示对焦成功,改变对焦状态图像
ivFocus.setImageResource(R.drawable.focus2);
}
}
});
6、在需要拍照的时候,调用takePicture(Camera.ShutterCallback,Camera.PictureCallback,Camera.PictureCallback,Camera.PictureCallback)函数来完成拍照,这个函数中可以四个回调接口,ShutterCallback是快门按下的回调,在这里我们可以设置播放“咔嚓”声之类的操作,后面有三个PictureCallback接口,分别对应三份图像数据,分别是原始图像、缩放和压缩图像和JPG图像,图像数据可以在PictureCallback接口的voidonPictureTaken(byte[]data,Cameracamera)中获得,三份数据相应的三个回调正好按照参数顺序调用,通常我们只关心JPG图像数据,此时前面两个PictureCallback接口参数可以直接传null;
7、每次调用takePicture获取图像后,摄像头会停止预览,假如需要继续拍照,则我们需要在上面的PictureCallback的onPictureTaken函数末尾,再次掉哟更Camera::startPreview函数;
8、在不需要拍照的时候,我们需要主动调用Camera::stopPreview函数停止预览功能,并且调用Camera::release函数释放Camera,以便其他应用程序调用。SDK中建议放在Activity的Pause函数中,但是我觉得放在surfaceDestroyed函数中更好,示例代码如下
//停止拍照时调用该方法
publicvoidsurfaceDestroyed(SurfaceHolderholder)
{
//释放手机摄像头
camera.release();
}
以上就是自己实现拍照程序的的流程,一般还可以还可以获取预览帧的图像数据,可以分别通过Camera::setPreviewCallback和Camera::setOneShotPreviewCallback来设置每帧或下一帧图像数据的回调,这里就不做展开了。
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com