前提
TextureView.SurfaceTextureListener是一個接口,用于監(jiān)聽TextureView中的SurfaceTexture的狀態(tài)更改。在使用相機時,您可以使用TextureView來顯示相機預覽。通過實現(xiàn)SurfaceTextureListener接口,您可以在SurfaceTexture準備好時開始相機預覽,并在SurfaceTexture銷毀時停止預覽。
注意
: 必須是在 onSurfaceTextureAvailable 準備好后,才可開啟相機文章來源:http://www.zghlxwxcb.cn/news/detail-451299.html
- 接口如下:
- (案例代碼中是以implements TextureView.SurfaceTextureListener這種形式實現(xiàn))
TextureView textureView = findViewById(R.id.texture_view);
textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
// Open camera and start preview
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
// Handle texture size change if necessary
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
// Stop camera preview and release camera
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
// Handle surface texture update if necessary
}
});
一、獲取CameraManager實例
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
二、獲取可用的相機列表
String[] cameraIds = manager.getCameraIdList();
三、選擇一個相機并打開它
String cameraId = cameraIds[0];
manager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
// 相機已經(jīng)打開,可以進行后續(xù)操作
}
@Override
public void onDisconnected(CameraDevice camera) {
// 相機斷開連接,需要釋放資源
camera.close();
}
@Override
public void onError(CameraDevice camera, int error) {
// 相機打開出錯,需要釋放資源
camera.close();
}
}, null);
四、創(chuàng)建一個CaptureRequest.Builder對象
CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
五、設(shè)置CaptureRequest.Builder對象的參數(shù)
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
六、創(chuàng)建一個CaptureSession對象
camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
// CaptureSession已經(jīng)創(chuàng)建,可以進行后續(xù)操作
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
// CaptureSession創(chuàng)建失敗,需要釋放資源
camera.close();
}
}, null);
七、開始預覽
session.setRepeatingRequest(builder.build(), null, null);
代碼示例
必須是動態(tài)獲取權(quán)限后才能開啟預覽文章來源地址http://www.zghlxwxcb.cn/news/detail-451299.html
- xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
- 處理
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener{
private String[] cameraIds;
private String cameraId;
private CameraManager cameraManager;//從系統(tǒng)服務中獲取相機管理器
private TextureView textureView;
private CameraDevice mCameraDevice;
private CameraCaptureSession cameraCaptureSession;
private CaptureRequest.Builder builder = null;
private static final int ACTION_REQUEST_PERMISSIONS = 0x001;
/**
* 所需的所有權(quán)限信息
*/
private static final String[] NEEDED_PERMISSIONS = new String[]{
Manifest.permission.CAMERA,//相機
};
@SuppressLint({"MissingPermission", "MissingInflatedId"})
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//權(quán)限檢查
if (!checkPermissions(NEEDED_PERMISSIONS)) {
ActivityCompat.requestPermissions(this, NEEDED_PERMISSIONS,
ACTION_REQUEST_PERMISSIONS);
}
textureView=findViewById(R.id.texture_view);
textureView.setSurfaceTextureListener(this);//設(shè)置布局
}
/**
* 權(quán)限檢查
* @param neededPermissions 需要的權(quán)限
* @return 是否全部被允許
*/
protected boolean checkPermissions(String[] neededPermissions) {
if (neededPermissions == null || neededPermissions.length == 0) {
return true;
}
boolean allGranted = true;
for (String neededPermission : neededPermissions) {
allGranted &= ContextCompat.checkSelfPermission(this, neededPermission) == PackageManager.PERMISSION_GRANTED;
}
return allGranted;
}
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {
//布局初始化完成,打開相機
if (checkPermissions(NEEDED_PERMISSIONS)) {
openCamera2();
}
}
@SuppressLint("MissingPermission")
private void openCamera2(){
//一、獲取cameraManager
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
cameraIds = cameraManager.getCameraIdList();//獲取攝像機id的集合
cameraId = cameraIds[0];
cameraManager.openCamera(cameraId,callback,null);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
CameraDevice.StateCallback callback=new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
mCameraDevice = cameraDevice;
createCameraPreviewSession();
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int i) {
}
};
private void createCameraPreviewSession() {
try {
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
// surfaceTexture.setDefaultBufferSize(textureView.getWidth(), textureView.getHeight());
surfaceTexture.setDefaultBufferSize(640, 480);
// surfaceTexture.setDefaultBufferSize(480,640 );
Surface previewSurface = new Surface(surfaceTexture);
builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(previewSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
cameraCaptureSession = session;
try {
cameraCaptureSession.setRepeatingRequest(builder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Toast.makeText(MainActivity.this, "Failed to create camera capture session", Toast.LENGTH_SHORT).show();
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case ACTION_REQUEST_PERMISSIONS: {
// 如果請求被取消,結(jié)果數(shù)組將為空
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 授權(quán)成功,執(zhí)行相關(guān)操作
//打開相機
openCamera2();
} else {
// 授權(quán)失敗,禁用相關(guān)功能或顯示提示信息
}
return;
}
// 處理其他權(quán)限請求
}
}
@Override
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1) {
}
@Override
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) {
return false;
}
@Override
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture) {
}
@Override
protected void onResume() {
super.onResume();
}
}
到了這里,關(guān)于Android studio Camera2實現(xiàn)的詳細流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!