2014-11-17 1 views
0

SO guys Я делаю приложение для камеры, и я не понимаю весь код, но большую часть его. Я скопировал часть кода из сети. Моя активность удерживает принудительное закрытие методаSurfaceDestroyed. Я не могу сказать, почему он закрывается, когда я нажимаю картинку. Потому что, когда я нажимаю на картинку, я начинаю намерение, чтобы перейти к новому действию. Это когда поверхность разрушается. Btw моя поверхность - это относительный макет, на котором происходит предварительный просмотр камеры. Ошибка происходит в классе ShowCamera в методе OnSurfaceDestroyed. Я вижу предварительный просмотр. Приложение закрывается, когда я пытаюсь щелкнуть рис.Моя активность камеры удерживает силу закрытием на поверхностиDestroyed

Это мой код. С моей MainActivity.java Я посылаю код ниже в onCreateMethod

Camera frontCam = Camera.open(1) // 1 is for front cam 
Show Camera showCamera = new ShowCamera(this, frontCam); 

От MainActivity.java Я посылаю код ниже onCapture картины

private PictureCallback capturedIt = new PictureCallback() { 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

     Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

     if (bitmap == null) { 
      Toast.makeText(getApplicationContext(), "not taken", 
        Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(getApplicationContext(), "taken", 
        Toast.LENGTH_SHORT).show(); 
      Intent viewerIntent = new Intent("com.tyrone.mirrorapp.AFTERCAPTURE"); 
      viewerIntent.setClass(MainActivity.this, afterCapture.class); 
      Bundle bitmapBundle = new Bundle(); 
      bitmapBundle.putByteArray("clickedBitmap", data); 
      viewerIntent.putExtras(bitmapBundle); 
      startActivityForResult(viewerIntent,0); 
     } 
     cameraObject.release(); 
    } 

}; 

Это мой класс ShowCamera.java ниже

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback { 

private SurfaceHolder holdMe; 
    Camera theCamera; 

public ShowCamera(Context context,Camera camera) { 
     super(context); 
     theCamera = camera; 
     holdMe = getHolder(); 
     holdMe.addCallback(this); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int width, int height) { 
     theCamera.setDisplayOrientation(90);//cz the fron cam doesn't adjust. 
     theCamera.startPreview(); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
     theCamera.setPreviewDisplay(holder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     theCamera.setPreviewCallback(null); 
     theCamera.stopPreview(); 
     theCamera.release(); 
     theCamera = null; 
    } 

} 

В моей деятельности действует принудительное закрытие на уничтожение деятельности. Любая идея, что может быть причиной? P.S. : Я не совсем уверен, что сила закрывается на SurfaceDestroyed. Пожалуйста, поправьте меня, если я ошибаюсь. Спасибо

часть моего файла журнала

11-18 20:30:31.877: I/SurfaceView(21648): Callback --> surfaceCreated 
11-18 20:30:31.877: I/SurfaceView(21648): surfaceCreated callback + 
11-18 20:30:31.877: D/setting preview display(21648): getting Ready 
11-18 20:30:31.879: D/AndroidRuntime(21648): Shutting down VM 
11-18 20:30:31.879: W/dalvikvm(21648): threadid=1: thread exiting with uncaught exception (group=0x41a00c98) 
11-18 20:30:31.879: W/dalvikvm(21648): threadid=1: uncaught exception occurred 
11-18 20:30:31.879: W/System.err(21648): java.lang.RuntimeException: Method called after release() 
11-18 20:30:31.880: W/System.err(21648): at android.hardware.Camera.setPreviewDisplay(Native Method) 
11-18 20:30:31.880: W/System.err(21648): at android.hardware.Camera.setPreviewDisplay(Camera.java:580) 
11-18 20:30:31.880: W/System.err(21648): at com.tyrone.mirrorapp.ShowCamera.surfaceCreated(ShowCamera.java:66) 
11-18 20:30:31.880: W/System.err(21648): at android.view.SurfaceView.updateWindow(SurfaceView.java:662) 
11-18 20:30:31.881: W/System.err(21648): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:256) 
11-18 20:30:31.881: W/System.err(21648): at com.tyrone.mirrorapp.ShowCamera.onWindowVisibilityChanged(ShowCamera.java:98) 
11-18 20:30:31.881: W/System.err(21648): at android.view.View.dispatchWindowVisibilityChanged(View.java:8096) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1448) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1192) 
11-18 20:30:31.881: W/System.err(21648): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6231) 
11-18 20:30:31.881: W/System.err(21648): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) 
11-18 20:30:31.882: W/System.err(21648): at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
11-18 20:30:31.882: W/System.err(21648): at android.view.Choreographer.doFrame(Choreographer.java:560) 
11-18 20:30:31.882: W/System.err(21648): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) 
11-18 20:30:31.882: W/System.err(21648): at android.os.Handler.handleCallback(Handler.java:808) 
11-18 20:30:31.882: W/System.err(21648): at android.os.Handler.dispatchMessage(Handler.java:103) 
11-18 20:30:31.882: W/System.err(21648): at android.os.Looper.loop(Looper.java:193) 
11-18 20:30:31.882: W/System.err(21648): at android.app.ActivityThread.main(ActivityThread.java:5292) 
11-18 20:30:31.882: W/System.err(21648): at java.lang.reflect.Method.invokeNative(Native Method) 
11-18 20:30:31.882: W/System.err(21648): at java.lang.reflect.Method.invoke(Method.java:515) 
11-18 20:30:31.883: W/System.err(21648): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
11-18 20:30:31.883: W/System.err(21648): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
11-18 20:30:31.883: W/System.err(21648): at dalvik.system.NativeStart.main(Native Method) 
11-18 20:30:31.883: W/dalvikvm(21648): threadid=1: calling UncaughtExceptionHandler 
11-18 20:30:31.885: E/AndroidRuntime(21648): FATAL EXCEPTION: main 
11-18 20:30:31.885: E/AndroidRuntime(21648): Process: com.tyrone.mirrorapp, PID: 21648 
11-18 20:30:31.885: E/AndroidRuntime(21648): java.lang.RuntimeException: Method called after release() 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.hardware.Camera.setPreviewDisplay(Native Method) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.hardware.Camera.setPreviewDisplay(Camera.java:580) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at com.tyrone.mirrorapp.ShowCamera.surfaceCreated(ShowCamera.java:66) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.SurfaceView.updateWindow(SurfaceView.java:662) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:256) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at com.tyrone.mirrorapp.ShowCamera.onWindowVisibilityChanged(ShowCamera.java:98) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.View.dispatchWindowVisibilityChanged(View.java:8096) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1110) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1448) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1192) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6231) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.Choreographer.doFrame(Choreographer.java:560) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.os.Handler.handleCallback(Handler.java:808) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.os.Handler.dispatchMessage(Handler.java:103) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.os.Looper.loop(Looper.java:193) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at android.app.ActivityThread.main(ActivityThread.java:5292) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at java.lang.reflect.Method.invokeNative(Native Method) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at java.lang.reflect.Method.invoke(Method.java:515) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
11-18 20:30:31.885: E/AndroidRuntime(21648): at dalvik.system.NativeStart.main(Native Method) 
+0

