2

そこで、カメラ API を使用するアプリを作成しています。アプリは完成間近ですが、さらにいくつかの機能を追加する必要があります。ただし、エミュレーターまたは携帯電話で eclipse からアプリを起動しようとすると、アクティビティを再開できないというランタイム エラーが発生します: カメラ サービスへの接続に失敗します。複数のエミュレーターを試しましたが、カメラ オプションがオンになっています。APKとしてエクスポートして携帯電話にインストールすると完璧に動作するのに、エミュレーターフォームのEclipseでデバッグしようとすると機能しない理由にとても混乱しています。何か案は?現在、エラーを追跡することは不可能だからです。カメラサービスに接続できないことに関連するたくさんの投稿を見てきましたが、私の状況にそれを適用することはできませんでした.

補足:また、カメラは正常に動作し、数日前にこの正確なアプリを問題なく実行していました。私の考えでは、それは日食と関係があるということです。APKから実行すると、アプリは私の電話で完全に動作するため

更新: Eclipse をアンインストールして再インストールしましたが、同じエラーがまだ発生しています。何が起こっている?このコードは、Eclipse ahhg で実行すると機能しません

私のLogCat:

05-27 22:20:55.197: E/AndroidRuntime(419): FATAL EXCEPTION: main
05-27 22:20:55.197: E/AndroidRuntime(419): java.lang.RuntimeException: Unable to resume activity {com.fuchs.frontcam/com.fuchs.frontcam.MainActivity}: java.lang.RuntimeException: Fail to connect to camera service
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.os.Looper.loop(Looper.java:123)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-27 22:20:55.197: E/AndroidRuntime(419):  at java.lang.reflect.Method.invokeNative(Native Method)
05-27 22:20:55.197: E/AndroidRuntime(419):  at java.lang.reflect.Method.invoke(Method.java:507)
05-27 22:20:55.197: E/AndroidRuntime(419):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-27 22:20:55.197: E/AndroidRuntime(419):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-27 22:20:55.197: E/AndroidRuntime(419):  at dalvik.system.NativeStart.main(Native Method)
05-27 22:20:55.197: E/AndroidRuntime(419): Caused by: java.lang.RuntimeException: Fail to connect to camera service
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.hardware.Camera.native_setup(Native Method)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.hardware.Camera.<init>(Camera.java:258)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.hardware.Camera.open(Camera.java:220)
05-27 22:20:55.197: E/AndroidRuntime(419):  at com.fuchs.frontcam.MainActivity.initCamera(MainActivity.java:56)
05-27 22:20:55.197: E/AndroidRuntime(419):  at com.fuchs.frontcam.MainActivity.onResume(MainActivity.java:49)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.Activity.performResume(Activity.java:3832)
05-27 22:20:55.197: E/AndroidRuntime(419):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
05-27 22:20:55.197: E/AndroidRuntime(419):  ... 12 more
4

1 に答える 1

6

だから私は同様の問題を抱えていました。

私のアプリはときどき機能したが、他のアプリは機能しなかったという意味で、動作はランダムに見えます。オブジェクトを解放して再利用するタイミングと関係があると思います。

私の場合、カメラを何度も(継続的に)再利用できる必要があります。

私が気付いたのは、surfaceDestroyedメソッドが呼び出されることが保証されていないことでした (これは、カメラ オブジェクトをクリーンアップ/解放する場所です。

私が見つけた解決策は、写真を撮り終わったらすぐにカメラを片付けて解放することでした。

次の例では、すべてのコード行が必要になるわけではありません。

私の元の surfaceDestoryed にはこれが含まれていました:

try {
    // Non camera related code
    .....        

    // Start of camera related code 
    // Only clean up what you need to
    if (camera != null) {
        camera.cancelAutoFocus();
        .....       
        camera.stopPreview();
    }
    previewing = false;
    } catch (RuntimeException e) {
        LogUtils.error(LOG_TAG, "Problem in surfaceDestroyed"); //$NON-NLS-1$
        e.printStackTrace();
    } finally {
        // Make sure that at least these two calls are made
        camera.release();
        camera = null;
}

写真を撮り終わった後、このコードをその場所にコピーしただけで、カメラのリソースは不要になりました。

古いデバイスの場合、2.2.X ~ 4.0.XsurfaceDestroyedが常に呼び出されていました。多くの 4.1+ デバイスでは、そうではないようです。

于 2013-05-31T17:52:42.490 に答える