GVKun编程网logo

Android Camera API,HDR照片设置? (三星Galaxy)(三星相机hdr怎么开)

33

本篇文章给大家谈谈AndroidCameraAPI,HDR照片设置?(三星Galaxy),以及三星相机hdr怎么开的知识点,同时本文还将给你拓展AndroidCameraAPIISO设置?、Andro

本篇文章给大家谈谈Android Camera API,HDR照片设置? (三星Galaxy),以及三星相机hdr怎么开的知识点,同时本文还将给你拓展Android Camera API ISO设置?、Android OpenGL纹理在Sprint三星Galaxy s2 Epic Touch 4g上看起来很糟糕、android – Camera2 API和java.lang.IllegalStateException、android – Galaxy S和Galaxy S2的最小宽度等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Android Camera API,HDR照片设置? (三星Galaxy)(三星相机hdr怎么开)

Android Camera API,HDR照片设置? (三星Galaxy)(三星相机hdr怎么开)

有谁知道HDR逻辑是在相机应用程序中还是在Android手机的相机驱动程序中?例如,在三星银河上,您可以在默认相机应用程序上启用HDR模式,以在照片上获得更大的动态范围.是由相机应用程序完成还是由相机驱动程序/ API完成?

例如,我可以编写一个可以在HDR模式下捕获的相机应用程序吗?我在相机设置(如果将设置展平)中注意到,有一个名为“ hdr-mode”的隐藏设置.我试图进行设置,但是当我拍照时报告了错误.

另外,是否有一种方法可以非常快速地捕获每张具有不同曝光值的照片,从而可以对HDR进行后处理?我还看到了一个隐藏的设置,如“每张快门的图片”,看起来可以进行连拍.但这似乎并没有像处理HDR那样需要进行包围曝光的方法.

对于这个示例,假设它是否依赖于特定的手机-我们正在使用galaxy S3.

解决方法:

带有Android 4.2的公共API.

在4.2中可以设置SCENE_MODE_HDR

Camera.Parameters cameraParameters = camera.getParameters();
cameraParameters.setSceneMode(Camera.Parameters.SCENE_MODE_HDR);
camera.setParameters(cameraParameters);

只是一个猜测,您可以尝试将其设置为字符串.

 String android.hardware.Camera.Parameters.SCENE_MODE_HDR = "hdr"

因此在4.2之前的版本中,您可以尝试

cameraParameters.setSceneMode("hdr");

Android Camera API ISO设置?

Android Camera API ISO设置?

有没有人知道在 Android SDK中控制相机的ISO设置?
HTC Desire上的本地摄像头应用程序可以进行ISO设置.

解决方法

你应该看看android.hardware.Camera.Parameters中的flatten(),unflatten(),get(String key),set(String key,String value)的方法.
还要考虑 source code of that class.它可能会使事情更清楚.

首先你需要获取Camera.Parameters.将其缩短到字符串并进行调查.我正在开发HTC Desire以及获得以下字符串:

sharpness-max=30;zoom=0;taking-picture-zoom=0;zoom-supported=true;sharpness-min=0;sharpness=10;contrast=5;whitebalance=auto;jpeg-quality=100;preview-format-values=yuv420sp;jpeg-thumbnail-quality=75;preview-format=yuv420sp;preview-size=640x480;focal-length=3.53;iso=auto;meter-mode=meter-center;front-camera-mode=mirror;flash-mode-values=off,auto,on,torch;preview-frame-rate-values=15;preview-frame-rate=15;focus-mode-values=auto,infinity;jpeg-thumbnail-width=640;jpeg-thumbnail-size-values=640x480,512x384,384x288,0x0;zoom-ratios=100,114,131,151,174,200;saturation-def=5;preview-size-values=1280x720,800x480,768x432,720x480,640x480,576x432,480x320,400x240,352x288,320x240,272x272,240x240,240x160,176x144,160x120;smart-contrast=off;picture-size-values=2592x1952,2592x1456,2592x1936,2592x1728,2592x1552,2048x1536,2048x1360,2048x1216,2048x1152,1600x1200,1584x1056,1280x960,1280x848,1280x768,1280x720,1024x768,640x416,640x384,640x368,400x400,272x272;contrast-min=0;min-exposure-compensation=-4;brightness-min=0;antibanding=auto;taking-picture-zoom-min=0;saturation-min=1;contrast-max=10;vertical-view-angle=42.5;taking-picture-zoom-max=21;contrast-def=5;brightness-max=6;horizontal-view-angle=54.8;brightness=3;jpeg-thumbnail-height=480;cam-mode=0;focus-mode=auto;sharpness-def=10;front-camera-mode-values=mirror,reverse;picture-format-values=jpeg;saturation-max=10;max-exposure-compensation=4;exposure-compensation=0;exposure-compensation-step=0.5;flash-mode=off;effect-values=none,mono,negative,solarize,sepia,posterize,aqua;meter-mode-values=meter-average,meter-center,meter-spot;picture-size=2592x1952;max-zoom=5;effect=none;saturation=5;whitebalance-values=auto,incandescent,fluorescent,daylight,cloudy-daylight;picture-format=jpeg;brightness-def=3;iso-values=auto,deblur,100,200,400,800,1250;enable-caf=off;antibanding-values=off,50hz,60hz,auto

因此,基本上有一个名为iso-values的密钥来检索支持的值和保存当前值的密钥iso.

您可以执行以下操作:

