2013-05-16 9 views
16

Je dois continuellement scanner les codes QR dans mon application Android pendant que la vue principale de l'application est à l'écran. La vue principale doit contenir une fenêtre avec aperçu de la caméra, mais pas un aperçu de la caméra en plein écran. Exemple d'utilisation: Vue principale contenant une liste de codes QR scannés et un aperçu de la caméra. Lorsqu'un nouveau code QR est analysé, il est ajouté à la liste.Numérisation de code QR sans caméra plein écran

Est-ce possible?

+0

Jetez un oeil à ZBar exemple Android https://github.com/ZBar/ZBar/ arbre/maître/android – Marware

Répondre

3

Je n'ai pas d'exemple complet, mais je peux vous donner des extraits d'un de mes projets où je place également les aperçus de la caméra dans une plus petite vue qu'en plein écran. Je veux juste transmettre l'idée.

Ce que vous avez besoin est un FrameLayout qui tiendra l'aperçu de la caméra

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/absoluteLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@android:color/transparent" 
    android:orientation="vertical" > 

    <FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="200dp" 
     android:layout_height="200dip" > 
    </FrameLayout> 

</RelativeLayout> 

Maintenant, nous avons besoin d'un PreviewListener qui est aussi une vue d'

import java.io.IOException; 

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

/** A basic Camera preview class */ 
public class CameraPreviewListener extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreviewListener(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 

     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, now tell the camera where to draw the preview. 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Take care of releasing the Camera preview in your activity. 
     Log.d("camera", "surfaceDestroyed"); 
     if(holder.equals(mHolder)){ 
      holder.removeCallback(this);    
     }else{ 
      holder.removeCallback(this); 
      mHolder.removeCallback(this); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 

     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 

     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 

     } catch (Exception e){ 
      e.printStackTrace(); 
      // ignore: tried to stop a non-existent preview 
     } 

     // set preview size and make any resize, rotate or 
     // reformatting changes here 

     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e){ 
      Log.d("camera", "Error starting camera preview: " + e.getMessage()); 
     } 
    } 

    public void removeCallback(){ 
     mHolder = getHolder(); 
     mHolder.removeCallback(this); 
    } 
} 

Enfin, vous devez assembler tout en vous l'activité

import android.hardware.Camera; 

Camera mCamera = = getCameraInstance(); 
CameraPreviewListener cpl = new CameraPreviewListener(this, mCamera); 
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
preview.addView(cpl); 

Pour obtenir la caméra, vous pouvez utiliser la méthode suivante

/** A safe way to get an instance of the Camera object. */ 
public Camera getCameraInstance() { 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera instance 
     Parameters p = c.getParameters(); 
     List<Size> sizes = p.getSupportedPictureSizes(); 

     Size x = null; 

     if (sizes.size() < 1) { 
      throw new Exception("there are not supported picture sizes at all !!!"); 
     } 

     for (Size s : sizes) { 
      if (s.width == 640 && s.height == 480) { 
       x = s; 
      } 
     } 

     if (x == null) { 
      x = sizes.get(0); 
      p.setPictureSize(x.width, x.height); 
     } else { 
      p.setPictureSize(640, 480); 
     } 
     p.setJpegQuality(20); 
     p.setGpsLatitude(MapViewer.latitude); 
     p.setGpsLongitude(MapViewer.longitude); 
     c.setParameters(p); 
    } catch (Exception e) { 
     // Camera is not available (in use or does not exist) 
     Log.d(TAG + "(getCameraInstance)", e.getMessage()); 
    } 
    return c; // returns null if camera is unavailable 
}