2014-01-19 39 views
0

你好我写一个简单的应用程序,与机器人摄像头API直接交互,我使用本教程http://www.tutorialspoint.com/android/android_camera.htm安卓:未捕获的异常引起致命的异常在主

谁能告诉我在哪里,我错了?

日志输出:

01-09 23:42:56.901: D/ATRecorder(886): com.htc.autotest.dlib.RecordEngine in loader [email protected] 
01-09 23:42:57.161: D/AndroidRuntime(886): Shutting down VM 
01-09 23:42:57.161: W/dalvikvm(886): threadid=1: thread exiting with uncaught exception (group=0x400205a0) 
01-09 23:42:57.171: E/AndroidRuntime(886): FATAL EXCEPTION: main 
01-09 23:42:57.171: E/AndroidRuntime(886): java.lang.RuntimeException: startPreview failed 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.hardware.Camera.startPreview(Native Method) 
01-09 23:42:57.171: E/AndroidRuntime(886): at com.example.camera1.ShowCamera.surfaceCreated(ShowCamera.java:30) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.SurfaceView.updateWindow(SurfaceView.java:551) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:348) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.View.draw(View.java:6973) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.widget.FrameLayout.draw(FrameLayout.java:357) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.drawChild(ViewGroup.java:1732) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.drawChild(ViewGroup.java:1730) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1459) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.View.draw(View.java:6973) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.widget.FrameLayout.draw(FrameLayout.java:357) 
01-09 23:42:57.171: E/AndroidRuntime(886): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1997) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewRoot.draw(ViewRoot.java:1600) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewRoot.performTraversals(ViewRoot.java:1321) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.view.ViewRoot.handleMessage(ViewRoot.java:1957) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.os.Looper.loop(Looper.java:150) 
01-09 23:42:57.171: E/AndroidRuntime(886): at android.app.ActivityThread.main(ActivityThread.java:4277) 
01-09 23:42:57.171: E/AndroidRuntime(886): at java.lang.reflect.Method.invokeNative(Native Method) 
01-09 23:42:57.171: E/AndroidRuntime(886): at java.lang.reflect.Method.invoke(Method.java:507) 
01-09 23:42:57.171: E/AndroidRuntime(886): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-09 23:42:57.171: E/AndroidRuntime(886): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-09 23:42:57.171: E/AndroidRuntime(886): at dalvik.system.NativeStart.main(Native Method) 

我完全跟着它,但我仍然得到和未捕获的异常日志猫,当我尝试运行它,这里是MainActivity代码:

package com.example.camera1; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

     private Camera cameraObject; 
     private ShowCamera showCamera; 
     private ImageView pic; 
     public static Camera isCameraAvailiable(){ 
      Camera object = null; 
      try { 
      object = Camera.open(); 
      } 
      catch (Exception e){ 
      } 
      return object; 
     } 

     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();  
      } 
      cameraObject.release(); 
     } 
    }; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      pic = (ImageView)findViewById(R.id.imageView1); 
      cameraObject = isCameraAvailiable(); 

      showCamera = new ShowCamera(this, cameraObject); 
      FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
      preview.addView(showCamera); 
     } 
     public void snapIt(View view){ 
      cameraObject.takePicture(null, null, capturedIt); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
     } 
    } 

这里是ShowCamera类:

package com.example.camera1; 

import java.io.IOException; 

import android.content.Context; 
import android.hardware.Camera; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback { 

    private SurfaceHolder holdMe; 
    private 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 arg2, int arg3) { 
    } 

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

    @Override 
    public void surfaceDestroyed(SurfaceHolder arg0) { 
    } 

} 
+1

什么是错误? –

+0

嗨,对不起,我已经发布在问题的顶部。 –

+0

你能发布完整的错误吗?你发布的帖子并不是很丰富。 –

回答

0

Camera.startPreview()RuntimeException可能有不同的原因。对于example,可以通过将预览大小设置为不支持预览大小之一。

0

试图抓住在surfaceCreated顶层异常方法(而不是IOException)并在异常块中调用e.getMessage()以获取有关错误类型的更多信息。

+1

这不是一个真正的答案,只是一种方法来获得答案。对此使用评论。 –

+0

这是一个很好的建议,以捕获泛型异常,而不仅仅是IOException与相机一起工作。在这种特定情况下,这可以防止应用程序崩溃(尽管作者需要设计回退)。但是没有附加的信息没有打印在附件的崩溃日志中。 –

+0

本应该是一个评论,但我需要50的声誉才能这样做。 – Heisenberg

相关问题