Android 三星Galaxy S相机意外坠毁

Android 三星Galaxy S相机意外坠毁,android,camera,Android,Camera,我的应用程序在没有stacktrace的情况下崩溃,就像被问到的那样。我也使用三星Galaxy S。它与我的HTC愿望配合得很好。解决方案是“删除预览视图并重新实例化” 然而,我创建的surfaceview就是这样做的 camera = (SurfaceView) findViewById(R.id.cameraview); 我如何解决这个问题,或者如何重新验证这个表面视图 02-21 15:57:20.305: ERROR/SecCamera(2357): startPreview: get

我的应用程序在没有stacktrace的情况下崩溃,就像被问到的那样。我也使用三星Galaxy S。它与我的HTC愿望配合得很好。解决方案是“删除预览视图并重新实例化”

然而,我创建的surfaceview就是这样做的

camera = (SurfaceView) findViewById(R.id.cameraview);
我如何解决这个问题,或者如何重新验证这个表面视图

02-21 15:57:20.305: ERROR/SecCamera(2357): startPreview: get the first frame of the preview
02-21 15:57:20.305: ERROR/CameraHardwareSec(2357): startPreview : return startPreview 0
02-21 15:57:20.305: DEBUG/CameraHardwareSec(2357): MemoryHeapBase(fd(33), size(3686464), width(640), height(480))
02-21 15:57:20.305: ERROR/CameraHardwareSec(2357): CameraHardwareSec: mPostViewWidth = 640 mPostViewHeight = 480 mPostViewSize = 614400
02-21 15:57:20.305: ERROR/CameraHardwareSec(2357): CameraHardwareSec: mRawHeap : MemoryHeapBase(previewHeapSize(614408))
02-21 15:57:20.305: WARN/CameraService(2357): width(640), height(480), format:yuv420sp
02-21 15:57:20.328: ERROR/SecCamera(2357): fimc_v4l2_streamoff()
02-21 15:57:20.336: ERROR/SecCamera(2357): ERR(fimc_v4l2_streamoff):VIDIOC_STREAMOFF failed
02-21 15:57:20.336: ERROR/SecCamera(2357): int android::SecCamera::stopRecord()::1494 fail. errno: No such device
02-21 15:57:20.336: ERROR/CameraHardwareSec(2357): ERR(previewThread):Fail on mSecCamera->stopRecord()
02-21 15:57:20.363: WARN/CameraService(2357): startRecording (pid 2357)
02-21 15:57:20.367: WARN/CameraService(2357): startCameraMode(1) (pid 2357)
02-21 15:57:20.367: WARN/CameraService(2357): startRecordingMode (pid 2357)
02-21 15:57:20.367: DEBUG/SecCamera(2357): passed fmt = 842094164 found pixel format[8]: YUV 4:2:0 planar, Y/CbCr, Tiled
02-21 15:57:20.367: ERROR/SecCamera(2357): startRecord: m_recording_width = 320, m_recording_height = 240

我认为设置预览参数应该有一些问题。 试试下面

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {



if (isPreviewRunning) {
    camera.stopPreview();
}
try{
Camera.Parameters p = camera.getParameters();
if(p!=null){
List<Size> sizes = p.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, w, h);
p.setPreviewSize(optimalSize.width, optimalSize.height);
camera.setParameters(p);

camera.setPreviewDisplay(holder);;
camera.startPreview();

}
} catch (IOException e) {
    // TODO Auto-generated catch block


    e.printStackTrace();
}

isPreviewRunning = true;
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
// TODO Auto-generated method stub
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) w / h;
if (sizes == null) return null;

Size optimalSize = null;
double minDiff = Double.MAX_VALUE;

int targetHeight = h;

// Try to find an size match aspect ratio and size
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}

// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {



if (isPreviewRunning) {
    camera.stopPreview();
}
try{
Camera.Parameters p = camera.getParameters();
if(p!=null){
List<Size> sizes = p.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, w, h);
p.setPreviewSize(optimalSize.width, optimalSize.height);
camera.setParameters(p);

camera.setPreviewDisplay(holder);;
camera.startPreview();

}
} catch (IOException e) {
    // TODO Auto-generated catch block


    e.printStackTrace();
}

isPreviewRunning = true;
}
public void surfaceChanged(SurfaceHolder holder,int格式,int w,int h){
如果(iPreviewRunning){
camera.stopPreview();
}
试一试{
Camera.Parameters p=Camera.getParameters();
如果(p!=null){
列表大小=p.getSupportedPreviewSizes();
尺寸最优尺寸=GetOptimizePreviewSize(尺寸,w,h);
p、 setPreviewSize(optimalSize.width、optimalSize.height);
摄像机参数设置(p);
摄像机。设置预览显示(支架);;
camera.startPreview();
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
isPreviewRunning=true;
}
私有大小GetOptimizePreviewSize(列表大小,整数w,整数h){
//TODO自动生成的方法存根
最终双纵横比公差=0.05;
双目标率=(双)w/h;
如果(size==null)返回null;
Size=null;
double minDiff=double.MAX_值;
int targetHeight=h;
//尝试找到与纵横比和大小匹配的大小
用于(尺寸:尺寸){
双倍比率=(双倍)size.width/size.height;
如果(数学abs(比率-目标比率)>纵横比公差)继续;
if(数学绝对值(尺寸高度-目标光)
私有大小GetOptimizePreviewSize(列表大小,整数w,整数h){

//TODO自动生成的方法存根
最终双纵横比公差=0.05;
双目标率=(双)w/h;
如果(size==null)返回null;
Size=null;
double minDiff=double.MAX_值;
int targetHeight=h;
//尝试找到与纵横比和大小匹配的大小
用于(尺寸:尺寸){
双倍比率=(双倍)size.width/size.height;
如果(数学abs(比率-目标比率)>纵横比公差)继续;
if(数学绝对值(尺寸高度-目标光)
}


将此代码放入surfaceChanged()中。getOptimalPreviewSize()用于根据设备分辨率设置预览参数。

好吧,我将固件升级到2.3.3,现在可以正常工作了

// TODO Auto-generated method stub
final double ASPECT_TOLERANCE = 0.05;
double targetRatio = (double) w / h;
if (sizes == null) return null;

Size optimalSize = null;
double minDiff = Double.MAX_VALUE;

int targetHeight = h;

// Try to find an size match aspect ratio and size
for (Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}

// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;