
如何在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上显示相机预览?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)