Camera cam = Camera.open();
Camera.Parameters camParams = cam.getParameters();
String supportedisovalues = camParams.get("iso-values"); //supported values,comma separated String
camParams.set("iso",(String)newValue);
cam.setParameters(camParams);

并参考未平坦的参数,我将假设在iso和曝光补偿设置之间存在差异.

Android OpenGL纹理在Sprint三星Galaxy s2 Epic Touch 4g上看起来很糟糕

Android OpenGL纹理在Sprint三星Galaxy s2 Epic Touch 4g上看起来很糟糕

让我先言承认我是一个开放的新手 – 这简直就是一个奇迹我已经用我一直在开发的游戏做到了这一点.

纹理在HTC Evo 3d,Droid Bionic和霹雳上看起来很好.我刚刚购买了Sprint三星galaxy s2,纹理看起来很糟糕 – 我的理论是更大的屏幕,并产生了更低的dpi效果纹理mag过滤(我的另一个理论是我不知道我在做什么).

截图#1 Galaxy S2与HTC Evo 3d
屏幕截图#2 Galaxy S2 vs. HTC Evo 3d

我尝试使用16位,24位和32位纹理启用/禁用抖动,将选项传递给android BitmapFactory解码方法以防止缩放,在下面的片段中禁用我的opengl设置中的每个人,设置自定义eglconfig值的不同组合setEGLConfigChooser,我现在只是在黑暗中拍摄.

所以我的问题是:哪些opengl函数可以负责产生这些屏幕截图中看到的色带(?)/看起来很差的纹理?

另外值得注意的是:

>没有开放的gl错误(我记录每个open gl调用)
>当我添加更多光源时,应用程序性能会大幅下降(而htc evo 3d,仿生和霹雳在多个光源下的工作效果非常好).
> OpenGL ES 1.1(我的应用程序中没有GLES20是)
>我使用min 3d框架
>屏幕&解析度:
> HTC Evo 3d:4.3“屏幕540×960分辨率
> Samasung Sprint galaxy s2:4.52“屏幕800×480分辨率

getwindowManager().getDefaultdisplay().getPixelFormat();
// HTC Evo 3d: 1 (PixelFormat.RGBA_8888)
// Sprint Samsung galaxy s2: 5 (???)

在过去的三天里,我疯狂地搜索了一下,看看是否还有其他人遇到类似的问题并且什么都没发现.感谢您的时间.

//##################        
//# setup (one time calls)
//##################

_gl.glEnable(GL11.GL_DITHER);
_gl.glEnable(GL10.GL_DEPTH_TEST);
_gl.glClearDepthf(1.0f);
_gl.glDepthFunc(GL10.GL_LESS);
_gl.glDepthRangef(0,1f);
_gl.glDepthMask(true);
_gl.glShadeModel(GL10.GL_SMOOTH);

// Alpha enabled
_gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA);
_gl.glAlphaFunc(GL10.GL_GREATER,0.1f);

// ccw frontfaces only,by default
_gl.glFrontFace(GL10.GL_ccw);
_gl.glCullFace(GL10.GL_BACK);
_gl.glEnable(GL10.GL_CULL_FACE);


//##################        
//# onSurfaceCreated
//##################

// build the lights - note this is specific to the min3d framework but 
// its pretty straightforward - if a change is made to a light source the dirty flag     is set
// and calls will be made to opengl to udpate accordingly in the onDrawFrame method
Light light1 = new Light();
light1.position.setAll(0,10,0);
light1.ambient= new Color4Managed(255,255,light1);
light1.diffuse = new Color4Managed(255,light1);
light1.specular = new Color4Managed(255,light1);
light1.type(LightType.DIRECTIONAL);    
_scene.lights().add(light1);


//##################        
//# onSurfaceChanged
//##################

public void onSurfaceChanged(GL10 gl,int w,int h) {
    this.w = w;
    this.h = h;
    _surfaceAspectRatio = (float) w / (float) h;
    _gl.glViewport(0,w,h);

    // all the following updates the frustum
    FrustumManaged vf = _scene.camera().frustum;
    float n = vf.shortSideLength() / 2f;
    float lt,rt,btm,top;
    lt = vf.horizontalCenter() - n * _surfaceAspectRatio;
    rt = vf.horizontalCenter() + n * _surfaceAspectRatio;
    btm = vf.verticalCenter() - n * 1;
    top = vf.verticalCenter() + n * 1;

    if (_surfaceAspectRatio > 1) {
        lt *= 1f / _surfaceAspectRatio;
        rt *= 1f / _surfaceAspectRatio;
        btm *= 1f / _surfaceAspectRatio;
        top *= 1f / _surfaceAspectRatio;
    }

    _gl.glFrustumf(lt,top,vf.zNear(),vf.zFar());

    Util.out("UPDATE VIEW FRUSTUM _surfaceAspectRatio: " + this._surfaceAspectRatio +     " w: " + this.w + " h: " + this.h);
    Util.out("UPDATE VIEW FRUSTUM lt: " + lt + " rt: " + rt + " btm: " + btm + " top:     " + top + " vf.zNear(): " + vf.zNear() + " vf.zFar(): " + vf.zFar());

    // sprint samsung galaxy 2s epic touch 4g
    // 09-18 23:41:31.255: INFO/System.out(14069): 2011-09-18 23:41:31> UPDATE VIEW     FRUSTUM _surfaceAspectRatio: 0.97959185 w: 480 h: 490
    // 09-18 23:41:31.255: INFO/System.out(14069): 2011-09-18 23:41:31> UPDATE VIEW     FRUSTUM lt: -0.48979592 rt: 0.48979592 btm: -0.5 top: 0.5 vf.zNear(): 1.0     vf.zFar(): 30.0

    // htc evo 3d 
    // 09-18 23:46:16.744: INFO/System.out(7958): 2011-09-18 23:46:16> UPDATE VIEW FRUSTUM _surfaceAspectRatio: 0.83076924 w: 540 h: 650
    // 09-18 23:46:16.754: INFO/System.out(7958): 2011-09-18 23:46:16> UPDATE VIEW FRUSTUM lt: -0.41538462 rt: 0.41538462 btm: -0.5 top: 0.5 vf.zNear(): 1.0 vf.zFar(): 30.0
}


