2013-01-07 4 views
5

카메라 API를 사용하여 앱을 작성하고 미리보기를 표시하고 사진을 찍습니다. 첫 번째 버전이 잘 작동합니다. I도 설정 부재onResume에서 Android 카메라 API 앱이 다운 됨

public class CameraDemo extends Activity 

: 클래스는 미리보기 서피스 뷰 SurfaceView 메인 액티비티의 SurfaceHolder.Callback

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    camera = Camera.open(); 
    try { 
     camera.setPreviewDisplay(holder); 
     camera.startPreview(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    hasSurface = true; 
} 


public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // It will be called immediately after surfaceCreated 
    // I move it to Resume. 
    setCameraPreviewParameters(); 

    camera.startPreview(); 

} 

구현 연장 CameraUnit UI를; 때문이다 :하지 OnCreate

public class CameraUnit extends LinearLayout 

,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ui = new CameraUnit(this); 
    setContentView((View) ui); 

    Log.d(TAG, "onCreate'd"); 
} 

는 그것이 서피스 뷰 SurfaceView의 LinearLayout을 포함하는 객체 및 카메라 버튼을 만든다.

onResume은 다음과 같습니다

@Override 
protected void onResume() { 
    super.onResume(); 
} 

이 작동하지만, 나는 onResume은 비워 둘 수 없습니다한다고 생각합니다. 또한 surfaceCreated와 surfaceChanged가 비어있는 것을 볼 수 있습니다. famous Android app example OCRTest 그래서 surfaceCreated와 surfaceChanged의 명령을 onResume으로 옮기는 것이 더 효과적이며 실현 가능하다고 생각합니다.

나는 내 응용 프로그램의 첫 번째 버전에 대한 흐름 채팅이 있어야한다고 생각 : 주요 활동합니다 (있는 LinearLayout과 서피스 뷰 SurfaceView는, 카메라 버튼이 생성)에서 onCreate, surfaceCreated 및 surfaceChanged이 onResume,라고합니다.

그래서 단순히 surfaceCreated 및 surfaceChanged의 명령을 onResume으로 옮길 수 있습니다. 하지만 작동하지 않습니다! 표면이 null인지 확인하기 위해 Debug를 사용했습니다. 나는 surfaceCreatd가 호출되지 않았다고 생각합니다. 내 응용 프로그램은 주요 활동에서 SurfaceHolder.Callback을 구현하는 다른 OCRTest입니다. 나는 서피스 뷰 SurfaceView에서의 SurfaceHolder.Callback을 구현 :

class Preview extends SurfaceView implements SurfaceHolder.Callback 

그래서 나는 onResume

내가 무작위로 마지막 세 개의 정수 인수를 설정
 ui.preview.surfaceCreated(ui.preview.mHolder); 
    ui.preview.surfaceChanged(ui.preview.mHolder, 0, 800, 400); 

에 두 줄을 추가합니다. 활동을 시작하면 Android 휴대 전화의 오류 창이 열립니다. 그것은 "원인 : java.lang.RuntimeException : 카메라 서비스에 연결하지 못했습니다"라고 말합니다. 그러나 그것을 고치는 방법 ???? 감사합니다.

오류는 다음과 같습니다 카메라가 다른 응용 프로그램에서 사용중인 경우

01-07 00:27:57.173: W/dalvikvm(11625): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 
01-07 00:27:57.173: E/AndroidRuntime(11625): FATAL EXCEPTION: main 
01-07 00:27:57.173: E/AndroidRuntime(11625): java.lang.RuntimeException: Unable to resume activity {com.example/com.example.CameraDemo}: java.lang.RuntimeException: Fail to connect to camera service 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2460) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2481) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1847) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.access$1500(ActivityThread.java:132) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Looper.loop(Looper.java:150) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.main(ActivityThread.java:4263) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invokeNative(Native Method) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invoke(Method.java:507) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at dalvik.system.NativeStart.main(Native Method) 
01-07 00:27:57.173: E/AndroidRuntime(11625): Caused by: java.lang.RuntimeException: Fail to connect to camera service 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.native_setup(Native Method) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.<init>(Camera.java:265) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.open(Camera.java:241) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.Preview.surfaceCreated(Preview.java:60) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.CameraDemo.onResume(CameraDemo.java:64) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1242) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Activity.performResume(Activity.java:3904) 
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2450) 
01-07 00:27:57.173: E/AndroidRuntime(11625): ... 12 more 
01-07 00:27:59.455: I/Process(11625): Sending signal. PID: 11625 SIG: 9 
+0

