2013-05-16 3 views
16

앱의 기본보기가 화면에 표시되는 동안 Android 앱에서 QR 코드를 계속 스캔해야합니다. 기본보기에는 카메라 미리보기가있는 창이 있어야하지만 전체 화면 카메라 미리보기는 포함되어 있지 않아야합니다.전체 화면 카메라없이 QR 코드 스캔

사용 예 : 스캔 한 QR 코드 목록과 카메라 미리보기가 포함 된 기본보기. 새로운 QR 코드가 스캔되면 목록에 추가됩니다.

가능합니까?

+0

을 열지 않고 배경에서 이미지를 캡처 할 수는 ZBar 안드로이드의 예에서보세요 https://github.com/ZBar/ZBar/ 나무/마스터/안드로이드 – Marware

답변

3

전적으로 작동하는 예제가 없지만 전체 프로젝트보다 작은보기에서 카메라 미리보기를 배치하는 광산 프로젝트에서 미리보기를 제공 할 수 있습니다. 나는 그 아이디어를 전하고 싶다.

는 당신이 필요로하는 것은 당신이 활동

을 모든 것을 조립해야하는 마지막

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

보기도

<?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을 필요로하는 카메라 미리보기를 보유 할 FrameLayout이있다

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 
}