本篇文章给大家谈谈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 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怎么开)
有谁知道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设置?
HTC Desire上的本地摄像头应用程序可以进行ISO设置.
解决方法
还要考虑 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上看起来很糟糕
纹理在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]);
关闭它可能是安全的.
解决方法
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的最小宽度
我几乎阅读了有关屏幕尺寸和密度文章的所有内容.
当然,我需要使用新的限定符和新的限定符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的最小宽度的相关信息,请在本站查询。
本文标签: