Подтвердить что ты не робот

Замена пользовательской камеры Android после увеличения

У меня есть пользовательская камера, которая отлично работает на некоторых устройствах. Он хорошо работает на Samsung Galaxy Gran Duos (samsung-gt i9082, Android 4.2.2), но когда я пытаюсь захватить изображение, которое я увеличил до этого, он замерзает, без сбоев, единственный способ выйти - нажать Кнопка назад. Это происходит только в Samsung Galaxy Gran Duos.

Код, который я использовал для съемки:

    Camera.PictureCallback photoCallback = new Camera.PictureCallback() {

    public void onPictureTaken(byte[] data, Camera camera) {

        try {

        } catch (Exception e) {
            if (flePicture== null){
                Log.d("camera", "Error creating media file, check storage permissions: " +
                        e.getMessage());
                return;
            }
        }

        try {
            FileOutputStream fos = new FileOutputStream(flePicture);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d("camera", "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d("camera", "Error accessing file: " + e.getMessage());
        } 
    }
};

И код, используемый для увеличения:

private void zoomIn() {
    if (pblnInPreview) {
        Camera.Parameters parameters = camCamera.getParameters();

        if ((parameters.getZoom() + 1) < parameters.getMaxZoom()) {
            parameters.setZoom(parameters.getZoom() + 1);
            camCamera.setParameters(parameters);
        }
    }
}

LogCat:

04-07 17:21:14.386: E/BrcmCamera(130): processControlBuffer: Corrupt stream error raised by camera - sensor communication failure
4b9b3361

Ответ 1

Я думаю, вам нужно подтвердить, что ваша камера поддерживает масштабирование с помощью camera.isZoomSupported(), а затем, если она поддерживается, вам необходимо отменить автофокус с помощью camera.cancelAutoFocus(), чтобы предотвратить искажения изображения. Но это будет работать, только если ваше устройство действительно поддерживает масштабирование. Если нет, вам нужно захватить изображение удержания и увеличить масштаб после использования Bitmap.createBitmap нужного раздела.

Ответ 2

Это не сильно ответ. Я знаю.

Но я бы хотел сказать, что у Samsung 4.2.2 много проблем. У этого есть сбой ClipboardManager, авария ActionBar AppCompat и т.д.

Просто отфильтруйте его с помощью простого предложения if и сохраните свою жизнь.

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1 && Build.MANUFACTURER.toUpperCase().contains("SAMSUNG")){
    // ignore
}else{
    // your logic on the go
}

Ответ 3

Вы снова запускаете предварительный просмотр камеры после съемки?

добавить camera.startPreview();

Попробуйте это

     Camera.PictureCallback photoCallback = new Camera.PictureCallback() {

    public void onPictureTaken(byte[] data, Camera camera) {
           camera.startPreview();
        try {

        } catch (Exception e) {
            if (flePicture== null){
                Log.d("camera", "Error creating media file, check storage permissions: " +
                        e.getMessage());
                return;
            }
        }

        try {
            FileOutputStream fos = new FileOutputStream(flePicture);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d("camera", "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d("camera", "Error accessing file: " + e.getMessage());
        } 
    }
};

Ответ 4

Это проблема с конкретным типом ядра.

Попробуйте этот подход.

private static final String TAG = Test.class.getSimpleName();

private boolean isPreviewStarted;
private Camera camera;

Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {

        // check if this needs to stop the preview
        if (deviceNeedsStopPreviewToShoot()) {
            stopPreview();
        }

        // save your image

        // restart preview if needed.
        startPreview();

    }
};

public void startPreview() {
    if (!isPreviewStarted && camera != null) {
        camera.startPreview();
        isPreviewStarted = true;
    }
}

public void stopPreview() {
    if (isPreviewStarted && camera != null) {
        camera.stopPreview();
        isPreviewStarted = false;
    }
}

public static boolean deviceNeedsStopPreviewToShoot() {
    String[] oldDevices = {"smdk4210", "aries"};
    boolean needs = Arrays.asList(oldDevices).contains(Build.BOARD);
    Log.e(TAG, "Device " + Build.BOARD + (needs ? " needs " : " doesn't need ") + "to stop preview");
    return needs;
}