2014-11-17 135 views
9

我想创建一个自定义相机应用程序。我从这里跟着Android Developer的例子进行了小小的调整。不过,我的相机预览变得相当黑暗。另一方面,股票相机提供了更加明亮的预览。Android相机预览很暗

我尝试了几个设置,使其工作得更好,但似乎没有任何影响。相关代码张贴在这里。

CameraActivity(主)

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camera); 
    if(CameraHelper.checkCameraHardware(this)) { 
     mHelper = new CameraHelper(this, getWindowManager().getDefaultDisplay()); 
    } 

    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
    mPreview = new CameraPreview(this, CameraHelper.camera); 
    mPreview.setLayoutParams(new LayoutParams(CameraHelper.mSize.width, CameraHelper.mSize.height, Gravity.CENTER)); 

    preview.addView(mPreview); 

} 

CameraHelper类(初始化相机并设置默认参数)

public CameraHelper(CameraListener listener, Display display){ 
     mListener = listener; 
     camera = getCameraInstance(); 

     mParameters = camera.getParameters(); 
     initCameraParameters(); 

     mSize = getPreviewSize(display); 
     mParameters.setFocusMode(Parameters.FOCUS_MODE_AUTO); 
     mParameters.setPictureSize(2560, 1920); 

     mParameters.setAutoExposureLock(false); 
     mParameters.setAutoWhiteBalanceLock(false); 
     mParameters.set("iso", "ISO800"); //Tried with 400, 800, 600 (values obtained from flatten()) 
     mParameters.setColorEffect("none"); 
     mParameters.setPictureSize(2560, 1920); 
     mParameters.setPreviewFrameRate(20); 
     mParameters.set("scene-mode", "auto"); 
     mParameters.setFocusMode("auto"); 
     mParameters.setExposureCompensation(4);  
     camera.setParameters(mParameters); 
    } 

将摄像机从例如发送帧SurfaceHolder.Surface从上面的开发者页面链接。

看到这里的区别: 股票相机应用 Stock Camera Preview 我的相机应用 My Camera app

尝试设置ISO等基于从这里张贴的相机upack参数。它仍然没有工作。

参数(16369): 效应值=无,单,消极,棕褐色,水色,锐化,紫色,绿色,色调,蓝色色调,粉色,黄色,红色色调,单,古董;曝光补偿步= 0.5;焦距= 3.43;对焦区=(0,0,0,0,0);对焦距离= 0.10,1.20,无穷远;将对焦模式值=汽车,宏, facedetect; GPS海拔= 0; GPS纬度= 0; GPS的经度= 0; GPS处理法=全球定位系统; GPS时间戳= 0;水平视角= 51.2; ISO =汽车;异值=汽车,ISO50,ISO100,ISO200,ISO400,ISO800,ISO1600; JPEG-质量= 1; JPEG缩略图高度= 480; JPEG缩略图大小的值= 640x480,0x0; JPEG缩略图宽度= 640; MAX-曝光补偿= 4; MAX-NUM-聚焦区域= 1;最大变焦= 12;最小曝光补偿= -4;画面格式= JPEG;画面格式值= JPEG;图像尺寸值= 2560x1920,2560x1536,2048x1536,2048x1232,1600x1200,1600x960,800x 480,640x480;预览格式= yuv420sp;预览格式值= yuv420sp;预览FPS-范围= 15000,30000;预览FPS-范围值=(15000,30000);预览帧率= 30;预览-frame-率值= 30;预览大小640×480 =;预览大小值= 1280x720,800x480,720x480,640x480,352x288;旋转= 0;场景模式=自动;场景模式值=汽车,肖像,风景,夜间,海滩,雪,日落,焰火,运动,聚会,烛光,ASD,背光源,黄昏黎明,文本,水落颜色;垂直视角= 39.4;视频帧格式= yuv422i-YUYV ;最大光圈值=汽车,白炽灯,荧光灯,日光,阴天,日光;变焦= 0;缩小比率= 100,125,150,175,200,225,250,275,300,325,350,375,400;放大支持= TRUE;将对焦模式=汽车;画面尺寸= 2560x1920;曝光补偿= 4 ;

