我正在使用摄像头服务,但是在弹出式摄像头中摄像头是连续打开的吗?

时间:2020-10-17 09:47:53

标签: android android-studio android-camera android-camera2

基本上我有一个摄像头服务,我曾经用它来捕获图像,但是在弹出式摄像头中,摄像头一直都是openend的,请帮助我,我也调用了session.close()。下面我粘贴了我的代码 并且我还创建了一项在后台连续运行的服务。请帮助我。我尝试了所有替代方法,但没有任何效果。

public class OnplusRightService extends Service {

GPSTracker gps;
Intent cameraIntent;

protected static final String TAG = "ASA";
protected static final int CAMERACHOICE = CameraCharacteristics.LENS_FACING_FRONT;
protected CameraDevice cameraDevice;
protected CameraCaptureSession session;
protected ImageReader imageReader;

protected CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() {
    @Override
    public void onOpened(@NonNull CameraDevice camera) {
        Log.i(TAG, "CameraDevice.StateCallback onOpened");
        cameraDevice = camera;
        actOnReadyCameraDevice();
    }

    @Override
    public void onDisconnected(@NonNull CameraDevice camera) {
        Log.w(TAG, "CameraDevice.StateCallback onDisconnected");
    }

    @Override
    public void onError(@NonNull CameraDevice camera, int error) {
        Log.e(TAG, "CameraDevice.StateCallback onError " + error);
    }
};

protected CameraCaptureSession.StateCallback sessionStateCallback = new CameraCaptureSession.StateCallback() {
    @Override
    public void onConfigured(@NonNull CameraCaptureSession session) {
        Log.i(TAG, "CameraCaptureSession.StateCallback onConfigured");
        OnplusRightService.this.session = session;
        try {
            session.setRepeatingRequest(createCaptureRequest(), null, null);

        } catch (CameraAccessException e) {
            Log.e(TAG, e.getMessage());
        }
    }

    @Override
    public void onConfigureFailed(@NonNull CameraCaptureSession session) {
    }
};
protected ImageReader.OnImageAvailableListener onImageAvailableListener = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Log.i(TAG, "onImageAvailable");
        for (int i = 0; i < 1; i++) {
            Image img = reader.acquireLatestImage();
            if (img != null) {
                try {
                    processImage(img);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
                img.close();
            }
        }
        stopSelf();
    }
};

public void readyCamera() {

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
        CameraManager manager = (CameraManager) getSystemService(CAMERA_SERVICE);
        try {
            String pickedCamera = getCamera(manager);
            manager.openCamera(pickedCamera, cameraStateCallback, null);
            imageReader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1 /* images buffered */);
            imageReader.setOnImageAvailableListener(onImageAvailableListener, null);
            Log.i(TAG, "imageReader created");
        } catch (CameraAccessException e) {
            Log.e(TAG, e.getMessage());
        }
    }

}

/**
 * Return the Camera Id which matches the field CAMERACHOICE.
 */
public String getCamera(CameraManager manager) {
    try {
        for (String cameraId : manager.getCameraIdList()) {
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
            int cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING);
            if (cOrientation == CAMERACHOICE) {
                return cameraId;
            }
        }
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand flags " + flags + " startId " + startId);
    gps = new GPSTracker(OnplusRightService.this);
    cameraIntent = intent;
    readyCamera();
    return super.onStartCommand(intent, flags, startId);

}

public void actOnReadyCameraDevice() {
    try {
        cameraDevice.createCaptureSession(Arrays.asList(imageReader.getSurface()), sessionStateCallback, null);
    } catch (CameraAccessException e) {
        Log.e(TAG, e.getMessage());
    }
}

@Override
public void onDestroy() {
    /*try {
        session.abortCaptures();
    } catch (CameraAccessException e) {
        Log.e(TAG, e.getMessage());
    }*/
    session.close();

    Intent intent = new Intent("custom-event-name");
    // You can also include some extra data.
    intent.putExtra("message", "This is my message!");
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

    super.onDestroy();

}

private void processImage(Image image) throws CameraAccessException {

    final ByteBuffer buffer = image.getPlanes()[0].getBuffer();
    final byte[] bytes = new byte[buffer.capacity()];
    buffer.get(bytes);
   // session.abortCaptures();
    saveImageToDisk(bytes);
    session.abortCaptures();
    image.close();

   

   // session.abortCaptures();

}

protected CaptureRequest createCaptureRequest() {
    try {
        CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        builder.addTarget(imageReader.getSurface());

        return builder.build();

    } catch (CameraAccessException e) {
        Log.e(TAG, e.getMessage());
        return null;
    }
}


@Override
public IBinder onBind(Intent intent) {
    return null;
}

0 个答案:

没有答案