android – 如何在SurfaceView上显示相机预览?

概述我试图在SurfaceView上打开相机硬件.在布局中,我创建了一个SurfaceView,我打开相机,如下面的代码所示.当我运行代码时,CameraAvailableCB中的烤面包机显示并显示“onCameraAvailable”,但SurfaceView上没有任何内容. 如何在SurfaceView上显示相机显示? 码 @Overrideprotected void onCreate(Bun 我试图在SurfaceVIEw上打开相机硬件.在布局中,我创建了一个SurfaceVIEw,我打开相机,如下面的代码所示.当我运行代码时,CameraAvailableCB中的烤面包机显示并显示“onCameraAvailable”,但SurfaceVIEw上没有任何内容.

如何在SurfaceVIEw上显示相机显示?

@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_main);    this.mBtnCapture = (button) findVIEwByID(R.ID.actMain_btn_capture);    this.mSurfaceVIEw = (SurfaceVIEw) findVIEwByID(R.ID.actMain_surfaceVIEw);    this.mSurfaceHolder = this.mSurfaceVIEw.getHolder();    this.mSurfaceHolder.addCallback(this);    this.mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);    try {        cameraIDsList = this.mCameraManager.getCameraIDList();        for (String ID : cameraIDsList) {            Log.v(TAG,"CameraID: " + ID);        }    } catch (CameraAccessException e) {        e.printstacktrace();    }    cameraStateCB = new CameraDevice.StateCallback() {        @OverrIDe        public voID onopened(CameraDevice camera) {            Toast.makeText(getApplicationContext(),"onopened",Toast.LENGTH_SHORT).show();            //requesting permission            int permissionCheck = ContextCompat.checkSelfPermission(activity,Manifest.permission.CAMERA);            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {                if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.CAMERA)) {                } else {                    ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},MY_PERMISSIONS_REQUEST_CAMERA);                    Toast.makeText(getApplicationContext(),"request permission",Toast.LENGTH_SHORT).show();                }            } else {                Toast.makeText(getApplicationContext(),"PERMISSION_ALREADY_GRANTED",Toast.LENGTH_SHORT).show();            }            //opening the camera            try {                mCameraManager.openCamera(cameraIDsList[1],cameraStateCB,new Handler());            } catch (CameraAccessException e) {                e.printstacktrace();            }        }        @OverrIDe        public voID ondisconnected(CameraDevice camera) {            Toast.makeText(getApplicationContext(),"ondisconnected",Toast.LENGTH_SHORT).show();        }        @OverrIDe        public voID onError(CameraDevice camera,int error) {            Toast.makeText(getApplicationContext(),"onError",Toast.LENGTH_SHORT).show();        }    };    CameraManager.AvailabilityCallback cameraAvailableCB = new CameraManager.AvailabilityCallback() {        @OverrIDe        public voID onCameraAvailable(String cameraID) {            super.onCameraAvailable(cameraID);            Toast.makeText(getApplicationContext(),"onCameraAvailable",Toast.LENGTH_SHORT).show();        }        @OverrIDe        public voID onCameraUnavailable(String cameraID) {            super.onCameraUnavailable(cameraID);            Toast.makeText(getApplicationContext(),"onCameraUnavailable",Toast.LENGTH_SHORT).show();        }    };    this.mCameraManager.registeravailabilityCallback(cameraAvailableCB,new Handler());}@OverrIDepublic voID onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode,permissions,grantResults);    switch (requestCode) {        case MY_PERMISSIONS_REQUEST_CAMERA:            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)                // Open Camera                break;    }}@OverrIDepublic voID surfaceCreated(SurfaceHolder holder) {    Log.w(TAG,"surfaceCreated");}@OverrIDepublic voID surfaceChanged(SurfaceHolder holder,int format,int wIDth,int height) {    Log.w(TAG,"surfaceChanged");}@OverrIDepublic voID surfaceDestroyed(SurfaceHolder holder) {    Log.w(TAG,"surfaceDestroyed");}
解决方法 要使用Camera2 API从相机显示预览,您应该执行以下步骤:

>获得使用相机设备的权限
>使用CameraManager打开与相机的连接
准备表面预览
>使用打开的相机设备和所需的曲面(它不仅可以包括预览曲面)创建CaptureSession
> CaptureSession创建后,您需要创建并配置CaptureRequest并将其提交给CaptureSession

需要注意的是,准备表面和打开连接到相机是独立的过程,所以您需要确保它们都是在创建CaptureSession之前完成的.

以下是在屏幕上显示相机预览的活动示例:

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback,Handler.Callback {    static final String TAG = "CamTest";    static final int MY_PERMISSIONS_REQUEST_CAMERA = 1242;    private static final int MSG_CAMERA_OPENED = 1;    private static final int MSG_SURFACE_READY = 2;    private final Handler mHandler = new Handler(this);    SurfaceVIEw mSurfaceVIEw;    SurfaceHolder mSurfaceHolder;    CameraManager mCameraManager;    String[] mCameraIDsList;    CameraDevice.StateCallback mCameraStateCB;    CameraDevice mCameraDevice;    CameraCaptureSession mCaptureSession;    boolean mSurfaceCreated = true;    boolean mIsCameraConfigured = false;    private Surface mCameraSurface = null;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        this.mSurfaceVIEw = (SurfaceVIEw) findVIEwByID(R.ID.SurfaceVIEwPrevIEw);        this.mSurfaceHolder = this.mSurfaceVIEw.getHolder();        this.mSurfaceHolder.addCallback(this);        this.mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);        try {            mCameraIDsList = this.mCameraManager.getCameraIDList();            for (String ID : mCameraIDsList) {                Log.v(TAG,"CameraID: " + ID);            }        } catch (CameraAccessException e) {            e.printstacktrace();        }        mCameraStateCB = new CameraDevice.StateCallback() {            @OverrIDe            public voID onopened(CameraDevice camera) {                Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();                mCameraDevice = camera;                mHandler.sendEmptyMessage(MSG_CAMERA_OPENED);            }            @OverrIDe            public voID ondisconnected(CameraDevice camera) {                Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();            }            @OverrIDe            public voID onError(CameraDevice camera,int error) {                Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();            }        };    }    @OverrIDe    protected voID onStart() {        super.onStart();        //requesting permission        int permissionCheck = ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA);        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {            if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)) {            } else {                ActivityCompat.requestPermissions(this,MY_PERMISSIONS_REQUEST_CAMERA);                Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();            }        } else {            Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();            try {                mCameraManager.openCamera(mCameraIDsList[1],mCameraStateCB,new Handler());            } catch (CameraAccessException e) {                e.printstacktrace();            }        }    }    @OverrIDe    protected voID onStop() {        super.onStop();        try {            if (mCaptureSession != null) {                mCaptureSession.stopRepeating();                mCaptureSession.close();                mCaptureSession = null;            }            mIsCameraConfigured = false;        } catch (final CameraAccessException e) {            // Doesn't matter,cloising device anyway            e.printstacktrace();        } catch (final IllegalStateException e2) {            // Doesn't matter,cloising device anyway            e2.printstacktrace();        } finally {            if (mCameraDevice != null) {                mCameraDevice.close();                mCameraDevice = null;                mCaptureSession = null;            }        }    }    @OverrIDe    public boolean handleMessage(Message msg) {        switch (msg.what) {            case MSG_CAMERA_OPENED:            case MSG_SURFACE_READY:                // if both surface is created and camera device is opened                // - ready to set up prevIEw and other things                if (mSurfaceCreated && (mCameraDevice != null)                        && !mIsCameraConfigured) {                    configureCamera();                }                break;        }        return true;    }    private voID configureCamera() {        // prepare List of surfaces to be used in capture requests        List<Surface> sfl = new ArrayList<Surface>();        sfl.add(mCameraSurface); // surface for vIEwfinder prevIEw        // configure camera with all the surfaces to be ever used        try {            mCameraDevice.createCaptureSession(sfl,new CaptureSessionListener(),null);        } catch (CameraAccessException e) {            e.printstacktrace();        }        mIsCameraConfigured = true;    }    @OverrIDe    public voID onRequestPermissionsResult(int requestCode,@NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode,grantResults);        switch (requestCode) {            case MY_PERMISSIONS_REQUEST_CAMERA:                if (ActivityCompat.checkSelfPermission(this,Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)                    try {                        mCameraManager.openCamera(mCameraIDsList[1],new Handler());                    } catch (CameraAccessException e) {                        e.printstacktrace();                    }                break;        }    }    @OverrIDe    public voID surfaceCreated(SurfaceHolder holder) {        mCameraSurface = holder.getSurface();    }    @OverrIDe    public voID surfaceChanged(SurfaceHolder holder,int height) {        mCameraSurface = holder.getSurface();        mSurfaceCreated = true;        mHandler.sendEmptyMessage(MSG_SURFACE_READY);    }    @OverrIDe    public voID surfaceDestroyed(SurfaceHolder holder) {        mSurfaceCreated = false;    }    private class CaptureSessionListener extends            CameraCaptureSession.StateCallback {        @OverrIDe        public voID onConfigureFailed(final CameraCaptureSession session) {            Log.d(TAG,"CaptureSessionConfigure Failed");        }        @OverrIDe        public voID onConfigured(final CameraCaptureSession session) {            Log.d(TAG,"CaptureSessionConfigure onConfigured");            mCaptureSession = session;            try {                CaptureRequest.Builder prevIEwRequestBuilder = mCameraDevice                        .createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);                prevIEwRequestBuilder.addTarget(mCameraSurface);                mCaptureSession.setRepeatingRequest(prevIEwRequestBuilder.build(),null,null);            } catch (CameraAccessException e) {                Log.d(TAG,"setting up prevIEw Failed");                e.printstacktrace();            }        }    }}
总结

以上是内存溢出为你收集整理的android – 如何在SurfaceView上显示相机预览?全部内容,希望文章能够帮你解决android – 如何在SurfaceView上显示相机预览?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1133769.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存