2011-12-08 4 views
2

카메라에서 화면에 보이는 내용을 보여주는 매우 간단한 앱을 만들려고합니다. 에뮬레이터 (내가 사용했던 전화와 동일한 사양)를 사용하여 응용 프로그램을 만들었습니다. 회색과 흰색의 제곱 된 배경이 그 위를 움직이는 회색으로 표시되어 모든 코드와 사용 권한이 올바른지 확신합니다.Android 카메라 미리보기 - '파일 없음 - 카메라를 전환 할 수 없음'

Wildfire 전화 (Android 버전 : 2.2.1)에서 앱을 실행하려고하면 아무 것도 표시되기 전에 강제로 닫히고 로그를 확인하면이 오류가 표시됩니다.

  • 12월 12일에서 8일까지 : 41 : 42.649 : W/CameraSwitch (3004) : 오픈 메인 카메라
  • 12월 12일에서 8일까지 : 41 : 42.659 : W/CameraSwitch (3004) : 없음 파일 - 수 없다 41 : 카메라를
  • 12월 12일에서 8일까지 전환 43.239 : D/(3004) AndroidRuntime : VM

종료 좀 사이트를 통해 모습과는 OS 나 하드웨어에 문제가있을 것 같다. 누구든지 주변에서 일을 발견 했습니까?

어리석은 실수를 한 경우를 대비하여 코드를 게시 할 예정입니다. 카메라를

class Preview extends SurfaceView implements SurfaceHolder.Callback { 

SurfaceHolder mHolder; 
public Camera camera; 

Preview(Context context) { 
    super(context); 

    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 

    camera = Camera.open(); 
    try { 
     camera.setPreviewDisplay(holder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview(); 
    camera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(width, height); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 
} 

Manifest.xml

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

<uses-sdk android:minSdkVersion="8" /> 
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > 
<activity android:label="@string/app_name"   android:name=".InformationPassingTestActivity" > 
    <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    </activity> 
</application> 

어떤 도움이 놀라운 :) 것을 처리

import android.app.Activity; 
import android.content.pm.ActivityInfo; 
import android.os.Bundle; 

public class InformationPassingTestActivity extends Activity { 

Preview preview; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    preview = new Preview(this); 
    setContentView(preview); 
    } 
} 

내 미리보기 클래스는

답변

3

당신의 문제는 아마 이 리에서 ne (또는 아직 표시되지 않은 경우) : parameters.setPreviewSize(width, height);

실제 카메라는 모든 미리보기 크기를 지원할 수 없습니다. 표면의 크기에 가깝고 카메라 하드웨어가 지원하는 미리보기 크기를 선택해야합니다.

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

당신은 또한 카메라가 이미 열려되었는지 여부를 확인하지 않고 surfaceCreated에서 Camera.open()을 요구하는 문제가있을 수 있습니다 : 여기에 있다고 할 수있는 샘플 방법입니다. 전화를 onCreateonResume 방법으로 이동하고 방법으로 Camera.release()에 전화를 걸어 카메라를 두 번 이상 열지 마십시오.

+0

... 카메라가 미리보기 크기를 광고하는 경우에도 항상 지원하지는 않습니다. HTC Hero 님이 한 번 물어 뜯는 @ss를 얻으 셨습니다.) –

+0

@ethan Camera.close()가 없습니다. release()를 의미합니까? –

+0

죄송합니다. 답변을 평가/승인/평가하는 데 너무 오래 걸렸습니다. 완벽하게 작동합니다. 문제는 지원되는 크기 였지만 코드를 직접 사용하지는 않았지만 문제가 드러났습니다. 정말 고맙습니다 :) –

관련 문제