• 03sept

    Utiliser la camera dans vos applications android



    Dans ce tuto je vais développer une application qui bascule automatiquement sur la caméra de notre téléphone android quand on la lance.
    D’abord je crée ma classe preview qui est une extension de la classe SurfaceView et implémente l’interface SurfaceHolder.Callback

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Context;
    import android.hardware.Camera;
    import android.os.Bundle;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.Window;
    import java.io.IOException;
     
    public class Preview extends SurfaceView implements SurfaceHolder.Callback{
        //création de  mes objets mHolder et mCamera
         SurfaceHolder mHolder;
        Camera mCamera;
    }

    L’objet mHolder de l’interface SurfaceHolder permet de contrôler la taille de la surface et le format d’affichage, de modifier les pixels de la surface et surveiller les modifications sur celle -ci.
    L’objet mCamera de type camera permet de se connecte à la caméra.

    Le constructeur de la classe.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Preview(Context context) {
            super(context);
     
            // Installe le SurfaceHolder.Callback pour prevenir quand la surface et créer ou détruite
            mHolder = getHolder();
            mHolder.addCallback(this);
           //type de la ssurface
           mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        }

    dans la suite de ma classe je crée 3 méthodes, surfaceCreated, surfaceDestroyed, surfaceDestroyed

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    public void surfaceCreated(SurfaceHolder holder) {
            //ouverture de ma camera
            mCamera = Camera.open();
            try {
               mCamera.setPreviewDisplay(holder);
            } catch (IOException exception) {
                mCamera.release();
                mCamera = null;
     
            }
        }
     
        public void surfaceDestroyed(SurfaceHolder holder) {
            //arret de ma camera quand
            mCamera.stopPreview();
            mCamera = null;
        }
     
        public void surfaceDestroyed(SurfaceHolder holder, int format, int w, int h) {
             Camera.Parameters parameters = mCamera.getParameters();
            parameters.setPreviewSize(w, h);
            mCamera.setParameters(parameters);
            mCamera.startPreview();
        }

    code complet de cette class

    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
    56
    
    package org.com.afCamerasimple;
    import android.app.Activity;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Context;
    import android.hardware.Camera;
    import android.os.Bundle;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.Window;
    import java.io.IOException;
     
    public class Preview extends SurfaceView implements SurfaceHolder.Callback{
    	SurfaceHolder mHolder;
        Camera mCamera;
     
        Preview(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 surfaceDestroyed(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();
        }
    }

    Dans ma classe AFCameraSimple il ne me reste plus qu’à créer une instance de la classe Preview.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    public class AFCameraSimple extends Activity {
    	 private Preview mPreview;
     
    	    @Override
    		protected void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
     
    	        // Hide the window title.
    	        requestWindowFeature(Window.FEATURE_NO_TITLE);
     
    	        // Create our Preview view and set it as the content of our activity.
    	        mPreview = new Preview(this);
    	        setContentView(mPreview);
    	    }
    }

    Dans mon fichier AndroidManifest.xml je rajoute l’autorisation d’utiliser la camera

    • android:screenOrientation=”landscape” pour avoir l’application automatiquement en paysage
    • pour autorise l’utilisation de la camera
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.com.afCamerasimple"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".AFCameraSimple"
            android:screenOrientation="landscape"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
        <uses-sdk android:minSdkVersion="3" />
         <uses-permission android:name="android.permission.CAMERA" />
    </manifest>

    Il est temps de mettre à profit les tutoriels d’Android France:
    Passez à la vitesse supérieure et investissez quelques dizaines d’euros pour acquérir les connaissances qui vous feront gagner de l’argent avec vos applications rendez-vous sur notre boutique Android-france pour ces formations en vidéo



    Guy

    Co-fondateur du site Android france, senior lead developper, passionné de bière et de cigare cubain

    Twitter Google+ 

15 commentaires

  1. 31 mars 2010 à 8 h 45 min

    Bonjour, j’ai une erreur de compilation du au chemin de classe,

    Class org.com.afCameraSimple.afCameraSimple does not exist …

    pourriez vous mieux me decrire les diffents composant (fichier Java ) et arbo du projet …
    merci.

    De plus , comment rajoute l’autorisation d’utiliser la camera dans AndroidManifest.xml ??

  2. 31 mars 2010 à 8 h 52 min

    @Eric si tu clique sur le plus tu as le code complet ddu fichier manifest.xml
    et Class org.com.afCameraSimple.afCameraSimple c’est mon package à moi le tiens et en principe différent

  • 31 mars 2010 à 9 h 04 min

    Nickel, ça compil,
    je “RUN”

  • 31 mars 2010 à 12 h 25 min

    Autre question,
    comment on “prends” une photo dans l’emulateur ?

  • 30 avril 2010 à 16 h 50 min

    J’obtient un écran noir avant d’aboutir sur une erreur … est-ce normal ?

  • 3 juin 2010 à 14 h 07 min

    Il n’y a pas une erreur ??

    public void surfaceDestroyed(SurfaceHolder holder, int format, int w, int h)

    à changer en

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

  • 9 septembre 2010 à 14 h 17 min

    Même chose, écran noir , et si je retente une seconde fois , erreur. Dommage, je cherche a faire ça depuis un moment et il n’y a aucun tutos qui fonctionne la dessus…

  • 21 décembre 2010 à 16 h 29 min

    fermeture soudaine du programme des son lancement que devons nous mettre au niveau du layout???(main.xml)

  • 3 mai 2011 à 18 h 04 min

    Oui, il faut changer :

    public void surfaceDestroyed(SurfaceHolder holder, int format, int w, int h)
    en
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)

    Pourquoi ne tenez vous pas compte des remarques en corrigeant le code que vous n’avez même pas testé ?

    Et c’est partout pareil dans ce site. C’est dingue…

  • Laissez un commentaire

         Vous devez être identifié pour publier un commentaire.
         Connexion - Inscription