如何预览相机

时间:2017-10-26 18:37:24

标签: java android android-camera

我用这个例子从相机中预览:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.TextureView;
import android.widget.FrameLayout;
import android.view.TextureView;
import android.widget.ImageView;
import android.graphics.Bitmap;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import android.graphics.SurfaceTexture;


public class MainActivity extends Activity implements
TextureView.SurfaceTextureListener, Camera.PreviewCallback {

    static {
        System.loadLibrary("JNIProcessor");
    }

    private final String TAG="LiveFeature";

    private Camera mCamera;
    private byte[] mVideoSource;

    private TextureView mTextureView;

    private String[] ResolutionList;
    private Menu AppMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_live_feature);


        mTextureView.setSurfaceTextureListener(this);
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture pSurface,
            int pWidth, int pHeight) {
        // Ignored
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture pSurface) {
        // Ignored
    }

    @Override
    public void onPreviewFrame(byte[] pData, Camera pCamera) {
    }
}

似乎不推荐使用Camera.PreviewCallback,我应该使用android.hardware.camera2。问题是我没有找到预览回调函数来获取原始数据字节。 我只是想从相机中渲染帧而不将其渲染到表面并将其放入JNI函数中。

1 个答案:

答案 0 :(得分:0)

获取预览的这些步骤:

  • 在清单文件中添加相机权限(Manifest.permission.CAMERA)

  • 使用此方法获取相机实例:

    public static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open(); // attempt to get a Camera instance
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
    }
    
  • 创建一个扩展SurfaceView的类,让类实现SurfaceHolder.Callback并在其构造函数中传递Camera实例。使用getHolder()

  • 获取构造函数中的持有者
  • 在方法“surfaceCreated”中,设置预览显示并开始预览

    public void surfaceCreated(SurfaceHolder holder) { try { mCameraSource.start(holder); mCamera.setPreviewDisplay(mHolder); setWillNotDraw(false); } catch (Exception e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); } }

  • 当您不再需要时停止预览并释放相机

    mCamera.stopPreview();  mCamera.release();