Phone freezes when camera.release() is called - android

Hi I'm trying to get camera functionality to work on my app. The problem is, on one phone in particular - Samsung Galaxy Mini.
After I take a picture using the camera and previews, the phone freezes when I call camera.release(). I have to remove battery to reset it.
This is how I release the camera:
try
{
mCamera.stopPreview();
mCamera.setPreviewDisplay(null);
mCamera.release();
mCamera = null;
}
catch (Exception e)
{
// ignore: tried to stop a non-existent preview
}
I am also getting this weird native exception in logcat after the call:
03-10 09:45:56.080: E/mm-camera(95): camera_issue_ctrl_cmd: error (Bad address): type 43, length 0, status 40856
Any help would be greatly appreciated!

use the below open source camera code it will help you
Open Camera
and use it on surface destroyed
if(flag){
camera.release();
camera = null;
previewing = false;
}else{
camera.stopPreview();
}

Related

Tokbox video publish unfocused (Android)

I am using tokbox for video chat and I want to take pictures of printed documents. When I am trying this on a Samsung s7edge my captured image is so unfocused I cannot read it. When I am trying this on a Nexus 6p the image is fine.
It is not a resolution problem, I am always using CameraCaptureResolution.HIGH
any thoughts?
I fixed it:
I used this class:
https://github.com/opentok/opentok-android-sdk-samples/blob/master/Custom-Video-Driver/app/src/main/java/com/tokbox/android/tutorials/customvideodriver/CustomVideoCapturer.java
Changed the init function:
#Override
public void init() {
mCamera = Camera.open(mCameraIndex);
mCurrentDeviceInfo = new Camera.CameraInfo();
Camera.getCameraInfo(mCameraIndex, mCurrentDeviceInfo);
try{
//set camera to continually auto-focus
Camera.Parameters params = mCamera.getParameters();
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
mCamera.setParameters(params);
}catch (Exception e) {
e.printStackTrace();
}
}
and the swapCamera as well, so every time the back camera comes into play It must have autofocus.
And in my Activity, onConnected:
CustomVideoCapturer mCapturer = new CustomVideoCapturer(a) ;
mPublisher = new Publisher.Builder(this)
.capturer(mCapturer)
.resolution(Publisher.CameraCaptureResolution.HIGH).build();

lockCanvas unlockCanvasAndPostm Camera.setPreviewDisplay

I try to Draw in the same surface that the camera will draw it self later, by using lock and unlock.
the strange thing is that the try to lock succeed, but after the call unlockCanvasAndPost() the mCamera.setPreviewDisplay() throw error "setPreviewDisplay failed".
Without calling lockCanvas() and unlockCanvasAndPost() the mCamera.setPreviewDisplay() work and i get my display.(running in android 4.1.1 compile with api 17)
Remarque:(running in android 4.0.4 compile with api 17) sometimes run and only
if i lock and unlock using java, and not work using lock and unlock
from jni c/c++(ANativeWindow_lock() and ANativeWindow_unlockAndPost()).
but let's discuss only the java solution and why calling lockCanvas() and unlockCanvasAndPost() prevent the camera from working:
mCamera=Camera.open();
try {
Canvas can;
can = imageView.getHolder().getSurface().lockCanvas(null);
Log.d("", "Canvas successfully acquired ");
imageView.getHolder().getSurface().unlockCanvasAndPost(can);
mCamera.setPreviewDisplay(this.imageView.getHolder());
} catch (IOException e) {
Log.d("",e.getMessage());
} catch (OutOfResourcesException e) {
e.printStackTrace();
}
mCamera.setPreviewCallback(previewCallback);
mCamera.startPreview();

Android FOCUS_MODE_CONTINUOUS_VIDEO and capturing preview frames

I'm developing an image recognition app and would like the camera to focus automatically all the time. The folks at ZXing have solved this problem by calling autofocus() every few seconds, but on some cameras this doesn't focus smoothly, but zips to one end and refocuses. On my Alcatel 995, gingerbread 2.3.3 API level 10 phone, it actually makes an alarming click every time this happens.
This phone doesn't support FOCUS_MODE_CONTINUOUS_PICTURE. I tried using FOCUS_MODE_CONTINUOUS_VIDEO, which is supported, and it didn't work. I wrote a test app that captured every preview frame of the camera normally with a callback, but it didn't focus. I added a video recorder feature to the app, and when video is being recorded, the camera does autofocus all the time. But video recording takes away the ability to get a callback on each frame, I think. It's been discussed at
https://stackoverflow.com/questions/9477042/extract-video-frames-while-recording-the-video-on-android?rq=1
and
How to show real time filtered camera preview while recording videos?
Here is some of that test code:
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
Camera.Parameters parameters = mCamera.getParameters();
mCamera.setDisplayOrientation(90); // just get it right for testing
mCamera.setParameters(parameters);
mCamera.setPreviewDisplay(holder);
mCamera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
Log.d(TAG, String.format("Frame %d", mFrameNumber++)); // see the frames in the logcat
}
});
} catch (IOException exception) {
mCamera.release();
mCamera = null;
Log.d(TAG, "exception setting parameters");
}
}
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();
List<Size> previewSizes = parameters.getSupportedPreviewSizes();
Size previewSize = getOptimalPreviewSize(previewSizes, w, h);
parameters.setPreviewSize(previewSize.width, previewSize.height);
parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
mCamera.setParameters(parameters);
mCamera.startPreview();
if (mRecordingVideo)
startVideo(mCamera, holder);
}
// derived from http://developer.android.com/guide/topics/media/camera.html#capture-video
private void startVideo(Camera camera, SurfaceHolder holder) {
camera.stopPreview(); // not specified in documentation but seems to be needed
camera.unlock();
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(camera);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // No audio is recorded
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mMediaRecorder.setOutputFile("/dev/null");
try {
mMediaRecorder.setPreviewDisplay(holder.getSurface());
mMediaRecorder.prepare();
} catch (IOException e) {
camera.release();
Log.d(TAG, "startVideo: Failed.");
e.printStackTrace();
}
mMediaRecorder.start();
}
If I set mRecordingVideo in the above code to start the video recorder, I gain autofocus but lose the per-preview-frame callbacks.
The Camera.Parameters class definition says that FOCUS_MODE_CONTINUOUS_VIDEO is "intended for video recording" but doesn't make plain that it doesn't work otherwise.
Is there anything else I can do to persuade continuous autofocus to work in a gingerbread phone without recording video? Have I missed something out?
Is this phone-specific? Do other phones continuous autofocus in this mode without recording video? I posted the source of a complete test app to Github if anyone would like to try it on their phone.
Someone kindly helped me out by testing this on another phone on another continent. Thanks very much, Colin!
It appears that the code above is correct and should cause the camera to focus properly.
This behaviour is phone-specific. The Alcatel 995 running 2.3.6 definitely does not focus in this mode without the video recorder running. A Samsung Galaxy Nexus (not sure which OS) running the same code does focus without the video recorder running.
try "setRecordingHint(true)" to the camera parameters

Adding camera effects in android and save

I am working on a new android application.In my app i have to add show effects on image preview [like sepia,pinch, mirror, etc] and capture and save image in that particular effect.eg: I f user select pinch effect then he can capture and store the image with pinch effect.
I had read some faq's. But they are telling about some ndk's.But i don't have any idea about ndk's. Please help me friends.
You can set all these kind of effects with camera instance itself. Walk though the below code ...
Camera camera = null;
camera = Camera.open();
if (camera != null) {
try {
Camera.Parameters parameters = camera.getParameters();
// Set all kind of stuffs here..
parameters.setSceneMode(Camera.Parameters.FLASH_MODE_AUTO);
parameters.setColorEffect(Camera.Parameters.EFFECT_SEPIA);
camera.setParameters(parameters);
camera.setPreviewDisplay(surface_holder);
camera.startPreview();
} catch (IOException exception) {
camera.release();
camera = null;
}
}

Video recording - unable to start camera preview

I'm working on a custom video recording class, and I'm having some issues getting the camera preview to display when the Activity first appears. I'm calling this function inside the surfaceCreated callback:
private void initRecorder(Surface surface) throws IOException {
// It is very important to unlock the camera before doing setCamera
// or it will results in a black preview
if(camera == null) {
camera = Camera.open();
camera.unlock();
}
if(recorder == null)
recorder = new MediaRecorder();
recorder.setPreviewDisplay(surface);
recorder.setCamera(camera);
camera.startPreview();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setOutputFile("/sdcard/test.mp4");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoEncodingBitRate(15000000);
recorder.setMaxDuration(10000); // length of video in MS
recorder.setVideoSize(720, 480);
recorder.setVideoFrameRate(30);
try {
recorder.prepare();
} catch (IllegalStateException e) {
// This is thrown if the previous calls are not called with the
// proper order
e.printStackTrace();
}
}
When the Activity starts, my app crashes saying:
java.lang.RuntimeException: startPreview failed
Above that error, I noticed a line saying:
attempt to use a locked camera from a different process (old pid 4894, new pid 6405)
When I step through the code, that error is occurring on the camera.startPreview() line. If I remove that line from my code, the preview shows up fine after I call recorder.start(), and prior to that I just have a black screen with my record button. Once I stop recording, the preview continues to show fine (I am calling camera.startPreview() after I stop recording).
Since I'm calling camera.unlock() only a few lines prior to starting the preview, and the two calls occur in the same function, how can I be having this error?
Edit: I tested the same code minus the call to startPreview() on a Droid X2 and a Droid 1, and it works fine. It looks like the EVO 4G is the problem. I will continue to investigate.
I answered a very similar question here: preview display in android media recorder
See if it helps you, it has a whole Activity that works with a preview and records a video.
camera.unlock() must be called from the same thread where camera was locked before. Check your logs for messages like Unlock call from pid 19322; currently locked to pid 17652.
Note that lock can be set by calling Camera.lock() or MediaRecorder.start()
Since API level 14, camera is automatically locked for applications in
MediaRecorder.start(). Applications can use the camera (ex: zoom)
after recording starts. There is no need to call this after recording
starts or stops.
Arrange code like this and decrease video encoding rate. It is very high for your video size. This may not be creating a problem on your device because on some devices it is clipped internally.
private void initRecorder(Surface surface) throws IOException {
// It is very important to unlock the camera before doing setCamera
// or it will results in a black preview
if (camera == null) {
camera = Camera.open();
camera.unlock();
}
if (recorder == null)
recorder = new MediaRecorder();
recorder.setCamera(camera);
camera.startPreview();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoEncodingBitRate(2048000);
recorder.setMaxDuration(10000); // length of video in MS
recorder.setVideoSize(720, 480);
recorder.setVideoFrameRate(30);
recorder.setOutputFile("/sdcard/test.mp4");
recorder.setPreviewDisplay(surface);
try {
recorder.prepare();
} catch (IllegalStateException e) {
// This is thrown if the previous calls are not called with the
// proper order
e.printStackTrace();
}
}

Categories

Resources