2011-07-28 17 views
9

私はこれと同じ問題を抱えていますが、まだ解決策を見つけることはできません。私はAndroid開発にはとても新しいので、私は自分の問題を追跡するのに問題があります。とにかく、SurfaceViewを拡張し、SurfaceHolder.Callbackを実装して作成したCameraSurfaceViewクラスを使用してカメラプレビューを作成しようとしています。 StartCameraクラスで何を試しても、surfaceCreated()メソッドは呼び出されないため、カメラは決して起動しません。どんな助けも素晴らしいだろう、ありがとう!surfaceCreated()Never Called

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> 

答えて

6

どうやらこれはでframeLayoutによる空であるので、SurfaceViewのいずれかの種類を作成できません。親LinearLayoutに高さと幅を手動で設定したり、単にFrameLayout内にimageViewを追加したりすることができます。 FrameLayoutには多くのウィジェットが含まれている可能性がありますが、最後のものだけが表示されるため、作成するSurfaceViewのみの小さな画像を示すFrameLayout内にImageViewを配置できます。

<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

私は同じ問題を抱えています。誰もこれを解決することはできますか? –

0

私はCameraSurfaceView方法、surfaceChangedにこの行からのエラーを持っていた:

camera.setParameters(parameters); 

私はそれをコメントアウトたら、それはうまく働きました。

1

@jvnane私はあなたのコードを試しましたが、それは小さなバグで動作します。

surfaceChangedは問題なく呼び出されます。どのようにして動作しないと思いますか?デバッグメッセージを追加してみてくださいと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); 
    } 
} 

マイナーバグ:あなたが活動ので再びそれを解放する必要はありませんCameraオブジェクトがsurfaceDestroyedで放出されます。また、onPause()メソッドをオーバーライドする場合はsuper.onPause()に電話する必要があります。

5

私は同じ問題がありました。ビューサイズが0に設定されていて、サーフェスが作成されていなかったからです。特定のサイズを設定することでこれを確認し、突然コールバックが呼び出されました。 (ビューが画面外に配置されている場合も同様です)。

関連する問題