//##################        
//# upload texture
//##################

int[] a = new int[1];
_gl.glGenTextures(1,a,0); // create a ''texture name'' and put it in array element 0
_gl.glBindTexture(GL10.GL_TEXTURE_2D,a[0]);

if ($generateMipMap && _gl instanceof GL11) {
    _gl.glTexParameterf(GL11.GL_TEXTURE_2D,GL11.GL_GENERATE_MIPMAP,GL11.GL_TRUE);
}else {
    _gl.glTexParameterf(GL11.GL_TEXTURE_2D,GL11.GL_FALSE);
}

glutils.texImage2D(GL10.GL_TEXTURE_2D,$bitmap,0);    


//##################        
//# onDrawFrame
//##################

// draw setup
_gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);        

// enable or disable lights
if(_scene.lights().isDirty()){
    for (int glIndex = 0; glIndex < NUM_GLLIGHTS; glIndex++) {
        if (_scene.lights().glIndexEnabledDirty()[glIndex] == true) {
            if (_scene.lights().glIndexEnabled()[glIndex] == true) {
                _gl.glEnable(GL10.GL_LIGHT0 + glIndex);
                    _scene.lights().getLightByGlIndex(glIndex).setAllDirty();
                } else {
                    _gl.gldisable(GL10.GL_LIGHT0 + glIndex);
                }
                _scene.lights().glIndexEnabledDirty()[glIndex] = false; //     clear dirtyflag
            }
        }
    _scene.lights().clearDirtyFlag();
}

// handle individual light settings
Light[] lights = _scene.lights().toArray();
for (int i = 0; i < lights.length; i++) {
    Light light = lights[i];
    if (light.isDirty()) // .. something has changed
    {
        int glLightId = GL10.GL_LIGHT0 + _scene.lights().getGlIndexByLight(light);

        if (light.position.isDirty()) {
            light.commitPositionAndTypeBuffer();
            _gl.glLightfv(glLightId,GL10.GL_POSITION,light.positionAndTypeBuffer());
            light.position.clearDirtyFlag();
        }

        if (light.ambient.isDirty()) {
            light.ambient.commitToFloatBuffer();
            _gl.glLightfv(glLightId,GL10.GL_AMBIENT,ligh    t.ambient.floatBuffer());
            light.ambient.clearDirtyFlag();
        }

        if (light.diffuse.isDirty()) {
            light.diffuse.commitToFloatBuffer();
            _gl.glLightfv(glLightId,GL10.GL_DIFFUSE,light.diffuse.floatBuffer());
            light.diffuse.clearDirtyFlag();
        }

        if (light.specular.isDirty()) {
            light.specular.commitToFloatBuffer();
            _gl.glLightfv(glLightId,GL10.GL_specular,light.specular.floatBuffer());
            light.specular.clearDirtyFlag();
        }

        if (light.isVisibleBm().isDirty()) {
            if (light.isVisible()) {
                _gl.glEnable(glLightId);
            } else {
                _gl.gldisable(glLightId);
            }
            light.isVisibleBm().clearDirtyFlag();
        }

        if (light.attenuation().isDirty()) {
            _gl.glLightf(glLightId,GL10.GL_CONSTANT_ATTENUATION,light.attenuation().getX());
            _gl.glLightf(glLightId,GL10.GL_LINEAR_ATTENUATION,ligh    t.attenuation().getY());
            _gl.glLightf(glLightId,GL10.GL_QUAdratIC_ATTENUATION,light.attenuation().getZ());
        }

        light.clearDirtyFlag();
    }
}

// finally draw objects (see deFinition below)
foreach(Object3d $o : _scene.children()){
    drawObject($o);
}


//##################        
//# draw 3d object
//##################

_gl.glEnable(GL10.GL_LIGHTING);
_gl.glEnable(GL10.GL_TEXTURE_2D);
_gl.glEnable(GL10.GL_ALPHA_TEST);
_gl.glEnable(GL10.GL_BLEND);
_gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
_gl.glEnableClientState(GL10.GL_norMAL_ARRAY);
_gl.gldisableClientState(GL10.GL_COLOR_ARRAY);

$o.vertices().normals().buffer().position(0);
_gl.glnormalPointer(GL10.GL_FLOAT,$o.vertices().normals().buffer());

_gl.glEnable(GL10.GL_CULL_FACE);

// draw texture function info below
drawObject_textures($o);

_gl.glTranslatef($o.position().x,$o.position().y,$o.position().z);
_gl.glrotatef(($o.rotation().x),1,0);
_gl.glrotatef(($o.rotation().y),0);
_gl.glrotatef(($o.rotation().z),1);

_gl.glScalef($o.scale().x,$o.scale().y,$o.scale().z);

$o.vertices().points().buffer().position(0);
_gl.glVertexPointer(3,GL10.GL_FLOAT,$o.vertices().points().buffer());

