Java.lang.Exception Runtime: Prendre une Photo d'échec?
Je suis prise de photos en arrière-plan à l'intérieur de mon Application Android. Cependant, il donne une erreur:
02-09 15:22:12.061: E/cheeta(28633): timer testing
02-09 15:22:13.546: W/System.err(28633): java.lang.RuntimeException: takePicture failed
02-09 15:22:13.546: W/System.err(28633): at android.hardware.Camera.native_takePicture(Native Method)
02-09 15:22:13.546: W/System.err(28633): at android.hardware.Camera.takePicture(Camera.java:1194)
02-09 15:22:13.551: W/System.err(28633): at cam.sharp.MainActivity$MyTimerTask.run(MainActivity.java:69)
02-09 15:22:13.551: W/System.err(28633): at java.util.Timer$TimerImpl.run(Timer.java:284)
02-09 15:22:13.551: E/cheeta(28633): timer testing
02-09 15:22:15.051: W/System.err(28633): java.lang.RuntimeException: takePicture failed
02-09 15:22:15.051: W/System.err(28633): at android.hardware.Camera.native_takePicture(Native Method)
02-09 15:22:15.051: W/System.err(28633): at android.hardware.Camera.takePicture(Camera.java:1194)
02-09 15:22:15.051: W/System.err(28633): at cam.sharp.MainActivity$MyTimerTask.run(MainActivity.java:69)
02-09 15:22:15.051: W/System.err(28633): at java.util.Timer$TimerImpl.run(Timer.java:284)
02-09 15:22:15.051: E/cheeta(28633): timer testing
02-09 15:22:16.551: W/System.err(28633): java.lang.RuntimeException: takePicture failed
02-09 15:22:16.556: W/System.err(28633): at android.hardware.Camera.native_takePicture(Native Method)
02-09 15:22:16.556: W/System.err(28633): at android.hardware.Camera.takePicture(Camera.java:1194)
02-09 15:22:16.561: W/System.err(28633): at cam.sharp.MainActivity$MyTimerTask.run(MainActivity.java:69)
02-09 15:22:16.561: W/System.err(28633): at java.util.Timer$TimerImpl.run(Timer.java:284)
02-09 15:22:16.561: E/cheeta(28633): timer testing
J'ai deux fichiers.
MainActivity.java et CameraPreview.java
Voici le code pour les deux.
MainActivity.java
package cam.sharp;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.Toast;
public class MainActivity extends Activity {
private int cameraId = 0;
private Camera mCamera;
private CameraPreview mPreview;
String fileName = "tempImage.jpeg";
File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Create an instance of Camera
mCamera = getCameraInstance(cameraId);
if (mCamera == null) {
Toast.makeText(
getApplicationContext(),
"The camera service is currently unavailable, please try again!",
Toast.LENGTH_LONG).show();
finish();
} else {
//Create our Preview view and set it as the content of our
//activity.
mPreview = new CameraPreview(this, mCamera);
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.camera_preview);
frameLayout.addView(mPreview);
}
//start thread for these
MyTimerTask myTask = new MyTimerTask();
Timer myTimer = new Timer();
//public void schedule (TimerTask task, long delay, long period)
//Schedule a task for repeated fixed-delay execution after a specific
//delay.
//
//Parameters
//task the task to schedule.
//delay amount of time in milliseconds before first execution.
//period amount of time in milliseconds between subsequent executions.
myTimer.schedule(myTask, 3000, 1500);
}
class MyTimerTask extends TimerTask {
public void run() {
try {
mCamera.takePicture(null, null, null, mPictureCallback);
file = new File(getFilesDir(), fileName);
} catch (Exception e) {
e.printStackTrace();
}
Log.e("cheeta", "timer testing");
}
}
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageData, Camera c) {
Log.e("Callback TAG", "Here in jpeg Callback");
if (imageData != null) {
FileOutputStream outputStream;
try {
outputStream = openFileOutput(fileName,
Context.MODE_PRIVATE);
outputStream.write(imageData);
outputStream.close();
//Intent intent = new Intent(SnapScreen.this,
//PreviewScreen.class);
//if (fromMessageReview == true) {
//intent.putExtra("fromMessageReview", "true");
//}
//startActivity(intent);
//overridePendingTransition(R.anim.slide_in,
//R.anim.slide_out);
finish();
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
releaseCamera();
}
/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(int cameraId) {
Camera c = null;
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
c = Camera.open(cameraId);
} else {
c = Camera.open();
}
} catch (Exception e) {
c = null;
}
return c; //returns null if camera is unavailable
}
private void releaseCamera() {
if (mCamera != null) {
mCamera.release(); //release the camera for other applications
mCamera = null;
}
}
}
CameraPreview.java
package cam.sharp;
import java.io.IOException;
import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/** A basic Camera preview class */
@SuppressLint("ViewConstructor")
public class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
private static final String TAG = "Camera Preview";
private SurfaceHolder mHolder;
public Camera mCamera;
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
mCamera.setDisplayOrientation(90);
//Install a SurfaceHolder.Callback so we get notified when the
//underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
//deprecated setting, but required on Android versions prior to 3.0
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
//The Surface has been created, now tell the camera where to draw the
//preview.
try {
mCamera.setPreviewDisplay(holder);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "Error setting camera preview: " + e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
//empty. Take care of releasing the Camera preview in your activity.
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
//If your preview can change or rotate, take care of those events here.
//Make sure to stop the preview before resizing or reformatting it.
if (mHolder.getSurface() == null) {
//preview surface does not exist
return;
}
//stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e) {
//ignore: tried to stop a non-existent preview
}
//set preview size and make any resize, rotate or
//reformatting changes here
//start preview with new settings
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.d(TAG, "Error starting camera preview: " + e.getMessage());
}
}
}
Quelqu'un peut voir quel est le problème? Je fais appel mCamera.startPreview(); mais toujours pas d'utiliser.
Grâce
Avez-vous d'ajouter la permission de le fichier manifeste?
Oui, j'ai ajouter la permission de fichier Manifeste. mais pourtant, parfois, il donne une erreur.
est-il code de travail ? je m aussi se même erreur @AndroidCheeta
Oui, j'ai ajouter la permission de fichier Manifeste. mais pourtant, parfois, il donne une erreur.
est-il code de travail ? je m aussi se même erreur @AndroidCheeta
OriginalL'auteur Android Cheeta | 2014-02-09
Vous devez vous connecter pour publier un commentaire.
Vous avez 2 problèmes dans votre code:
Première: Dans votre
onPictureTaken
rappel, vous appelez lefinish()
méthode, qui à son tour des signaux que l'activité doit être détruit, et appelle laonDestroy()
méthode, qui à son tour libère votre appareil photo. Toutefois, votreMainActivity.java
n'est pas détruit (pas vraiment pourquoi, mais à travers logCat, j'ai trouvé que leonCreate()
ne doit être appelé qu'une seule fois, donc j'ai supposé que l'activité n'est pas détruit. Une explication possible pourrait être que le compte à rebours est contrôlé par un diferent thread, et pourraient ne pas être conscients que le MainActivity a été détruit, mais je ne peux pas confirmer), et votremyTimer
continuera à s'exécuter, et quand il arrive àmCamera.takePicture(null, null, null, mPictureCallback);
qu'il va jeter unNullPointException
parce que la caméra était déjà sorti, et leMainActivity.onCreate()
n'était pas appelé à nouveau pour obtenir une nouvelle instance de mCamera.Donc, pour résoudre le premier problème:
Deuxième: Est là que vous appelez votre
startPreview()
méthode. Accooding à la documentation detakePicture()
:Vous avez été seulement l'appel
startPreview()
une fois, lorsque vous créez la caméra, et à cause du problème 1, leonCreate()
sur MainActivity ne doit être appelé qu'une seule fois. Puisque vous avez une minuterie de prendre des photos toutes les 1,5 secondes, vous devriez appelerstartPreview()
avant d'appelertakePicture()
, donc, pour résoudre ce problème:Après cela, l'application continuasly prend des photos, et les stocke. Je n'ai jamais utilisé un Timer comme ça donc je ne sais pas comment le faire arrêter. Si vous voulez seulement un petit nombre de photos prises à l'intérieur de chaque appel à la
CameraPreview Activity
je vous suggère d'utiliser un Timer avec une action de l'auditeur, comme suit:est-il code de travail ? je m aussi se même erreur
OriginalL'auteur pedromss