【问题标题】:Android custom camera freeze after zoom缩放后Android自定义相机冻结
【发布时间】:2015-04-08 13:57:46
【问题描述】:

我有一个可以在某些设备上正常工作的定制相机。它在三星 Galaxy Gran Duos (samsung-gt i9082, Android 4.2.2) 上运行良好,但是当我尝试捕捉之前放大的图像时,它会冻结,没有崩溃,唯一的退出方法是按下返回键。这只发生在三星 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

【问题讨论】:

  • 在全分辨率拍照时是否出现错误?在受影响的设备上以较低的分辨率拍照是否可以接受?
  • @samgak:是的,它发生在所有分辨率中。低分辨率没问题,我已经在用了!谢谢。
  • 设置好参数后是否尝试开始预览?

标签: android camera freeze samsung-galaxy-camera


【解决方案1】:

我认为您需要使用camera.isZoomSupported() 确认您的相机支持变焦,然后如果支持,您需要使用camera.cancelAutoFocus() 取消自动对焦以防止图像失真。 但这只有在您的设备真正支持缩放时才有效。如果不是,您需要使用Bitmap.createBitmap 捕获保留图像并在之后放大您想要的部分。

【讨论】:

    【解决方案2】:

    这不是密切相关的答案。我知道。

    但我想说三星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
    }
    

    【讨论】:

    • 这不是问题的目的。我们需要看到问题的解决方案,而不是越过问题的根源。今天已经这样做了,以防止发生错误,但对我们来说并不理想。
    • @JulioBorges // 你为什么不认为这个模型可能有缺陷的相机驱动程序或固件中的一些包?三星 4.2.2 确实有问题。
    • @Youngjae:三星有它的细节,你说的是真的,但是“if”子句只是避免了这个问题。我在这里发帖之前已经完成了......无论如何,谢谢!
    【解决方案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());
            } 
        }
    };
    

    【讨论】:

    • 首先谢谢您!我试过了,但没有用。图片拍摄没有问题,当我尝试应用缩放时出现问题,屏幕冻结并且没有捕获图片,最大的问题是应用程序仍然存在并且LogCat中没有显示任何内容。
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多