$o.faces().buffer().position(pos);

_gl.glDrawElements($o.renderTypeInt(),$o.faces().size() *    FacesBufferedList.PROPERTIES_PER_ELEMENT,GL10.GL_UNSIGNED_SHORT,$o.faces().buffer());


//##################        
//# draw texture
//##################

int minFilterType = ZoneActivity.mipmap ? GL10.GL_NEAREST_MIPMAP_NEAREST :     GL10.GL_NEAREST;

$o.vertices().uvs().buffer().position(0);

_gl.glActiveTexture(GL10.GL_TEXTURE0 );
_gl.glClientActiveTexture(GL10.GL_TEXTURE0);
_gl.glBindTexture(GL10.GL_TEXTURE_2D,$o.glTextureId);
_gl.glTexCoordPointer(2,$o.vertices().uvs().buffer());
_gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,minFilterType);
_gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_NEAREST);     
_gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
_gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);

编辑:事实证明这是我.看起来像纹理问题是将不正确的值传递给雾函数的副作用(我自然从代码示例中省略了这些函数).

// I was not converting my rgba shorts to the expected range (0.0f,1.0f).
// the evo 3d,bionic,etc. must compensate for people like me and translate
// this to white so i never knew there was a problem
_gl.glFogfv(GL10.GL_FOG_COLOR,[255f,255f,255f]);

_gl.glFogfv(GL10.GL_FOG_COLOR,[1.0f,1.0f,1.0f]);

关闭它可能是安全的.

解决方法

这是在黑暗中刺伤,(我没有使用GL多年)但从你发布的图像和代码行判断“GL10.GL_NEAREST_MIPMAP_NEAREST”或(甚至更糟!)“GL10.GL_NEAREST”,你是会得到丑陋的纹理过滤.请尝试使用“LINEAR”过滤器.

android – Camera2 API和java.lang.IllegalStateException

android – Camera2 API和java.lang.IllegalStateException

我正在创建一个支持弃用和新相机API的应用程序.第一个就像魅力一样,但我正在努力使用Camera2 API.在测试阶段,我注意到了奇怪的行为.测试设备是三星galaxy S5与android 6.0.1
当我按下电源/结束键然后返回应用程序时,这就是我得到的(每次都不会发生):

03-12 16:14:32.704 24117-24117/pl.tripper.tripper E/MainActivity: onPause
03-12 16:14:32.774 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] dequeueBuffer: BufferQueue has been abandoned
03-12 16:14:32.784 24117-24145/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] queueBuffer: BufferQueue has been abandoned
03-12 16:14:33.044 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.044 24117-24145/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.054 24117-24129/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.054 24117-24128/pl.tripper.tripper E/BufferQueueProducer: [SurfaceTexture-1-24117-2] cancelBuffer: BufferQueue has been abandoned
03-12 16:14:33.264 24117-24117/pl.tripper.tripper E/CameraNewApi: cameraComponentsReleased
03-12 16:14:33.264 24117-24117/pl.tripper.tripper E/CameraNewApi: StopCameraThread
03-12 16:14:33.264 24117-24117/pl.tripper.tripper E/Cameraapimanager: cameraPreviewRemoved
03-12 16:14:33.264 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceDestroyed
03-12 16:14:33.634 24117-24117/pl.tripper.tripper E/MainActivity: onCreate
03-12 16:14:33.634 24117-24117/pl.tripper.tripper E/MainActivity: onResume
03-12 16:14:33.634 24117-24117/pl.tripper.tripper E/CameraNewApi: startCameraThread
03-12 16:14:33.634 24117-24117/pl.tripper.tripper E/Cameraapimanager: cameraPreviewCreated
03-12 16:14:33.644 24117-24117/pl.tripper.tripper E/CameraNewApi: initCamera
03-12 16:14:33.674 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceCreated
03-12 16:14:33.674 24117-24117/pl.tripper.tripper E/CameraNewApi: openCamera
03-12 16:14:33.914 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceChanged
03-12 16:14:33.914 24117-25053/pl.tripper.tripper E/CameraNewApi: onopened
03-12 16:14:33.914 24117-25053/pl.tripper.tripper E/CameraNewApi: createCameraPreview
03-12 16:14:33.934 24117-24117/pl.tripper.tripper E/MainActivity: onPause
03-12 16:14:34.174 24117-24117/pl.tripper.tripper E/CameraNewApi: cameraComponentsReleased
03-12 16:14:34.174 24117-25053/pl.tripper.tripper E/CameraNewApi: onConfigured
03-12 16:14:34.174 24117-24117/pl.tripper.tripper E/CameraNewApi: StopCameraThread
03-12 16:14:34.174 24117-24117/pl.tripper.tripper E/Cameraapimanager: cameraPreviewRemoved
03-12 16:14:34.184 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceDestroyed
03-12 16:14:34.914 24117-24117/pl.tripper.tripper E/MainActivity: onResume
03-12 16:14:34.914 24117-24117/pl.tripper.tripper E/CameraNewApi: startCameraThread
03-12 16:14:34.924 24117-24117/pl.tripper.tripper E/Cameraapimanager: cameraPreviewCreated
03-12 16:14:34.924 24117-24117/pl.tripper.tripper E/CameraNewApi: initCamera
03-12 16:14:34.964 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceCreated
03-12 16:14:34.964 24117-24117/pl.tripper.tripper E/CameraNewApi: openCamera
03-12 16:14:35.294 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceChanged
03-12 16:14:35.294 24117-25121/pl.tripper.tripper E/CameraNewApi: onopened
03-12 16:14:35.294 24117-25121/pl.tripper.tripper E/CameraNewApi: createCameraPreview
03-12 16:14:35.354 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceChanged
03-12 16:14:35.374 24117-24117/pl.tripper.tripper E/MainActivity: onPause
03-12 16:14:35.384 24117-25121/pl.tripper.tripper E/CameraNewApi: onConfigured
03-12 16:14:35.594 24117-24117/pl.tripper.tripper E/CameraNewApi: cameraComponentsReleased
03-12 16:14:35.594 24117-25121/pl.tripper.tripper E/CameraNewApi: Session was closed or camera device has been closed. 
                                                                  java.lang.IllegalStateException: CameraDevice was already closed
                                                                      at android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:1997)
                                                                      at android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:844)
                                                                      at android.hardware.camera2.impl.CameraDeviceImpl.setRepeatingRequest(CameraDeviceImpl.java:899)
                                                                      at android.hardware.camera2.impl.CameraCaptureSessionImpl.setRepeatingRequest(CameraCaptureSessionImpl.java:236)
                                                                      at pl.tripper.tripper.camera.CameraNewApi$2.onConfigured(CameraNewApi.java:107)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at android.hardware.camera2.dispatch.Invokedispatcher.dispatch(Invokedispatcher.java:39)
                                                                      at android.hardware.camera2.dispatch.Handlerdispatcher$1.run(Handlerdispatcher.java:65)
                                                                      at android.os.Handler.handleCallback(Handler.java:739)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:158)
                                                                      at android.os.HandlerThread.run(HandlerThread.java:61)
