2013-05-16 93 views
16

我需要不断扫描QR码在我的Android应用程序,而应用程序的主视图是在屏幕上。主视图应该包含一个带有相机预览的窗口,但不包含全屏相机预览。QR代码扫描没有全屏相机

使用示例:包含扫描QR码和相机预览列表的主视图。当扫描新的QR码时,它将被添加到列表中。

可能吗?

+0

看一看zbar和Android的例子https://github.com/ZBar/ZBar/树/主/安卓 – Marware

回答

3

我没有一个完整的工作示例,但我可以给你一个我的项目的片段,我也将相机预览放在比全屏小的视图中。我只是想传达这个想法。

你需要的是一个FrameLayout里将举行相机预览

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

现在我们需要一个PreviewListener这也是一个查看

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); 
    } 
} 

最后,你需要在你的活动

组装一切
import android.hardware.Camera; 

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

要获取相机,您可以使用以下方法

/** 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 
}