国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android studio Camera2實現(xiàn)的詳細流程

這篇具有很好參考價值的文章主要介紹了Android studio Camera2實現(xiàn)的詳細流程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前提

TextureView.SurfaceTextureListener是一個接口,用于監(jiān)聽TextureView中的SurfaceTexture的狀態(tài)更改。在使用相機時,您可以使用TextureView來顯示相機預覽。通過實現(xiàn)SurfaceTextureListener接口,您可以在SurfaceTexture準備好時開始相機預覽,并在SurfaceTexture銷毀時停止預覽。

注意: 必須是在 onSurfaceTextureAvailable 準備好后,才可開啟相機

  • 接口如下:
  • (案例代碼中是以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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 十分鐘實現(xiàn) Android Camera2 相機拍照

    十分鐘實現(xiàn) Android Camera2 相機拍照

    因為工作中要使用 Android Camera2 API ,但因為 Camera2 比較復雜,網(wǎng)上資料也比較亂,有一定入門門檻,所以花了幾天時間系統(tǒng)研究了下,并在 CSDN 上記錄了下,希望能幫助到更多的小伙伴。 上篇文章 我們使用 Camera2 實現(xiàn)了相機預覽的功能,這篇文章我們接著上文,來實現(xiàn) Cam

    2024年02月11日
    瀏覽(94)
  • 十分鐘實現(xiàn) Android Camera2 相機預覽

    十分鐘實現(xiàn) Android Camera2 相機預覽

    因為工作中要使用 Android Camera2 API ,但因為 Camera2 比較復雜,網(wǎng)上資料也比較亂,有一定入門門檻,所以花了幾天時間系統(tǒng)研究了下,并在 CSDN 上記錄了下,希望能幫助到更多的小伙伴。 Camera2 API 的包名是 android.hardware.camera2 ,是 Android 5.0 后推出的一套調(diào)用攝像頭設(shè)備的接口

    2024年02月13日
    瀏覽(42)
  • Android 使用Camera2 API 和 GLSurfaceView實現(xiàn)相機預覽

    GLSurfaceView 和 SurfaceView 是 Android 中用于顯示圖像的兩個視圖類,它們在實現(xiàn)方式和使用場景上有一些區(qū)別。 實現(xiàn)方式:GLSurfaceView 基于 OpenGL ES 技術(shù)實現(xiàn),可以通過 OpenGL ES 渲染圖像。而 SurfaceView 則是通過基于線程的繪制方式,可以在獨立的線程中進行繪制操作。 性能:由于

    2024年02月09日
    瀏覽(20)
  • Android 11.0 MTK Camera2 設(shè)置默認拍照尺寸功能實現(xiàn)

    Android 11.0 MTK Camera2 設(shè)置默認拍照尺寸功能實現(xiàn)

    在11.0的系統(tǒng)rom定制化開發(fā)中,在mtk平臺的camera2關(guān)于拍照的一些功能修改中,在一些平臺默認需要設(shè)置最大的分辨率 來作為拍照的分辨率,所以就需要了解拍照尺寸設(shè)置流程,然后來實現(xiàn)相關(guān)的功能 如圖: Camera API中主要涉及以下幾個關(guān)鍵類 CameraManager:相機的實際管理者,調(diào)

    2024年01月21日
    瀏覽(126)
  • Android 12.0 MTK Camera2 設(shè)置默認拍照尺寸功能實現(xiàn)

    Android 12.0 MTK Camera2 設(shè)置默認拍照尺寸功能實現(xiàn)

    在12.0的系統(tǒng)rom定制化開發(fā)中,在mtk平臺的camera2關(guān)于拍照的一些功能修改中,在一些平臺默認需要設(shè)置最大的分辨率 來作為拍照的分辨率,所以就需要了解拍照尺寸設(shè)置流程,然后來實現(xiàn)相關(guān)的功能 如圖:

    2024年02月20日
    瀏覽(35)
  • Android Camera2(1)-Camera2在textureView中的預覽和拍照

    Android Camera2(1)-Camera2在textureView中的預覽和拍照

    解釋上訴示意圖,假如想要同時拍攝兩張不同尺寸的圖片,并且在拍攝過程中閃光燈必須亮起來。整個拍攝流程如下: 創(chuàng)建一個用于從 Pipeline 獲取圖片的 CaptureRequest。 修改 CaptureRequest 的閃光燈配置,讓閃光燈在拍照過程中亮起來。 創(chuàng)建兩個不同尺寸的 Surface 用于接收圖片

    2024年02月05日
    瀏覽(26)
  • 【Camera2 教程二】Camera2相機打開和關(guān)閉接口調(diào)用詳細說明

    上一章《Camera2教程一》里我們介紹了一些 Camera2 的基礎(chǔ)知識,但是并沒有涉及太多的 API,從本章開始我們會開發(fā)一個具有完整相機功能的應用程序,并且將相機知識分成多個篇章進行介紹,而本章所要介紹的就是相機的開啟流程。 閱讀本章之后,你將學會以下幾個知識點:

    2024年04月25日
    瀏覽(35)
  • Android 高通Camera2 Camera Device Close

    Android 高通Camera2 Camera Device Close

    ?1、很多人看到這個日志第一感覺可能覺得哪里沒有合理釋放,于是帶著這個思路去進行百度探索 2、一開始我去尋找?ImageReader.OnImageAvailableListener 這個問題 3、后面網(wǎng)上去尋找因為? Camera2最大連拍限制是 2 網(wǎng)上很多數(shù)包括Google相機源碼 需要單獨開個線程去處理圖片的邏輯

    2023年04月09日
    瀏覽(21)
  • Android Camera2 —CameraManager API詳解

    一、CameraManager類概述 CameraManager是用于檢測、表征和連接到 CameraDevices 的系統(tǒng)服務管理器。 CameraManager 是一個負責查詢和建立相機連接的系統(tǒng)服務,它的功能不多,這里列出幾個 CameraManager 的關(guān)鍵功能: 1)、將相機信息封裝到 Camera Characteristics 中,并提獲取 CameraCharacterist

    2024年02月12日
    瀏覽(48)
  • NDK Android平臺camera2采集視頻

    NDK Android平臺camera2采集視頻

    《Android平臺使用camera2采集視頻 代碼實現(xiàn) 》鏈接: https://edu.csdn.net/learn/38258/606148?spm=1003.2001.3001.4157 在Android平臺開發(fā)實時音視頻項目,攝像頭的采集是一個必不可少的流程;通常在Android平臺上采集攝像頭數(shù)據(jù)可以使用Camera1接口、Camera2接口或者CameraX接口。Camera1接口只支持

    2024年02月11日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包