03-12 16:14:35.594 24117-24117/pl.tripper.tripper E/CameraNewApi: StopCameraThread
03-12 16:14:35.594 24117-25121/pl.tripper.tripper E/CameraNewApi: cameraComponentsReleased
03-12 16:14:35.594 24117-24117/pl.tripper.tripper E/Cameraapimanager: cameraPreviewRemoved
03-12 16:14:35.604 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceDestroyed
03-12 16:14:35.644 24117-24117/pl.tripper.tripper E/MainActivity: onCreate
03-12 16:14:35.654 24117-24117/pl.tripper.tripper E/MainActivity: onResume
03-12 16:14:35.654 24117-24117/pl.tripper.tripper E/CameraNewApi: startCameraThread
03-12 16:14:35.654 24117-24117/pl.tripper.tripper E/Cameraapimanager: cameraPreviewCreated
03-12 16:14:35.654 24117-24117/pl.tripper.tripper E/CameraNewApi: initCamera
03-12 16:14:35.694 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceCreated
03-12 16:14:35.694 24117-24117/pl.tripper.tripper E/CameraNewApi: openCamera
03-12 16:14:35.934 24117-24117/pl.tripper.tripper E/CameraNewApi: onSurfaceChanged
03-12 16:14:35.934 24117-25184/pl.tripper.tripper E/CameraNewApi: onopened
03-12 16:14:35.934 24117-25184/pl.tripper.tripper E/CameraNewApi: createCameraPreview
03-12 16:14:35.944 24117-24117/pl.tripper.tripper E/ViewRootImpl: sendUserActionEvent() mView == null
03-12 16:14:35.944 24117-24117/pl.tripper.tripper E/ViewRootImpl: sendUserActionEvent() mView == null
03-12 16:14:35.994 24117-25184/pl.tripper.tripper E/CameraNewApi: onConfigured

调用方法时添加了一些错误日志.我知道当session仍然运行时,cameraDevice为null,但我不知道如何修复它.在java.lang.IllegalStateException错误ocurrs之后,Camera继续工作.第二个问题是BufferQueueProducer错误,但我无法弄清楚它来自何处.

03-12 15:47:40.244 30720-30731 / pl.tripper.tripper E / BufferQueueProducer:[SurfaceTexture-1-30720-1] dequeueBuffer:BufferQueue已被放弃
03-12 15:47:40.244 30720-30751 / pl.tripper.tripper E / BufferQueueProducer:[SurfaceTexture-1-30720-1] queueBuffer:BufferQueue已被放弃
03-12 15:47:40.524 30720-30731 / pl.tripper.tripper E / BufferQueueProducer:[SurfaceTexture-1-30720-1] cancelBuffer:BufferQueue已被放弃
03-12 15:47:40.524 30720-30751 / pl.tripper.tripper E / BufferQueueProducer:[SurfaceTexture-1-30720-1] cancelBuffer:BufferQueue已被放弃
03-12 15:47:40.524 30720-30732 / pl.tripper.tripper E / BufferQueueProducer:[SurfaceTexture-1-30720-1] cancelBuffer:BufferQueue已被放弃
03-12 15:47:40.524 30720-30731 / pl.tripper.tripper E / BufferQueueProducer:[SurfaceTexture-1-30720-1] cancelBuffer:BufferQueue已被放弃

这是我的代码:

MainActivity.class

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        Log.e(TAG, "onCreate");
        isImmersiveAvailable();
        cameraapimanager = new Cameraapimanager(this, this);
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.e(TAG, "onResume");
       cameraapimanager.createCamera();

    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.e(TAG, "onPause");
        cameraapimanager.releaseCameraAndPreview();
    }

Cameraapimanager.class

public class Cameraapimanager implements CameraUtility.cameraOpenedListener {

