2015-04-08 34 views
24

我有一个自定义相机,在一些设备上工作正常。它在三星Galaxy Gran Duos(samsung-gt i9082,Android 4.2.2)上运行良好,但是当我尝试捕捉一张图像时,我之前放大了图像,它冻结了,没有崩溃,唯一的出路是按返回键。这只发生在三星Galaxy Gran Duos中。Android自定义相机冻结后缩放

,我用来拍照代码:

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 
+0

在所有分辨率下拍照时是否发生错误?在受影响的设备上以较低的分辨率拍照是否可以接受? – samgak

+0

@samgak:是的,它发生在所有决议。没有问题关于较低的分辨率,我已经在使用它!谢谢。 –

+0

您是否在设置参数后尝试启动预览? – Cynapsis

回答

0

这并不强烈相关答案。我知道。

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

这不是问题的目的。我们需要看到问题的解决方案,而不会解决问题的根源。这已经在今天完成了,以防止发生错误,但对我们来说并不理想。 –

+0

@JulioBorges //为什么你不认为这个模型可能有缺陷的相机驱动程序或固件下降一些包?三星4.2.2真的有问题。 – Youngjae

+0

@Youngjae:三星有它的细节,你说的是真实的,但是“if”条款只能避免这个问题。我在这里发布之前已经完成了......无论如何感谢! –

0

您是否在拍照后再次启动相机预览?

添加此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()); 
     } 
    } 
}; 
+0

首先谢谢你!我试过但没有工作。照片拍摄时没有任何问题,当我尝试应用缩放时,屏幕冻结并且没有拍摄照片,问题发生,最大的问题是应用程序仍然存在,LogCat中没有显示任何内容。 –

1

我认为你需要确认你的相机使用camera.isZoomSupported()则支持变焦如果支持您需要取消自动对焦与camera.cancelAutoFocus(),以防止图像distorsions。 但是,只有当您的设备支持缩放时,这才会起作用。如果不是,则需要捕获保持图像,然后使用Bitmap.createBitmap放大所需的部分。

0

这是特定类型的内核的一些问题。

试试这种方法。

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; 
}