18

アプリのメイン ビューが画面に表示されている間、Android アプリで QR コードを継続的にスキャンする必要があります。メイン ビューには、カメラ プレビュー付きのウィンドウが含まれている必要がありますが、フルスクリーンのカメラ プレビューは含まれていません。

使用例: スキャンした QR コードのリストとカメラのプレビューを含むメイン ビュー。新しい QR コードをスキャンすると、リストに追加されます。

出来ますか?

4

2 に答える 2

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
}
于 2016-02-16T09:20:29.917 に答える