    private static final String TAG = "Cameraapimanager";

    private final WeakReference<MainActivity> mainActivity;
    private Context context;

    private CameraSourceApi cameraSourceApi;
    private CameraPreview cameraPreview;

    public Cameraapimanager(Context context, MainActivity mainActivity){

        this.mainActivity= new WeakReference<>(mainActivity);

        cameraSourceApi = new CameraSourceApi<>(new CameraNewApi(context));
        this.context = context;
    }

    private boolean cameraProgressBarEnable(){
        return context.getResources().getBoolean(R.bool.camera_progress_bar_enable);
    }

    private void setCameraProgressBarVisibility(final int visibility ){
        final MainActivity mainActivity = this.mainActivity.get();
        if(mainActivity!= null){
            // UI/Main Thread
            if(Looper.myLooper() == Looper.getMainLooper()){
                ProgressBar cameraProgressBar = (ProgressBar) mainActivity.findViewById(R.id.camera_progress_bar);
                cameraProgressBar.setVisibility(visibility);
            } else {
                mainActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ProgressBar cameraProgressBar = (ProgressBar) mainActivity.findViewById(R.id.camera_progress_bar);
                        cameraProgressBar.setVisibility(visibility);
                    }
                });
            }
        }
    }

    private void showCameraOpenErrorToast(){
        Toast.makeText(context, context.getResources().getString(R.string.camera_open_error_toast), Toast.LENGTH_LONG).show();
    }

    private boolean cameraPermissionGranted() {
        return ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
    }

    public void createCamera(){
        if(cameraPermissionGranted()){
            if(cameraProgressBarEnable()){
                setCameraProgressBarVisibility(View.VISIBLE);
            }
            cameraSourceApi.createCamera(this);
        }
    }

    public void releaseCameraAndPreview(){
        if(cameraPermissionGranted()){
            cameraSourceApi.releaseCamera();
            removeCameraPreview();
        }
    }

    @Override
    public void onCameraOpened(boolean succeeded, boolean addPreview, boolean progressBar) {
         if(addPreview) {
             if (cameraPreview == null) {
                 Log.e(TAG, "cameraPreviewCreated");
                 cameraPreview = new CameraPreview(context, cameraSourceApi);
                 addCameraPreview();
             }
         }
         if(!progressBar){
             if(cameraProgressBarEnable()){
                 setCameraProgressBarVisibility(View.GONE);
             }
         }
         if(!succeeded){
             showCameraOpenErrorToast();
         }
    }

    private void addCameraPreview(){
        MainActivity mainActivity = this.mainActivity.get();
        if(mainActivity != null && cameraPreview != null){
            FrameLayout preview = (FrameLayout) mainActivity.findViewById(R.id.camera_preview);
            preview.addView(cameraPreview);
        }
    }

    private void removeCameraPreview(){
        MainActivity mainActivity = this.mainActivity.get();
        if(mainActivity!= null && cameraPreview != null){
            Log.e(TAG, "cameraPreviewRemoved");
            FrameLayout preview = (FrameLayout) mainActivity.findViewById(R.id.camera_preview);
            preview.removeView(cameraPreview);
            cameraPreview = null;
        }
    }

     class CameraSourceApi<T extends CameraUtility> implements CameraUtility{

        private T camera;

        CameraSourceApi(T camera){
            this.camera = camera;
        }

        @Override
        public void createCamera(CameraUtility.cameraOpenedListener cameraOpenedListener) {
            camera.createCamera(cameraOpenedListener);
        }

        @Override
        public void releaseCamera() {
            camera.releaseCamera();
        }

        @Override
        public void onSurfaceCreated(SurfaceHolder surfaceHolder) {
            camera.onSurfaceCreated(surfaceHolder);
        }

        @Override
        public void onSurfaceChanged(SurfaceHolder surfaceHolder, int width, int height) {
            camera.onSurfaceChanged(surfaceHolder, width, height);
        }

         @Override
         public void onSurfaceDestroyed(SurfaceHolder surfaceHolder) {
             camera.onSurfaceDestroyed(surfaceHolder);
         }
     }
}

CameraNewApi.class

@TargetApi(21)
class CameraNewApi implements CameraUtility {

    private static final String TAG = "CameraNewApi";

    private Semaphore cameraOpenCloseLock = new Semaphore(1);

    private CameraUtility.cameraOpenedListener cameraOpenedListener;

    private Context context;

    private Handler backgroundHandler;
    private HandlerThread backgroundThread;

    private SurfaceHolder surfaceHolder;

    private String backFacingCameraId;
    private CaptureRequest.Builder captureRequestBuilder;
    private CameraDevice cameraDevice;
    private CameraCaptureSession cameraCaptureSessions;

    CameraNewApi(Context context){
        this.context = context;
    }


    private final CameraDevice.StateCallback cameraDeviceStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onopened(@NonNull CameraDevice camera) {
            Log.e(TAG, "onopened");
            cameraOpenCloseLock.release();
            cameraDevice = camera;
            if(surfaceHolder != null){
                createCameraPreview();
            } else {
                releaseCameraComponents();
            }
        }

        @Override
        public void ondisconnected(@NonNull CameraDevice camera) {
            Log.d(TAG, "deviceCallback.ondisconnected() start");
            Log.e(TAG, "ondisconnected");
            if(cameraOpenedListener != null) {
                cameraOpenedListener.onCameraOpened(false, false, false);
            }
            cameraOpenCloseLock.release();
            camera.close();
            cameraDevice = null;
        }

