Android la Fermeture de l'appareil photo correctement

Ok cela a été le cas pour moi à quelques reprises au cours des dernières semaines et je ne peux pas comprendre comment le corriger. Fondamentalement, mon appli utilise l'appareil photo, mais le plus souvent après quelques va de pair avec la caméra sur l'application puis de la force se ferme parfois et ne peut pas être utilisé même avec d'autres applications ou la caméra par défaut sur le téléphone.

J'ai trouvé le seul moyen de résoudre ce problème est de redémarrer le téléphone.

De ce que j'ai lu jusqu'à présent, je comprends que j'ai besoin d'appeler

camera.release();

camera = null;

Mais j'ai toujours l'erreur de forcer la fermeture, parfois, est-il possible pour quelqu'un simplement pour prendre un coup d'oeil à travers peut-être me manque un camera.release(); quelque part.

public class AndroidCamera extends Activity implements SurfaceHolder.Callback{
Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;
final int RESULT_SAVEIMAGE = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
controlInflater = LayoutInflater.from(getBaseContext());
View viewControl = controlInflater.inflate(R.layout.control, null);
LayoutParams layoutParamsControl 
= new LayoutParams(LayoutParams.FILL_PARENT, 
LayoutParams.FILL_PARENT);
this.addContentView(viewControl, layoutParamsControl);
Button buttonTakePicture = (Button)findViewById(R.id.takepicture);
buttonTakePicture.setOnClickListener(new Button.OnClickListener(){
public void onClick(View arg0) {
//TODO Auto-generated method stub
camera.takePicture(myShutterCallback, 
myPictureCallback_RAW, myPictureCallback_JPG);
}});
}
ShutterCallback myShutterCallback = new ShutterCallback(){
public void onShutter() {
//TODO Auto-generated method stub
}};
PictureCallback myPictureCallback_RAW = new PictureCallback(){
public void onPictureTaken(byte[] arg0, Camera arg1) {
//TODO Auto-generated method stub
}};
PictureCallback myPictureCallback_JPG = new PictureCallback(){
public void onPictureTaken(byte[] arg0, Camera arg1) {
//TODO Auto-generated method stub
/*Bitmap bitmapPicture 
= BitmapFactory.decodeByteArray(arg0, 0, arg0.length);  */
int imageNum = 0;
Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Punch");
imagesFolder.mkdirs(); //<----
String fileName = "image_" + String.valueOf(imageNum) + ".jpg";
File output = new File(imagesFolder, fileName);
while (output.exists()){
imageNum++;
fileName = "image_" + String.valueOf(imageNum) + ".jpg";
output = new File(imagesFolder, fileName);
}
Uri uriSavedImage = Uri.fromFile(output);
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
OutputStream imageFileOS;
try {
imageFileOS = getContentResolver().openOutputStream(uriSavedImage);
imageFileOS.write(arg0);
imageFileOS.flush();
imageFileOS.close();
Toast.makeText(AndroidCamera.this, 
"Image saved", 
Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Intent intent = new Intent(getBaseContext(), Punch.class);
intent.putExtra("filepath",uriSavedImage.toString());
//just using a request code of zero
int request=0;
startActivityForResult(intent,request); 
}};
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
//TODO Auto-generated method stub
if(previewing){
camera.stopPreview();
previewing = false;
}
if (camera != null){
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
previewing = true;
} catch (IOException e) {
//TODO Auto-generated catch block
camera.release();
e.printStackTrace();
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
//TODO Auto-generated method stub
camera = Camera.open();
try {
Camera.Parameters parameters = camera.getParameters();
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
//This is an undocumented although widely known feature
parameters.set("orientation", "portrait");
//For Android 2.2 and above
camera.setDisplayOrientation(90);
//Uncomment for Android 2.0 and above
parameters.setRotation(90);
} else {
//This is an undocumented although widely known feature
parameters.set("orientation", "landscape");
//For Android 2.2 and above
camera.setDisplayOrientation(0);
//Uncomment for Android 2.0 and above
parameters.setRotation(0);
}
camera.setParameters(parameters);
camera.setPreviewDisplay(holder);
} catch (IOException exception) {
camera.release();
}
camera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
//TODO Auto-generated method stub
if(previewing && camera != null) {
if(camera!=null) {
camera.stopPreview();
camera.release();  
camera = null;
}
previewing = false;
}
}
}

Le logcat m'a donné (il n'y est plus mais je pense que c'est parce que la caméra de la force se ferme sur moi pour le reste de l'application ne s'exécute pas.

01-03 14:59:17.835: D/AndroidRuntime(16531): Shutting down VM

01-03 14:59:17.835: W/dalvikvm(16531): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)

01-03 14:59:17.845: E/AndroidRuntime(16531): FATAL EXCEPTION: main

01-03 14:59:17.845: E/AndroidRuntime(16531): java.lang.RuntimeException: Fail to connect to camera service

  • j'ai un problème très similaire où une application que je suis en train d'écrire s'est écrasé avant d'arriver à la libération de la caméra, à présent, rien ne permet d'utiliser la caméra sans redémarrer le téléphone.
InformationsquelleAutor Matt | 2012-01-03