mardi 21 juin 2016

Android Camera2 Api SecurityException Code Integration into activity

I have been learning android for 2 days now and I am trying to build a simple camera application.

Its really confusing for me right now. I know this question has been asked before here

Android Camera2 API SecurityException

And I understand the solution but I don't know how to add it into my code.

Here's my activity file.

Can someone please help me out on how the code integrates into the activity file. Thank you so much.

package com.example.letstry;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.os.Bundle;
import android.os.HandlerThread;
import android.support.v4.content.ContextCompat;
import android.util.Size;
import android.view.TextureView;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.view.Surface;
import android.os.Handler;
import android.view.Window;
import android.view.WindowManager;

import java.util.Arrays;

public class MainActivity extends Activity {

private static final String TAG = "SimpleCamera";
private TextureView mTextureView = null;
private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {

        CameraManager cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);
        try {
            String cameraId = cameraManager.getCameraIdList()[0];
            CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];

            cameraManager.openCamera(cameraId, mStateCallBack, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

    }
};

private Size mPreviewSize = null;
private CameraDevice mCameraDevice = null;
private CaptureRequest.Builder mPreviewBuilder = null;
private CameraCaptureSession mPreviewSession = null;
private CameraDevice.StateCallback mStateCallBack = new CameraDevice.StateCallback() {

    @Override
    public void onOpened(CameraDevice cameraDevice) {
        mCameraDevice = cameraDevice;

        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        if (texture == null) {
            //Texture is null
            return;
        }

        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface surface = new Surface(texture);

        try {
            mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

        mPreviewBuilder.addTarget(surface);

        try {
            mCameraDevice.createCaptureSession(Arrays.asList(surface), mPreviewStateCallback, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDisconnected(CameraDevice cameraDevice) {

    }

    @Override
    public void onError(CameraDevice cameraDevice, int i) {

    }
};

private CameraCaptureSession.StateCallback mPreviewStateCallback = new CameraCaptureSession.StateCallback() {

    @Override
    public void onConfigured(CameraCaptureSession cameraCaptureSession) {
        mPreviewSession = cameraCaptureSession;
        mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);


        HandlerThread backgroundThread = new HandlerThread("CameraPreview");
        backgroundThread.start();
        Handler backgroundHandler = new Handler(backgroundThread.getLooper());

        try {
            mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, backgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {

    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_main);

    mTextureView = (TextureView) findViewById(R.id.textureView1);
    mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}

@Override
protected void onPause() {
    super.onPause();

    if (mCameraDevice != null) {
        mCameraDevice.close();
        mCameraDevice = null;
    }
}

}

Aucun commentaire:

Enregistrer un commentaire