2011-07-28 38 views
9

Tôi đã nhìn thấy các vấn đề tương tự với vấn đề mà tôi đang gặp phải, nhưng tôi vẫn không thể tìm ra giải pháp. Tôi rất mới phát triển Android, vì vậy tôi đang gặp sự cố khi theo dõi sự cố của mình. Dù sao, tôi đang cố gắng để tạo ra một bản xem trước máy ảnh bằng cách sử dụng một lớp CameraSurfaceView tôi tạo ra mà mở rộng SurfaceView và thực hiện SurfaceHolder.Callback. Không có vấn đề gì tôi cố gắng trong lớp StartCamera của tôi, phương thức surfaceCreated() không bao giờ được gọi, do đó máy ảnh của tôi không bao giờ bắt đầu. Bất kỳ trợ giúp sẽ là tuyệt vời, cảm ơn!surfaceCreated() Không bao giờ được gọi là

StartCamera.java

import net.peterd.zombierun.R; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.widget.FrameLayout; 

public class StartCamera extends BaseActivity { 

    private Camera mCamera; 
    private CameraSurfaceView mView; 

    public void onCreate(Bundle state) { 
     // TODO Auto-generated constructor stub 
     super.onCreate(state); 
     setContentView(R.layout.start_camera); 
    } 

    public void onResume() { 
     super.onResume(); 

     mView = new CameraSurfaceView(this); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.cPreview); 
     preview.addView(mView); 
    } 

    public void onPause() { 
     mCamera.stopPreview(); 
     mCamera.release(); 
    } 

} 

CameraSurfaceView.java

import java.io.IOException; 
import android.content.Context; 
import android.hardware.Camera; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback 
{ 
     private SurfaceHolder holder; 
     private Camera camera; 

     public CameraSurfaceView(Context context) 
     { 
       super(context); 

       //Initiate the Surface Holder properly 
       this.holder = this.getHolder(); 
       this.holder.addCallback(this); 
       this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) 
     { 
       try 
       { 
         //Open the Camera in preview mode 
         this.camera = Camera.open(); 
         this.camera.setPreviewDisplay(this.holder); 
       } 
       catch(IOException ioe) 
       { 
         ioe.printStackTrace(System.out); 
       } 
     } 

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

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) 
     { 
       // Surface will be destroyed when replaced with a new screen 
       //Always make sure to release the Camera instance 
       camera.stopPreview(); 
       camera.release(); 
       camera = null; 
     } 

     public Camera getCamera() { 
      return camera; 
     } 
} 

start_camera.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"> 

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

</LinearLayout> 

Trả lời

6

Rõ ràng điều này là do FrameLayout là trống rỗng và do đó không tạo ra bất kỳ loại SurfaceView . Bạn có thể cố gắng buộc chiều cao và chiều rộng cài đặt LinearLayout mẹ theo cách thủ công hoặc chỉ cần thêm một imageView bên trong FrameLayout. Kể từ khi FrameLayout có thể chứa nhiều widget, nhưng nó chỉ hiển thị cuối cùng của chúng, bạn có thể đặt một ImageView bên trong FrameLayout cho thấy một hình ảnh nhỏ chỉ cho SurfaceView được tạo ra.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

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

<!-- Adding small dummy image --> 
<ImageView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    src="@drawable/small_picture"> 

</FrameLayout> 

</LinearLayout> 
+1

Tôi gặp sự cố tương tự. Bất cứ ai có thể giải quyết điều này? –

0

Tôi có lỗi từ dòng này trong phương pháp CameraSurfaceView, surfaceChanged:

camera.setParameters(parameters); 

Nó hoạt động tốt khi tôi nhận xét rằng ra.

1

@jvnane Tôi đã thử mã của bạn, nó hoạt động, với lỗi nhỏ.

surfaceChanged được gọi là không có vấn đề gì. Theo cách nào bạn nghĩ nó không hoạt động? Thử thêm thông điệp debug và nhìn thấy nó trong LogCat:

@Override 
public void surfaceCreated(final SurfaceHolder holder) 
{ 
    Log.i("Camera Test", "It works!"); 
    try 
    { 
     //Open the Camera in preview mode 
     this.camera = Camera.open(); 
     this.camera.setPreviewDisplay(this.holder); 
    } 
    catch(final IOException ioe) 
    { 
     ioe.printStackTrace(System.out); 
    } 
} 

lỗi nhỏ: Camera đối tượng được phát hành vào surfaceDestroyed do đó bạn không cần phải giải phóng nó một lần nữa trong hoạt động của . Ngoài ra, bạn cần gọi số super.onPause() khi ghi đè phương pháp onPause().

5

Tôi đã gặp sự cố tương tự. Với tôi đó là vì kích thước của View đã được thiết lập là 0, và do đó bề mặt không bao giờ được tạo ra. Tôi đã kiểm tra điều này bằng cách thiết lập một kích thước cụ thể, và tất cả các cuộc gọi lại đột ngột được gọi. (Tương tự, rõ ràng, nắm giữ nếu Chế độ xem được đặt ra ngoài màn hình).

Các vấn đề liên quan