2013-01-07 8 views
5

カメラAPIを使用してアプリを作成しています。プレビューを表示して写真を撮ります。 最初のバージョンがうまく機能します。私はまた、メンバ設定AndroidのカメラAPIアプリがonResumeでクラッシュする

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

私はランダムに、最後の3つの整数引数を設定
 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、surfaceの作成の実装シーケンスに関係しているかもしれないと感じます。それは、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でやっているところで、私たちは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

関連する問題