        @Override
        public void one rror(@NonNull CameraDevice camera, int error) {
            Log.e(TAG, "onError");
            Log.d(TAG, "deviceCallback.onError() start");
            if(cameraOpenedListener != null) {
                cameraOpenedListener.onCameraOpened(false, false, false);
            }
            cameraOpenCloseLock.release();
            camera.close();
            cameraDevice = null;
        }
    };

    private final CameraCaptureSession.StateCallback captureSessionStateCallback = new CameraCaptureSession.StateCallback() {
        @Override
        public void onConfigured(@NonNull CameraCaptureSession session) {
            Log.e(TAG, "onConfigured");
            if(cameraDevice != null){
                cameraCaptureSessions = session;
                captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
                try {
                    if(cameraOpenedListener != null) {
                        cameraOpenedListener.onCameraOpened(true, false, false);
                    }
                    session.setRepeatingRequest(captureRequestBuilder.build(), null, backgroundHandler);
                } catch (CameraAccessException e) {
                    Log.e(TAG, "Camera has been disconnected", e);
                } catch (IllegalStateException e){
                    Log.e(TAG, "Session was closed or camera device has been closed. ", e);
                    releaseCameraComponents();
                }
            }
        }

        @Override
        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
            Log.d(TAG, "Capture session configure Failed: " + session);
            Log.e(TAG, "onConfigureFailed");
        }
    };

    @Override
    public void createCamera(CameraUtility.cameraOpenedListener cameraOpenedListener) {
        this.cameraOpenedListener = cameraOpenedListener;

        startBackgroundThread();
        if(cameraOpenedListener != null){
            cameraOpenedListener.onCameraOpened(true, true, true);
        }
        initCamera();
    }

    private void releaseCameraComponents(){
        try{
            cameraOpenCloseLock.acquire();
            if(cameraCaptureSessions != null){
                cameraCaptureSessions.close();
                cameraCaptureSessions = null;
            }
            if(cameraDevice != null){
                cameraDevice.close();
                cameraDevice = null;
            }
            if(surfaceHolder != null){
                surfaceHolder = null;
            }
            if(cameraOpenedListener != null){
                cameraOpenedListener = null;
            }
            Log.e(TAG, "cameraComponentsReleased");
        } catch (InterruptedException e) {
            throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
        } finally {
            cameraOpenCloseLock.release();
        }
    }
    @Override
    public void releaseCamera() {
        releaseCameraComponents();
        stopBackgroundThread();
    }

    @Override
    public void onSurfaceCreated(SurfaceHolder surfaceHolder) {
        Log.e(TAG, "onSurfaceCreated");
        this.surfaceHolder = surfaceHolder;
        openCamera();
    }

    @Override
    public void onSurfaceChanged(SurfaceHolder surfaceHolder, int width, int height) {
        Log.e(TAG, "onSurfaceChanged");
        setSurfaceSize(width, height);
    }

    @Override
    public void onSurfaceDestroyed(SurfaceHolder surfaceHolder) {
        Log.e(TAG, "onSurfaceDestroyed");
    }

    private void startBackgroundThread() {
        Log.e(TAG, "startCameraThread");
        backgroundThread = new HandlerThread("CameraBackground");
        backgroundThread.start();
        backgroundHandler = new Handler(backgroundThread.getLooper());
    }

    private void stopBackgroundThread() {
        Log.e(TAG, "StopCameraThread");
        backgroundThread.quitSafely();
        try {
            backgroundThread.join();
            backgroundThread = null;
            backgroundHandler = null;
        } catch (InterruptedException e) {
            Log.e(TAG, "Error message: ", e);
        }
    }

    private void initCamera(){
        Log.e(TAG, "initCamera");
        CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);

        try{
            for (String cameraId : cameraManager.getCameraIdList()) {
                Cameracharacteristics characteristics
                        = cameraManager.getCameracharacteristics(cameraId);

                // Use back camera
                Integer facing = characteristics.get(Cameracharacteristics.LENS_FACING);
                if (facing != null && facing == Cameracharacteristics.LENS_FACING_BACK) {
                    backFacingCameraId = cameraId;
                    break;
                }
            }
            if(backFacingCameraId == null){
                Log.d(TAG, "Could not detect a camera");
            }
        } catch (CameraAccessException e) {
            Log.e(TAG, "Could not get camera list", e);
        }
    }

    private void openCamera(){
        Log.e(TAG, "openCamera");
        CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        try{
            if(backFacingCameraId != null && cameraDevice == null){
                try{
                    if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
                        throw new RuntimeException("Time out waiting to lock camera opening.");
                    }
                    cameraManager.openCamera(backFacingCameraId, cameraDeviceStateCallback, backgroundHandler);
                } catch (InterruptedException e) {
                    throw new RuntimeException("Interrupted while trying to lock camera opening.", e);
                }
            }
        } catch(SecurityException e){
            Log.e(TAG, "Camera permission is not granted", e);
        } catch(CameraAccessException e){
            Log.e(TAG, "Could not open camera", e);
        }
    }

    private void createCameraPreview(){

        Log.e(TAG, "createCameraPreview");
        Surface surface = surfaceHolder.getSurface();

        List<Surface> surfaceList = Collections.singletonList(surface);

        try {
            captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            captureRequestBuilder.addTarget(surface);
            cameraDevice.createCaptureSession(surfaceList, captureSessionStateCallback, null);
        } catch (CameraAccessException e){
            Log.e(TAG, "Could not create capture session for camera: " + cameraDevice.getId(), e);
        } catch (IllegalStateException e){
            Log.e(TAG, "Camera has been closed", e);
        }
    }