내가 Acitivity의 onCreate, onResume 및 표면 만들기 등의 구현 시퀀스와 관련이있을 수 있음을 알았습니다. surfaceView 클래스가 SurfaceHolder.Callback을 구현하고 표면이 준비되어 있지 않아도 표면이 준비되지 않은 것처럼 보입니다. 활동의 onResume. 그럼 언제 우리가 준비 됐니? 액티비티가 SurfaceHolder.Callback을 구현하는 경우 고유 한 시퀀스는 무엇입니까? 도움!!!! – user1914692

답변

5

당신은이

java.lang.RuntimeException: Fail to connect to camera service 

예외를 얻을. 하지만 다른 응용 프로그램이 응용 프로그램 자체라고 생각합니다. 카메라를 놓아야합니다.활동에

public void surfaceDestroyed(SurfaceHolder holder) { 

    // empty. Take care of releasing the Camera preview in your activity. 
    if (mCamera != null) { 
     mCamera.release(); 
    } 
} 

: 미리보기 클래스에서

: 또한

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    if (myCamera != null) { 
     myCamera.release(); 
    } 
    finish(); 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    if (myCamera != null) { 
     myCamera.release(); 
    } 
} 

취소에

이들은 당신이 카메라를 해제해야하는 경우가 있습니다 클릭, 그리고 또한 당신이있을 때 즉 이미지가 캡처되고 활동으로 돌아 왔을 때 카메라 사용을 마쳤습니다.

또한이 시도 :

나는 몇 가지 예에서 찾을
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

    if (mHolder.getSurface() == null) { 
     return; 
    } 

    try { 
     mCamera.stopPreview(); 
    } catch (Exception e) { 
     //You can ignore this, because this means the Preview doesn't Exist 
     //So, no need to try stopping 
    } 

    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
    } catch (Exception e) { 
     //Catch this 
    } 
} 
+0

대단히 고마워요. 그 장소에이 카메라 릴리즈 기능을 포함 시켰습니다. 그리고 내 애플 리케이션의 첫 번째 버전은 아주 잘 작동합니다. 앞에서 말했듯이, 나는 surfaceCreated와 surfaceChanged에서 명령을 onResume으로 옮기고 싶습니다. 문제는 onResume의 첫 번째 호출이 작동하지 않는다는 것입니다. 그래서 그것은 onResume과 표면 호출 사이의 관계와 관련이있을 것으로 생각됩니다. 당신 의견은 어떻습니까? – user1914692

+0

나를 위해 일했습니다! – GAMA

0

, 카메라 개방 코드가 포함 된 문장 경우 모두 surfaceChanged에, 그리고 onResume에서, 반복을 피하기 위해를 사용하여. 아마도 이것은 문제를 해결하는 한 가지 방법 일 것입니다.

1

그래서 카메라를 사용했지만 실행 아이콘이 다른 앱을 만들어 설정 페이지로 이동했습니다. 그래서 언제든지 앱을 일시 중지하고 최소화하여 설정을 변경하고이 오류로 인해 추락했습니다. 그래서 많은 연구 끝에 나는 아직 답을 찾지 못했습니다. 그렇다면 이것이 카메라의 라이프 사이클 관리와 관련이 있다는 것을 깨달았습니다. 따라서 수명주기를 살펴 보았습니다. 구체적으로는 Pausing입니다. 그래서 실현했습니다. 우리는 모두 잘못된 방법으로이 작업을 수행하고 있습니다. 우리가 onResume에서 그것을하고 있다면, 우리는 시작해야합니다. 그리고 BAM! 그것은 효과가 있었다.

다음은 내 앱 코드입니다.

@Override 
    protected void onPause() { 
     super.onPause(); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release();  // release the camera for other applications 
      mCamera = null; 
     } 
     if (mPreview != null) { 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.removeView(mPreview); 
      mPreview = null; 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
      mCamera.release();  // release the camera for other applications 
      mCamera = null; 
     } 
     if (mPreview != null) { 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.removeView(mPreview); 
      mPreview = null; 
     } 
    } 
    @Override 
    protected void onResume() { 
     super.onResume(); 

    } 

    @Override 
    protected void onStart(){ 
     super.onStart(); 
//Check if the camera exists or not so it does not clash with the onCreate 
     if(mCamera == null){ 
      dir_string = new File("/storage/sdcard1/app"); 
      Log.d("TAG",dir_string.toString()); 
      mCamera = getCameraInstance(); 
      mPreview = new CameraPreview(this, mCamera); 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_viewer); 
      preview.addView(mPreview); 
     } 
    } 

적어도 도움이 되길 바랍니다.

+0

작동하지 않습니다. – exshinigami

+0

받은 오류는 무엇입니까? – user2365554

관련 문제