surfaceCreated() ne s'est Jamais Appelé
J'ai vu des problèmes similaires à celui que je vais avoir, mais je n'ai pas encore trouver une solution. Je suis très nouveau développement Android, donc je vais avoir du mal à suivre en bas de mon problème. De toute façon, je suis en train de créer un aperçu de la caméra à l'aide d'un CameraSurfaceView classe que j'ai créée qui s'étend SurfaceView et met en œuvre SurfaceHolder.De rappel. Peu importe ce que j'essaie dans mon StartCamera classe, le surfaceCreated() la méthode n'est jamais appelée, d'où mon appareil ne démarre jamais. Toute aide serait super, merci!
StartCamera.java
import net.peterd.zombierun.R;
import android.hardware.Camera;
import android.os.Bundle;
import android.widget.FrameLayout;
public class StartCamera extends BaseActivity {
private Camera mCamera;
private CameraSurfaceView mView;
public void onCreate(Bundle state) {
//TODO Auto-generated constructor stub
super.onCreate(state);
setContentView(R.layout.start_camera);
}
public void onResume() {
super.onResume();
mView = new CameraSurfaceView(this);
FrameLayout preview = (FrameLayout) findViewById(R.id.cPreview);
preview.addView(mView);
}
public void onPause() {
mCamera.stopPreview();
mCamera.release();
}
}
CameraSurfaceView.java
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder holder;
private Camera camera;
public CameraSurfaceView(Context context)
{
super(context);
//Initiate the Surface Holder properly
this.holder = this.getHolder();
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
try
{
//Open the Camera in preview mode
this.camera = Camera.open();
this.camera.setPreviewDisplay(this.holder);
}
catch(IOException ioe)
{
ioe.printStackTrace(System.out);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
//Now that the size is known, set up the camera parameters and begin
//the preview.
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
//Surface will be destroyed when replaced with a new screen
//Always make sure to release the Camera instance
camera.stopPreview();
camera.release();
camera = null;
}
public Camera getCamera() {
return camera;
}
}
start_camera.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout android:id="@+id/cPreview"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
</LinearLayout>
OriginalL'auteur jvhashe | 2011-07-28
Vous devez vous connecter pour publier un commentaire.
Apparemment, c'est en raison de FrameLayout étant vide et n'est donc pas la création de tout type de SurfaceView. Vous pouvez essayer de forcer le parent LinearLayout réglage de la hauteur et la largeur manuellement ou tout simplement l'ajout d'une imageView à l'intérieur de la FrameLayout. Depuis FrameLayout peut contenir de nombreux widgets, mais il n'affiche que le dernier d'entre eux, vous pouvez mettre une ImageView à l'intérieur de la FrameLayout montrant une petite zone de l'image pour la SurfaceView être créé.
OriginalL'auteur Ralph
J'ai eu le même problème. Pour moi, c'était parce que la taille de la Vue a été mis à 0, et par conséquent, la surface n'a jamais été créé. J'ai vérifié cela en définissant une taille spécifique, et tout d'un coup, les rappels ont été appelés. (De même, apparemment, est titulaire si la Vue est disposé hors de l'écran).
OriginalL'auteur Greg Bacchus
@jvnane j'ai essayé votre code, cela fonctionne, avec des corrections mineures.
surfaceChanged
est appelé sans problème. De quelle façon vous pensez que ça ne fonctionne pas? Essayez d'ajouter un message de débogage et de les voir en LogCat:Bug mineur:
Camera
objet est libéré danssurfaceDestroyed
de sorte que vous n'avez pas besoin de le libérer à nouveau dans l'activité deonPause
. Aussi, vous devez appelersuper.onPause()
lors de la substitutiononPause()
méthode.OriginalL'auteur Alan
J'ai eu des erreurs à partir de cette ligne dans le
CameraSurfaceView
méthode,surfaceChanged
:Il a bien fonctionné une fois je lui ai dit que.
OriginalL'auteur Vivian Liu - MSFT