android直接控制照相机硬件技术
2013-04-24 12:09
323 查看
直接控制硬件需要比使用相机应用使用更多的代码来实现。但为了实现特定的应用和将一些功能完全的集成到你的应用程序中,你必须要这么做。
1.打开相机对象。
首先需要获得Camera对象实例。就像Android自身的相机应用一样,在OnCreate()方法中,建立新的线程来代开Camera。我们经常在OnResume()方法中实现,在OnResume()方法中实现的好处是使代码可以被在次使用和简化控制流。调用Camera.open(),如果Camera已经在使用,就抛出一个异常:
private boolean safeCameraOpen(int id)
{
boolean qOpened =
false;
try {
releaseCameraAndPreview();
mCamera = Camera.open(id);
qOpened = (mCamera
!= null);
} catch
(Exception e)
{
Log.e(getString(R.string.app_name),
"failed to open Camera");
e.printStackTrace();
}
return qOpened;
}
private void releaseCameraAndPreview()
{
mPreview.setCamera(null);
if (mCamera
!= null)
{
mCamera.release();
mCamera = null;
}
}
2.创建相机预览。在拍照之前,我们需要提供预览功能,这个功能由SurfaceView实现。
为了实现预览,我们需要实现android.view.SurfaceHolder.Callback接口,它是用来从相机硬件来传递图片的。
class Preview
extends ViewGroup
implements SurfaceHolder.Callback
{
SurfaceView mSurfaceView;
SurfaceHolder mHolder;
Preview(Context context)
{
super(context);
mSurfaceView = new
SurfaceView(context);
addView(mSurfaceView);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
...
}
设置和开启预览。在开始预览之前,我们必须要将预览类传递给camera对象。
public void setCamera(Camera camera)
{
if (mCamera
== camera)
{ return;
}
stopPreviewAndFreeCamera();
mCamera = camera;
if (mCamera
!= null)
{
List<Size> localSizes
= mCamera.getParameters().getSupportedPreviewSizes();
mSupportedPreviewSizes = localSizes;
requestLayout();
try {
mCamera.setPreviewDisplay(mHolder);
} catch
(IOException e)
{
e.printStackTrace();
}
/*
Important: Call startPreview() to start updating the preview surface. Preview must
be started before you can take a picture.
*/
mCamera.startPreview();
}
}
修改相机设置。下面代码是预览大小的设置代码:
public void surfaceChanged(SurfaceHolder holder,
int format,
int w,
int h)
{
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters
= mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
requestLayout();
mCamera.setParameters(parameters);
/*
Important: Call startPreview() to start updating the preview surface. Preview must be
started before you can take a picture.
*/
mCamera.startPreview();
}
使用setCameraDisplayOrientation()设置相机显示的方向。使用Camera.takePicture()来拍照。
重新预览:
@Override
public void onClick(View v)
{
switch(mPreviewState)
{
case K_STATE_FROZEN:
mCamera.startPreview();
mPreviewState = K_STATE_PREVIEW;
break;
default:
mCamera.takePicture(
null, rawCallback,
null);
mPreviewState = K_STATE_BUSY;
} // switch
shutterBtnConfig();
}
停止预览释放相机:
public void surfaceDestroyed(SurfaceHolder holder)
{
// Surface will be destroyed when we return, so stop the preview.
if (mCamera
!= null)
{
/*
Call stopPreview() to stop updating the preview surface.
*/
mCamera.stopPreview();
}
}
/**
* When this function returns, mCamera will be null.
*/
private void stopPreviewAndFreeCamera()
{
if (mCamera
!= null)
{
/*
Call stopPreview() to stop updating the preview surface.
*/
mCamera.stopPreview();
/*
Important: Call release() to release the camera for use by other applications.
Applications should release the camera immediately in onPause() (and re-open() it in
onResume()).
*/
mCamera.release();
mCamera = null;
}
}
1.打开相机对象。
首先需要获得Camera对象实例。就像Android自身的相机应用一样,在OnCreate()方法中,建立新的线程来代开Camera。我们经常在OnResume()方法中实现,在OnResume()方法中实现的好处是使代码可以被在次使用和简化控制流。调用Camera.open(),如果Camera已经在使用,就抛出一个异常:
private boolean safeCameraOpen(int id)
{
boolean qOpened =
false;
try {
releaseCameraAndPreview();
mCamera = Camera.open(id);
qOpened = (mCamera
!= null);
} catch
(Exception e)
{
Log.e(getString(R.string.app_name),
"failed to open Camera");
e.printStackTrace();
}
return qOpened;
}
private void releaseCameraAndPreview()
{
mPreview.setCamera(null);
if (mCamera
!= null)
{
mCamera.release();
mCamera = null;
}
}
2.创建相机预览。在拍照之前,我们需要提供预览功能,这个功能由SurfaceView实现。
为了实现预览,我们需要实现android.view.SurfaceHolder.Callback接口,它是用来从相机硬件来传递图片的。
class Preview
extends ViewGroup
implements SurfaceHolder.Callback
{
SurfaceView mSurfaceView;
SurfaceHolder mHolder;
Preview(Context context)
{
super(context);
mSurfaceView = new
SurfaceView(context);
addView(mSurfaceView);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
...
}
设置和开启预览。在开始预览之前,我们必须要将预览类传递给camera对象。
public void setCamera(Camera camera)
{
if (mCamera
== camera)
{ return;
}
stopPreviewAndFreeCamera();
mCamera = camera;
if (mCamera
!= null)
{
List<Size> localSizes
= mCamera.getParameters().getSupportedPreviewSizes();
mSupportedPreviewSizes = localSizes;
requestLayout();
try {
mCamera.setPreviewDisplay(mHolder);
} catch
(IOException e)
{
e.printStackTrace();
}
/*
Important: Call startPreview() to start updating the preview surface. Preview must
be started before you can take a picture.
*/
mCamera.startPreview();
}
}
修改相机设置。下面代码是预览大小的设置代码:
public void surfaceChanged(SurfaceHolder holder,
int format,
int w,
int h)
{
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters
= mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
requestLayout();
mCamera.setParameters(parameters);
/*
Important: Call startPreview() to start updating the preview surface. Preview must be
started before you can take a picture.
*/
mCamera.startPreview();
}
使用setCameraDisplayOrientation()设置相机显示的方向。使用Camera.takePicture()来拍照。
重新预览:
@Override
public void onClick(View v)
{
switch(mPreviewState)
{
case K_STATE_FROZEN:
mCamera.startPreview();
mPreviewState = K_STATE_PREVIEW;
break;
default:
mCamera.takePicture(
null, rawCallback,
null);
mPreviewState = K_STATE_BUSY;
} // switch
shutterBtnConfig();
}
停止预览释放相机:
public void surfaceDestroyed(SurfaceHolder holder)
{
// Surface will be destroyed when we return, so stop the preview.
if (mCamera
!= null)
{
/*
Call stopPreview() to stop updating the preview surface.
*/
mCamera.stopPreview();
}
}
/**
* When this function returns, mCamera will be null.
*/
private void stopPreviewAndFreeCamera()
{
if (mCamera
!= null)
{
/*
Call stopPreview() to stop updating the preview surface.
*/
mCamera.stopPreview();
/*
Important: Call release() to release the camera for use by other applications.
Applications should release the camera immediately in onPause() (and re-open() it in
onResume()).
*/
mCamera.release();
mCamera = null;
}
}
相关文章推荐
- 管理照相机-控制相机硬件(摘自Android官方培训课程中文版(v0.9.5))
- cocos2d-x 控制android硬件音量大小调节按钮
- 微信公众平台开发(49)物联网硬件设备控制技术
- Android 控制硬件加速hardwareAccelerated的说明
- 基于Google的嵌入式系统android开发语音技术(语音搜索,语音朗读文章,语音控制)
- 操作系统与应用程序的关系 操作系统主要可以分为两大部分:内核和内核之外的一些程序。内核就是直接控制最底层的硬件,而我们日常所用到的软件,大都是通过内核之外一些程序与内核之间的接口完成的,例如WINDO
- Android 控制硬件加速hardwareAccelerated的说明
- Android硬件入门-照相机
- Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件
- 直接应用项目中的Android图片缓存技术
- Android环境下直接测试驱动 | 链接的目录视图包括很多嵌入式驱动技术 | 不错
- 友善之臂4412开发板android应用层通过jni直接控制除LED、蜂鸣器外的其它IO口,系统直接重启问题
- Android培训之直接控制摄像头
- android Camera照相机技术(二)定制拍照
- 关于C语言等高级语言能不能直接控制硬件的问题
- 12月26日,唐攀网络直播讲解《Android手机底层软硬件结合开发技术》
- 访问Android硬件资源の控制设备的振动
- Android 使用NDK处理BItmap及直接控制SurfaceView的Surface的显示
- Android硬件开发之——蓝牙技术
- Android摄像头照相机技术-android学习之旅(八)