日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android surfaceview camera,android – 如何在SurfaceView上显示相机预览? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

要使用Camera2 API從相機(jī)顯示預(yù)覽,您應(yīng)該執(zhí)行以下步驟:

>獲得使用相機(jī)設(shè)備的權(quán)限

>使用CameraManager打開與相機(jī)的連接

準(zhǔn)備表面預(yù)覽

>使用打開的相機(jī)設(shè)備和所需的曲面(它不僅可以包括預(yù)覽曲面)創(chuàng)建CaptureSession

> CaptureSession創(chuàng)建后,您需要創(chuàng)建并配置CaptureRequest并將其提交給CaptureSession

需要注意的是,準(zhǔn)備表面和打開連接到相機(jī)是獨(dú)立的過程,所以您需要確保它們都是在創(chuàng)建CaptureSession之前完成的.

以下是在屏幕上顯示相機(jī)預(yù)覽的活動示例:

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 sfl = new ArrayList();

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

}

}

}

}

總結(jié)

以上是生活随笔為你收集整理的android surfaceview camera,android – 如何在SurfaceView上显示相机预览?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。