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 !!