gpt4 book ai didi

Android 相机功能在部分手机上无法使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:57 27 4
gpt4 key购买 nike

我刚刚意识到我在 surfaceholder 中的相机 Activity 在某些设备上不起作用。一些 DROID 品牌和蒙皮手机。到目前为止,它适用于所有采用标准 android 实现的谷歌手机。

我在 2.2 上调试了一个设备(不知道这是什么型号的手机,但它被蒙皮了),我看到调试器说(ICamera 失败)(相机错误 100)

但我没有机会找出到底哪里出了问题,但我确实看到其他人遇到过这个问题(关于在开始预览之前获取预览大小的问题??),但没有明显的 react 或任何直观的 react 到我所拥有的,但这是我的相机代码,怎样才能使这项工作更普遍?

   //this is in OnCreate
preview = (SurfaceView) findViewById(R.id.cameraplacer);
previewHolder = preview.getHolder();

previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

//这在生命周期方法之外

 SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
if (camera == null) {
camera = Camera.open();
try {
Camera.Parameters camParams = camera.getParameters();
camParams.setFlashMode(Parameters.FLASH_MODE_AUTO);

setDisplayOrientation(camera, 90);
camera.setPreviewDisplay(previewHolder);
camera.setParameters(camParams);

} catch (IOException e) {
camera.release();
camera = null;
}
}


}//end surfaceCreated

public void surfaceChanged(SurfaceHolder holder,
int format, int width,
int height) {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
parameters);

if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
camera.startPreview();
inPreview=true;
}
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera = null;
}
}
};//end CallBack

private Camera.Size getBestPreviewSize(int width, int height,
Camera.Parameters parameters) {
Camera.Size result=null;

for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width<=width && size.height<=height) {
if (result==null) {
result=size;
}
else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;

if (newArea>resultArea) {
result=size;
}
}
}
}

return(result);
}//end getBestPreviewSize

//这是在OnResume上

     try {
//Method rotateMethod = android.hardware.Camera.class.getMethod("setDisplayOrientation", int.class);
//rotateMethod.invoke(camera, 90);
//Camera.Parameters camParams = camera.getParameters();
//camParams.setPreviewSize(480, 320);// here w h are reversed
//camera.setParameters(camParams);*/
//setCameraDisplayOrientation(MainPhoto.this, 0, camera);
if(camera!=null)
{
Camera.Parameters camParams = camera.getParameters();
camParams.setFlashMode(Parameters.FLASH_MODE_AUTO);
camera.setParameters(camParams);
setDisplayOrientation(camera, 90);
camera.setPreviewDisplay(previewHolder);
camera.startPreview();
}


} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}/* catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/ catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}/* catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/

最佳答案

我会删除 onResume() 逻辑,因为它复制了您在 surfaceChanged() 中的内容,并且由onResume() 被调用的时间,因为表面可能还没有准备好。

此外,您盲目地请求 FLASH_MODE_AUTO,而没有查看设备是否支持它。

从这两个地方开始。

关于Android 相机功能在部分手机上无法使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com