method called after release() exception unable to resume with android camera
I've got the same problem. mCamera.setPreviewCallback(null);
didn't help. In my activity I've added this to releaseCamera
:
mPreview.getHolder().removeCallback(mPreview);
and it works now.
java.lang.RuntimeException: Method called after release()
try this, replace your code with mine, i guess this will help you, i have not tried but looks it will resolve your errors
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
this.getHolder().removeCallback(this);
mCamera.stopPreview();
mCamera.release();
}
Let me know ASAP...
Method called after release Exception Camera preview
As you have added the camera to the FrameLayout, like this:
FrameLayout preview = (FrameLayout)findViewById(R.id.cameraPreview);
preview.addView(mPreview);
The surfaceCreated
method will be called and so mCamera.setPreviewDisplay(holder);
will be called.
When you create/open a new camera, the FrameLayout
still has your previous camera and so its surfaceCreated
will be called in addition to your new camera.
What you should do, is remove your previous camera from FrameLayout
when you release your camera (on onPause()
method) like this:
preview.removeView(mPreview);
Hope it helps.
Application Crashes when resuming the app
Camera is being used after Camera.release()
was called. So, looking at the activity lifecycle, you need to open the camera in onStart()
or in onRestart()
. So Maybe this code will work fine ...
package com.example.gkvxm.materiallight;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.Toast;
import com.dd.CircularProgressButton;
import java.io.IOException;
public class FlashLightActivity extends Activity implements SurfaceHolder.Callback {
private boolean isLigtOn = false;
private Camera camera;
@Override
protected void onStart(){
super.onStart();
camera = Camera.open();
final Camera.Parameters p = camera.getParameters();
SurfaceView preview = (SurfaceView)findViewById(R.id.PREVIEW);
SurfaceHolder mHolder = preview.getHolder();
mHolder.addCallback(this);
}
@Override
protected void onStop(){
super.onStop();
if(camera!=null){
camera.release();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_flash_light);
Context context = this;
PackageManager pm = context.getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
Toast.makeText(FlashLightActivity.this, "Your Device is not supported", Toast.LENGTH_SHORT).show();
Log.e("err", "Device is not supported");
return;
}
camera = Camera.open();
final Camera.Parameters p = camera.getParameters();
final CircularProgressButton circularButton1 = (CircularProgressButton) findViewById(R.id.btnWithText);
circularButton1.setIndeterminateProgressMode(true);
circularButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isLigtOn) {
turnOffFlash(p);
Toast.makeText(FlashLightActivity.this, "Lights Off!", Toast.LENGTH_SHORT).show();
} else {
turnOnFlash(p);
Toast.makeText(FlashLightActivity.this, "Lights On!", Toast.LENGTH_SHORT).show();
}
if (circularButton1.getProgress() == 0) {
simulateSuccessProgress(circularButton1);
} else {
circularButton1.setProgress(0);
}
}
});
}
private void turnOnFlash(Camera.Parameters p){
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
camera.startPreview();
isLigtOn = true;
}
private void turnOffFlash(Camera.Parameters p){
p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(p);
camera.stopPreview();
isLigtOn = false;
}
@Override
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){
}
@Override
public void surfaceCreated(SurfaceHolder holder){
try{
Log.i("SurfaceHolder","Setting preview");
camera.setPreviewDisplay(holder);
} catch (IOException e){
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
Log.i("SurfaceHOlder", "stopping preview");
camera.stopPreview();
holder = null;
}
private void simulateSuccessProgress(final CircularProgressButton button) {
ValueAnimator widthAnimation = ValueAnimator.ofInt(1, 100);
widthAnimation.setDuration(1500);
widthAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
widthAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
button.setProgress(value);
}
});
widthAnimation.start();
}
private void simulateErrorProgress(final CircularProgressButton button) {
ValueAnimator widthAnimation = ValueAnimator.ofInt(1, 99);
widthAnimation.setDuration(1500);
widthAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
widthAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
button.setProgress(value);
if (value == 99) {
button.setProgress(-1);
}
}
});
widthAnimation.start();
}
}
Related Topics
Setting a Spinner Onclicklistener() in Android
Reusing Views in Android Listview with 2 Different Layouts
Spannable on Android for Textview
How to Ask Permission to Access Gallery on Android M.
Java Object Analogue to R Data.Frame
How to Escape Apostrophe or Quotes on a Jsp (Used by JavaScript)
Why Should Wait() Always Be Called Inside a Loop
Boolean[] VS. Bitset: Which Is More Efficient
Connectiontimeout Versus Sockettimeout
How to Detect a Click in an Ontouch Listener
Android (Java) Simple Send and Receive with Server - Fast Setup Challenge
How to Launch Home Screen Programmatically in Android
Resources.Openrawresource() Issue Android
Version Control for One-Man Project Using Eclipse
Java Equivalent to JavaScript's Encodeuricomponent That Produces Identical Output