CameraUtility.interface

interface CameraUtility {

    void createCamera(CameraUtility.cameraOpenedListener cameraOpenedListener);
    void releaseCamera();
    void onSurfaceCreated(SurfaceHolder surfaceHolder);
    void onSurfaceChanged(SurfaceHolder surfaceHolder, int width, int height);
    void onSurfaceDestroyed(SurfaceHolder surfaceHolder);

    interface cameraOpenedListener{
        void onCameraOpened(boolean succeeded, boolean addPreview, boolean progressBar);
    }
}

UPDATE

这就是为什么它不会每次都发生.调用onPause后立即发生错误,会话开始重复请求以维护预览(onConfigured).然后cameraComponentsReleased触发所有清理完成的地方,包括当前的CameraDevice对象.仍然没有线索如何管理这种情况.

03-13 12:12:24.375 17555-17555/pl.tripper.tripper E/MainActivity: onPause
03-13 12:12:24.395 17555-20454/pl.tripper.tripper E/CameraNewApi: onConfigured
03-13 12:12:24.625 17555-17555/pl.tripper.tripper E/CameraNewApi: cameraComponentsReleased
03-13 12:12:24.625 17555-17555/pl.tripper.tripper E/CameraNewApi: StopCameraThread
03-13 12:12:24.625 17555-20454/pl.tripper.tripper E/CameraNewApi: Session was closed or camera device has been closed. 
                                                                  java.lang.IllegalStateException: CameraDevice was already closed
                                                                      at android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:1997)
                                                                      at android.hardware.camera2.impl.CameraDeviceImpl.submitCaptureRequest(CameraDeviceImpl.java:844)
                                                                      at android.hardware.camera2.impl.CameraDeviceImpl.setRepeatingRequest(CameraDeviceImpl.java:899)
                                                                      at android.hardware.camera2.impl.CameraCaptureSessionImpl.setRepeatingRequest(CameraCaptureSessionImpl.java:236)
                                                                      at pl.tripper.tripper.camera.CameraNewApi$2.onConfigured(CameraNewApi.java:114)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at android.hardware.camera2.dispatch.Invokedispatcher.dispatch(Invokedispatcher.java:39)
                                                                      at android.hardware.camera2.dispatch.Handlerdispatcher$1.run(Handlerdispatcher.java:65)
                                                                      at android.os.Handler.handleCallback(Handler.java:739)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:158)
                                                                      at android.os.HandlerThread.run(HandlerThread.java:61)
03-13 12:12:24.625 17555-20454/pl.tripper.tripper E/CameraNewApi: Camera onClosed
03-13 12:12:24.625 17555-17555/pl.tripper.tripper E/Cameraapimanager: cameraPreviewRemoved

解决方法:

mCameraOpenCloseLock.release()

应该在相机createCaptureSession动作之后释放此信号量,以防止多个线程之间的资源冲突.相机打开后,源代码会过早地释放信号量.暂停应用程序将关闭相机,导致错误.

要测试它,在mCameraOpenCloseLock.release()之前调用finish(),你不会看到错误

android – Galaxy S和Galaxy S2的最小宽度

android – Galaxy S和Galaxy S2的最小宽度

我正在开发一个 Android Widget,需要区分galaxy S和galaxy S2.
我几乎阅读了有关屏幕尺寸和密度文章的所有内容.
当然,我需要使用新的限定符和新的限定符Smallest Width.
我的问题是,sw320dp限定符匹配galaxy S和galaxy S2.
但是我需要galaxy S2的另一种布局,但是找不到合适的限定符.

银河S的定义,密度233

屏幕尺寸(像素):480像素x 800像素

屏幕尺寸以dp为单位:329dp x 549dp(原因1dp = 1pixel /(密度/ 160)

-> so the qualifier sw320dp must match here. and yes it does

galaxy S II的定义,密度218

屏幕尺寸(像素):480像素x 800像素

屏幕尺寸以dp为单位:352dp x 587dp(原因1dp = 1pixel /(密度/ 160)

-> so the qualifier sw340dp must match here,but NO it doesnt

(Tested in emulator and on real device)

drawables不是问题,但我的布局,特别是高度和文本大小在这些设备上是不同的,所以我真的需要一个特定的布局.

任何人都有想法或更多的经验吗?

解决方法

屏幕密度,由参考材料定义为:

The quantity of pixels within a physical area of the screen; usually referred to as dpi (dots per inch). For example,a “low” density screen has fewer pixels within a given physical area,compared to a “normal” or “high” density screen.
For simplicity,Android groups all actual screen densities into four generalized densities: low,medium,high,and extra high.

低= 120dpi
med = 160dpi
高= 240dpi
xhi = 320dpi

因此,实际密度为218的galaxy SII在dp计算中被分配了240的“高”密度.因此,屏幕的宽度为dp为480/240 * 160 = 320.

这很糟糕,我同意.但它是如何运作的.

http://developer.android.com/guide/practices/screens_support.html

我们今天的关于Android Camera API,HDR照片设置? (三星Galaxy)三星相机hdr怎么开的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Camera API ISO设置?、Android OpenGL纹理在Sprint三星Galaxy s2 Epic Touch 4g上看起来很糟糕、android – Camera2 API和java.lang.IllegalStateException、android – Galaxy S和Galaxy S2的最小宽度的相关信息,请在本站查询。

本文标签: