I'm trying to draw the camera preview onto a SurfaceHolder with this code:
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
Log.d(TAG, "Releasing camera first, just to make sure");
releaseCamera();
Log.d(TAG, "Opening Camera object.");
mCamera = Camera.open();
if (mCamera == null) {
Log.d(TAG, "Camera is null.");
}
}
@Override
public void onSurfaceCreated(SurfaceHolder holder) {
super.onSurfaceCreated(holder);
Log.d(TAG, "Surface created.");
try {
if (holder == null) {
Log.d(TAG, "SurfaceHolder is empty.");
}
Log.d(TAG, "Setting preview display.");
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
Log.d(TAG, "IOException on setPreviewDisplay.");
releaseCamera();
}
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);
Log.d(TAG, "Surface changed.");
Log.d(TAG, "Starting preview.");
mCamera.startPreview();
}
However, when I run the app, either on the emulator or my actual phone, I get the error "Overlay create failed - retrying" multiple times, followed by "Overlay Creation Failed!". I then get a RuntimeException, stating that "startPreview failed".
I've read through the sample code, as well as a lot of the related questions here, but no luck. I have also checked the permissions, which I think are correct. Any ideas?
Thanks in advance.
When setting up your SurfaceHolder try setting the type to SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS:
SurfaceHolder holder = surfaceView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView is an instance of SurfaceView which is declared in my layout.
ok.. try this... whole code in your camera App
public class CameraImage extends Activity implements SurfaceHolder.Callback,
OnClickListener {
static final int FOTO = 0;
Camera camera;
boolean previewRunning = false;
private final Context mContext = this;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.camera_image);
sv = (SurfaceView) findViewById(R.id.camera);
sv.setOnClickListener(this);
sh = sv.getHolder();
sh.addCallback(this);
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageData, Camera c) {
if (imageData != null) {
Intent mIntent = new Intent();
StoreByteImage(mContext, imageData, 50, "ImageName");
camera.startPreview();
setResult(FOTO, mIntent);
finish();
}
}
};
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onStop() {
super.onStop();
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// XXX stopPreview() will crash if preview is not running
if (previewRunning) {
camera.stopPreview();
}
Camera.Parameters p = camera.getParameters();
p.setPreviewSize(w, h);
camera.setParameters(p);
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
camera.startPreview();
previewRunning = true;
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
previewRunning = false;
camera.release();
}
private SurfaceView sv;
private SurfaceHolder sh;
public void onClick(View arg0) {
camera.takePicture(null, mPictureCallback, mPictureCallback);
}
public static boolean StoreByteImage(Context mContext, byte[] imageData,
int quality, String expName) {
File sdImageMainDirectory = new File("/sdcard");
FileOutputStream fileOutputStream = null;
try {
long name = new Date().getTime();
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 1;
Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length,options);
fileOutputStream = new FileOutputStream(sdImageMainDirectory.toString() +"/"+Long.toString(name)+".jpg");
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
myImage.compress(CompressFormat.JPEG, quality, bos);
DataModel dbModel = new DataModel(mContext);
Calendar cal = Calendar.getInstance();
dbModel.insertMultimedia(sdImageMainDirectory.toString() +"/"+Long.toString(name)+".jpg", Long.toString(name), cal);
bos.flush();
bos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}
I hope this will certainly work
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With