编辑:根据下面的评论进一步测试,它看起来只是它的预览比它应该是黑暗的。实际拍摄的图像光线充足,曝光补偿似乎工作正常。它只是让我头痛的预览。测试i9003运行CM11和Nexus 10运行股票机器人。

+0

您可能想尝试在您的设置中“玩耍”/增加曝光补偿。它会改变什么吗? –

+0

我使用最大支持的曝光补偿,即4(mParameters.setExposureCompensation(4))。该照片是以最大曝光补偿拍摄的。 – Puneet

+0

您是否从“params.getMinExposureCompensation()”和“params.getMaxExposureCompensation()”获得了expo-compensation的最大/最小值? –

回答

1

从我的实验中,scene-mode设置可以更改预览(与ISO或曝光补偿不同,这两种工具都适用于拍摄的照片)。请勿使用auto。尝试scene-mode-values=nightscene-mode=dusk-dawn

场景的问题在于支持的值在各个设备之间不是标准化的。但通常会出现某种night

+0

我已经测试过这在Nexus 7(Android L)和前置摄像头上工作正常,但背部摄像头显示黑暗预览,我尝试设置夜间模式,但没有用,我尝试了其他流行的摄像头应用程序,我发现即使他们没有做到这一点。是谷歌相机。是否有任何与颜色效果有关? – Praveen

+0

@Praveen:我还没有对[GoogleCamera](https://play.google.com/store/apps/details?id=com.google .android。谷歌相机),但从其要求(4.4及更高版本)和对Nexus设备的额外关注来看,我可能认为他们将其调整为Nexus 7上的不太精彩的后置摄像头。 –

+0

夜景或派对等场景模式将激活相机 - 至少Nexus 5就是这种情况。我所做的就是测量光线,然后逐渐改变曝光值。这导致了一个不错的结果。 – slott

9

某些摄像头错误地报告了支持的预览FPS范围似乎存在一个错误。调用

getPreviewFpsRange (int[] range)

当在我的情况下,你可以找出那些对于最小值和最大值返回相同的值有问题的设备,我看到这个问题与设备所报告(15000, 15000)(30000, 30000),但不能与设备,其中值是不同的,如(7000, 30000)

我能找到的最好的解决办法是确定了最低和最高值不同的支持FPS范围,并设置:

Camera.Parameters params = camera.getParameters(); 
final int[] previewFpsRange = new int[2]; 
params.getPreviewFpsRange(previewFpsRange); 
if (previewFpsRange[0] == previewFpsRange[1]) { 
    final List<int[]> supportedFpsRanges = params.getSupportedPreviewFpsRange(); 
    for (int[] range : supportedFpsRanges) { 
     if (range[0] != range[1]) { 
      params.setPreviewFpsRange(range[0], range[1]); 
      break; 
     } 
    } 
} 
camera.setParameters(params); 

这工作,因为报告的范围似乎只拥有1项与实际的范围。例如:

BLU体内XL:

preview-fps-range=30000,30000 
preview-fps-range-values=(15000,15000),(20000,20000),(24000,24000),(5000,30000),(30000,30000) 

像素:

preview-fps-range=7000,30000 
preview-fps-range-values=(15000,15000),(24000,24000),(7000,30000),(30000,30000) 

更健壮的方法是通过比较所有这些可用于设置最小和最大。

+0

这可能很容易成为原始问题的问题:正如我在评论中指出的那样,其中的代码设置FPS = 20,而相机则报告支持范围(15-30)fps。 –

+0

在我的nexus 7中,我可以更改场景模式,但无法在预览中显示色彩效果,即使拍摄的照片也可以获得效果。按快门按钮时,我可以看到色彩效果的一小部分。我尝试了FPS范围的所有组合,但没有用。任何想法? – Praveen

+0

让我试试FPS调整(更正),然后回复你。我确实尝试了很多设置,所以我保持了我的手指交叉。 – Puneet