2013-02-01 120 views
0

我正在爲android製作相機應用程序,試圖學習如何。我跟着一個教程,但它一直失敗,強制關閉。請大家看看下面我的詳細信息:安卓相機應用程序部隊關閉

XML代碼:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="fill_parent" 
android:layout_height="fill_parent" android:id="@+id/layout"> 
<TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:text="Camera Demo" 
    android:textSize="24sp" /> 

<FrameLayout android:id="@+id/preview" 
    android:layout_weight="1" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
</FrameLayout> 

<Button android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/buttonClick" 
    android:text="Click" android:layout_gravity="center"></Button> 

</LinearLayout> 

Java代碼:

public class CameraActivity extends Activity { 
private static final String TAG = "CameraDemo"; 
Camera camera; 
Preview preview; 
Button buttonClick; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera_screen); 

    preview = new Preview(this); 
    ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

    buttonClick = (Button) findViewById(R.id.buttonClick); 
    buttonClick.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      preview.camera.takePicture(shutterCallback, rawCallback, 
        jpegCallback); 
     } 
    }); 

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

ShutterCallback shutterCallback = new ShutterCallback() { 
    public void onShutter() { 
     Log.d(TAG, "onShutter'd"); 
    } 
}; 

/** Handles data for raw picture */ 
PictureCallback rawCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.d(TAG, "onPictureTaken - raw"); 
    } 
}; 

/** Handles data for jpeg picture */ 
PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
      // write to local sandbox file system 
      // outStream = 
      // CameraDemo.this.openFileOutput(String.format("%d.jpg", 
      // System.currentTimeMillis()), 0); 
      // Or write to sdcard 
      outStream = new FileOutputStream(String.format(
        "/sdcard/%d.jpg", System.currentTimeMillis())); 
      outStream.write(data); 
      outStream.close(); 
      Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
     } 
     Log.d(TAG, "onPictureTaken - jpeg"); 
    } 
}; 

} 

Preview.java:

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
private static final String TAG = "Preview"; 

SurfaceHolder mHolder; 
public Camera camera; 

Preview(Context context) { 
    super(context); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

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.setPreviewCallback(new PreviewCallback() { 

      public void onPreviewFrame(byte[] data, Camera arg1) { 
       FileOutputStream outStream = null; 
       try { 
        outStream = new FileOutputStream(String.format(
          "/sdcard/%d.jpg", System.currentTimeMillis())); 
        outStream.write(data); 
        outStream.close(); 
        Log.d(TAG, "onPreviewFrame - wrote bytes: " 
          + data.length); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
       } 
       Preview.this.invalidate(); 
      } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    // Because the CameraDevice object is not a shared resource, it's very 
    // important to release it when the activity is paused. 
    camera.stopPreview(); 
    camera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(w, h); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

@Override 
public void draw(Canvas canvas) { 
    super.draw(canvas); 
    Paint p = new Paint(Color.RED); 
    Log.d(TAG, "draw"); 
    canvas.drawText("PREVIEW", canvas.getWidth()/2, 
      canvas.getHeight()/2, p); 
} 
} 

的logcat:

02-01 19:44:41.825: E/AndroidRuntime(4329): FATAL EXCEPTION: main 
02-01 19:44:41.825: E/AndroidRuntime(4329): java.lang.RuntimeException: setParameters failed 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.hardware.Camera.native_setParameters(Native Method) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.hardware.Camera.setParameters(Camera.java:1527) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at com.mysoftware.mysoftwareos.mobile.Preview.surfaceChanged(Preview.java:78) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.SurfaceView.updateWindow(SurfaceView.java:554) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.SurfaceView.access$000(SurfaceView.java:81) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:671) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1848) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1028) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4246) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer.doFrame(Choreographer.java:525) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.os.Handler.handleCallback(Handler.java:615) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.os.Looper.loop(Looper.java:137) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.app.ActivityThread.main(ActivityThread.java:4765) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at dalvik.system.NativeStart.main(Native Method) 
02-01 19:44:45.455: E/Trace(4386): error opening trace file: No such file or directory (2) 
02-01 19:44:45.585: E/PhonePolicy(4386): Could not preload class for phone policy: com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback 

請幫助我,非常感謝!

回答

2

您沒有顯示預覽類的源代碼,所以很難說出什麼可能是錯誤的。

但是從跟蹤中,錯誤來自Preview.surfaceChanged的Camera.setParameters()調用。所以問題是,你想在那裏設置相機不喜歡的東西?另外,你的日誌只覆蓋異常,所以沒有關於系統在失敗之前做什麼的背景。在失敗之前加入一些日誌對調試也很有幫助;系統通常會打印出一個原因,說明爲什麼在堆棧跟蹤之前調用失敗了幾行。

編輯︰現在與Preview.java那裏,我可以看到問題。

您無法爲相機預覽輸出選擇隨機大小。它必須是由getSupportedPreviewSizes()提供的預覽尺寸之一。現在,您只是使用Surface的大小來預覽輸出,但不能保證可以工作(如果大小與列表中的大小相匹配,您可能會感到幸運,但這不太可能)。

查看Android開發者網站上的camera app tutorial;它試圖涵蓋一些這些細節。

+0

我上傳了預覽課程,如果你可以看看它 – user1446632