我是Android编程的初学者,我想在显示蓝屏的同时用前置摄像头拍照。因此蓝屏在图片上就像一个蓝色滤镜。
我已经关注了这个tuto:link
但是我有一个NullPointer:mCamera.setPreviewDisplay(holder);
尽管我声明了相机,并从surfaceView获取Holder,就像在tuto中一样。
有什么想法吗?
这是我的代码:
public class TakePicture extends Activity implements SurfaceHolder.Callback
{
private ImageView iv_image;
//a variable to store a reference to the Surface View at the main.xml file
private SurfaceView sv;
//a bitmap to display the captured image
private Bitmap bmp;
//Camera variables
//a surface holder
private SurfaceHolder sHolder;
//a variable to control the camera
private Camera mCamera;
//the camera parameters
private Parameters parameters;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//get the Image View at the main.xml file
iv_image = (ImageView) findViewById(R.id.imageView);
//get the Surface View at the main.xml file
sv = (SurfaceView) findViewById(R.id.surfaceView);
//Get a surface
sHolder = sv.getHolder();
//add the callback interface methods defined below as the Surface View callbacks
sHolder.addCallback(this);
//tells Android that this surface will have its data constantly replaced
sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//surfaceCreated(sHolder);
//surfaceChanged(sHolder, 1, 1, 1);
//surfaceDestroyed(sHolder);
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)
{
//get camera parameters
parameters = mCamera.getParameters();
//set camera parameters
mCamera.setParameters(parameters);
mCamera.startPreview();
//sets what code should be executed after the picture is taken
Camera.PictureCallback mCall = new Camera.PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
//decode the data obtained by the camera into a Bitmap
bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
//set the iv_image
iv_image.setImageBitmap(bmp);
}
};
mCamera.takePicture(null, null, mCall);
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// The Surface has been created, acquire the camera and tell it where
// to draw the preview.
//mCamera = openFrontFacingCameraGingerbread();
//Log.e("COUCOU", "bonjour");
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
//stop the preview
mCamera.stopPreview();
//release the camera
mCamera.release();
//unbind the camera from this object
mCamera = null;
}
}
答案 0 :(得分:2)
mCamera
似乎是null
:
mCamera = Camera.open();
如果设备没有后置摄像头,则返回null。
如果您没有后置摄像头,则需要查看任何可用摄像头的ID。
致电Camera.getNumberOfCameras(),然后将有效的相机ID传递到Camera.open(id)
要查找有关特定相机的更多信息,
拨打Camera.getCameraInfo()
,您可以在其中检查字段以确定它是什么类型的相机