2012-02-21 6 views
0

묻힌 것처럼 스택 추적없이 내 앱이 중단됩니다. here. 나는 또한 삼성 갤럭시 S를 사용하고 있습니다. HTC가 원하는대로 잘 작동합니다. 이 솔루션은 "미리보기를 제거하고 다시 인스턴스"입니다예기치 않게 삼성 Galaxy S 카메라 충돌이 발생했습니다.

는하지만, 내 서피스 뷰 SurfaceView 생성이 방법 나는이 문제를 해결하거나 내가 어떻게이 서피스 뷰 SurfaceView가 reinstantiate 수있는 방법

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 

답변

0

글쎄, 펌웨어를 2.3.3으로 업그레이드했고 현재 작동 중입니다.

0

나는 미리보기 매개 변수를 설정하는 몇 가지 문제가있을한다고 생각합니다. 다음을 시도해보십시오.

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; 
} 

개인 크기 getOptimalPreviewSize (INT의 시간, w INT 목록 크기) {

// 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; 

}

이 surfaceChanged에이 코드를 넣어(). getOptimalPreviewSize()는 장치 해상도에 따라 미리보기 매개 변수를 설정하는 데 사용됩니다.

관련 문제