Можете скопировать и вставить журнал, пожалуйста :) –

+0

ok @VincentD. D, но это новый. Новая ошибка. Это происходит в setPreviewCallback. Несколько изменил мой код. – Devenom

+1

Является ли ваш код в вашем сообщении актуальным и занесен в систему? –

ответ

1

Ваш журнал утверждает, что исключение происходит onSurfaceCreated. объект Camera освобождается до вызова этого обратного вызова. Проверьте, где вы снимаете камеру в своем приложении. Возможно, вы отпустите его после прохождения frontCam до ShowCamera конструктор в onCreate().

ОК, как вы объяснили, это происходит, когда вы возвращаетесь в MainActivity из другого. Общей практикой является открытие камеры в onResume(), а также выпуск в onPause(). Также можно открыть камеру в ShowCamera.surfaceCreated() и отпустить (как в вашем коде выше) в ShowCamera.surfaceDestroyed().

Рекомендуется открывать камеру в фоновом режиме, но это связано с более тонким расписанием вызова на Camera.setPreviewDisplay().

+0

Это происходит только во второй раз, когда выполняется действие. То есть, когда я перехожу от текущей деятельности (которая работает в первый раз) к следующему действию и возвращается к первому действию (которое не работает во второй раз). В чем может быть проблема? Я отключаю камеру после первого раза при переходе к следующему действию. Итак, что мне делать, когда я вернусь к 1-му действию? – Devenom

+0

Обычно рекомендуется открывать камеру в 'onResume()' и выпускать в 'onPause()' Activity или Fragment. Если ваша активность запускает другую, а затем пользователь переходит на _back_, тогда 'onCreate()' может быть пропущен. С другой стороны, это не так. Но 'onResume()' будет вызываться неизбежно. –

+1

Я пробовал это, прежде чем он не поможет. Так что теперь я попробовал еще раз, и все равно этого не произошло. После тех, которые вы предложили, я сделал тысячу изменений. Я действительно не знаю, что я сделал, но у меня это получилось.Но в любом случае спасибо за помощь bro @AlexCohn. Дадут вам зеленый галочку для ваших попыток помочь. – Devenom

Смежные вопросы