IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Ecrire sur la preview de la camera


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Par défaut Ecrire sur la preview de la camera
    Bonjour,

    Je dois afficher du texte et dessiner sur la preview de la camera (pour faire un semblant de réalité augmentée).

    Je précise que je suis partit de ce tutoriel : http://imrannazar.com/Augmented-Real...id-NDK:-Part-1

    La différence est que moi, je dois bien séparer le code. Du coup j'ai créé 3 classes : MyActivity, Preview (qui extend une surfaceView pour afficher la camera et implements SurfaceHolder.Callback) et une classe OverlayView (qui extends SurfaceView) qui sert a dessiner dessus.

    Or le tutoriel utilise 2 classes seulement : une Activité qui contient la preview de la camera (et qui implements directement SurfaceHolder.Callback) et une OverlayView.

    Mon XML est celui-ci (je n'utilise pas de FrameLayout contrairement à lui, mais je ne pense pas que cela soit la cause du soucis) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
     
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/linearLayoutCamera"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="top"
            android:layout_weight="2" >
     
    <!--           <com.android.sod.OverlayView   -->
    <!--               android:id="@+id/surface_overlay"  -->
    <!--               android:layout_width="wrap_content"  -->
    <!--               android:layout_height="wrap_content" /> -->
     
    <!--           <SurfaceView  -->
    <!--               android:id="@+id/surface_camera"  -->
    <!--               android:layout_width="wrap_content"  -->
    <!--               android:layout_height="wrap_content" />  -->
     
        </LinearLayout>
     
        <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android" 
            android:id="@+id/linearLayoutMenu"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:gravity="bottom" >
            <Button
                android:id="@+id/button1"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:layout_gravity="bottom"
                android:layout_weight="1"
                android:text="boutton1" />
            <Button
                android:id="@+id/button2"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:layout_gravity="bottom"
                android:layout_weight="1"
                android:text="button2" />
        </LinearLayout>
    </LinearLayout>
    J'ai commenté les tags surfaceview et overlayview car j'aimerai les rajouter directement dans le code, sans passer par le XML. Et c'est (peut-être) la où se situe mon problème.

    En faisant ceci dans mon activity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
        public class MyActivity extends Activity 
        {
        private static final String LOG_TAG_VIDEO_PREVIEW = "VideoPreview";
        private Camera mCam; 
        private SurfaceView mCamSV; 
        private SurfaceHolder mCamSH; 
        private OverlayView mOverSV;
        private int CAMERA_ID_SELECTED = 0;
        private Preview mPreview;
        private int cameraCurrentlyLocked;
        private LinearLayout llCam;
     
        /* Activity event handlers */ 
        // Called when activity is initialised by OS 
        @Override 
        public void onCreate(Bundle inst) 
        { 
        super.onCreate(inst); 
        setContentView(R.layout.main); 
        //full screen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     
        llCam = (LinearLayout)findViewById(R.id.linearLayoutCamera); 
     
        // Initialise camera 
        initCamera(); 
        } 
     
        //-----PRIVATE METHODs 
     
        // Initialise camera and surface 
        private void initCamera() 
        {
        //preview
        mPreview = new Preview(this);
        //je l'ajoute a mon llCam
        llCam.addView(mPreview);
     
        //on fait appel a surfaceCreated de Preview car c'est ici qu'on instancie mCam (Camera.open()), et on pourra la recuperer par getCamera() par la suite
        mPreview.surfaceCreated(mPreview.getHolder());
     
        //OverlayView
        mOverSV = new OverlayView(this);     //(OverlayView)findViewById(R.id.surface_overlay);
        //mOverSV.getHolder().setFormat(PixelFormat.TRANSLUCENT);
        mOverSV.setCamera(mPreview.getCamera());
        llCam.addView(mOverSV);
        }
     
        // Stop camera when application ends 
        private void stopCamera() 
        { 
        mPreview.surfaceDestroyed(mCamSH);
        }
        }
    et ça plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    01-31 00:30:53.613: E/AndroidRuntime(10693): java.lang.RuntimeException: Fail to connect to camera service
    à la sortie du initCamera() ...

    J'essaye pourtant de reproduire le même comportement que le XML du tutoriel mais apparemment il y a quelque chose qui cloche

    Avez-vous une idée sur la façon de résoudre ce soucis ? D'avance merci !!


  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Par défaut
    Je précise aussi que, l'appli se lance, elle se met bien en mode full screen, mais la preview n'apparait pas (écran noir).

    Puis ça plante ...

    Quelqu'un peut-il m'expliquer au moins pourquoi, dans le XML du tutoriel, Overlay est situé avant la SurfaceView alors que, comme son nom l'indique, Overlay représente la view où l'on draw (donc logiquement devrait être après la surfaceview)...

    Me trompe-je ?

  3. #3
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    java.lang.RuntimeException: Fail to connect to camera service
    Est ce que tu as mis les permissions dans le manifest ?

    De même est ce que tu déclares bien ta caméra ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mCam != null) {
            mCam.stopPreview();
            mCam.setPreviewCallback(null);
            mCam.release();
            mCam = null;
        }
    }
     
        @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if (mCam == null) {
            mCam = Camera.open();
            try {
                mCam.setPreviewDisplay(holder);
     
                // TODO test how much setPreviewCallbackWithBuffer is faster
                mCam.setPreviewCallback(this);
            } catch (IOException e) {
                mCam.release();
                mCam = null;
            }
        }
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Par défaut
    Merci Feanorin de ta réponse.

    Oui oui j'ai bien ajouté les permissions ds le manifest et la camera était bien déclarée dans ma Preview.

    Du coup j'ai un peu laissé tombé et j'ai repris partiellement le découpage du tutoriel ...


Discussions similaires

  1. Comment ecrire sur la meme ligne avec la commane ECHO
    Par juflata dans le forum Windows
    Réponses: 3
    Dernier message: 24/11/2015, 09h06
  2. Ecrire sur un Timage
    Par giloutho dans le forum Delphi
    Réponses: 6
    Dernier message: 01/04/2007, 17h12
  3. Ecrire sur 2 cases
    Par javaSudOuest dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 24/10/2005, 17h37
  4. Interdire à X d'écrire sur le disque dur, possible ?
    Par Michaël dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 29/10/2004, 16h50
  5. ecrire sur un dbgrid ??
    Par nil dans le forum Bases de données
    Réponses: 8
    Dernier message: 21/04/2004, 22h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo