Question

Je suis en train de développer un widget personnalisé pour la prévisualisation de la caméra. Je voudrais remplir l'écran avec un aperçu de la caméra et d'en tirer quelques boutons dessus.

J'ai essayé de créer un widget sur mesure de la manière suivante:

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class CapturePreview extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;

CapturePreview(Context context) {
    super(context);
    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    mCamera = Camera.open();
    try {
       mCamera.setPreviewDisplay(holder);
    } catch (IOException exception) {
        mCamera.release();
        mCamera = null;
        // TODO: add more exception handling logic here
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    mCamera.stopPreview();
    mCamera = null;
}

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();
    parameters.setPreviewSize(w, h);
    mCamera.setParameters(parameters);
    mCamera.startPreview();
}

}

et modifié le fichier main.xml de la manière suivante:

<RelativeLayout android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout">
<dev.video.client.CapturePreview android:id="@+id/capturePreview" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</RelativeLayout>

Dans la classe d'activité que j'ai essayé de lier le widget de la manière suivante:

private CapturePreview mPreview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setFullscreen();

    setContentView(R.layout.main);

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    //mPreview = new CapturePreview(this);
    //setContentView(mPreview);

    mPreview = (CapturePreview)this.findViewById(R.id.capturePreview);
}

Chaque fois que j'essaie de déboguer l'application que je reçois un message d'erreur et je ne l'ai pas trouvé ce qui pourrait être mal.

Je voudrais vraiment apprécier toute aide concernant ce problème.

Merci!

Était-ce utile?

La solution

Vous devez créer le constructeur suivant dans SurfaceView pour que cela fonctionne:

CapturePreview(Context context, AttributeSet attrs)

Comme vous le savez peut-être, en Java les constructeurs ne sont pas héritées de c'est superclasse, mais c'est le constructeur que Android tente d'invoquer lorsque vous utilisez ce composant dans un fichier XML (par opposition à la définition de votre interface graphique par programmation). Cela ne marchera pas, bien sûr, d'où le message d'erreur, ce qui devrait être beaucoup plus clair, à mon avis.

Le AttributeSet contient tous les attributs mentionnés dans la déclaration XML, donc si vous avez des attributs personnalisés pour votre appareil, vous pouvez récupérer et prendre des mesures sur les dans le constructeur.

Autres conseils

Vous pouvez mettre en œuvre un onTouchListener () à la vue respectée. Chaque fois que vous clique sur la surface automatiquement le système Android vous amène à la méthode onTouchListener ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top