2011-12-08 16 views
2

私は単にカメラが画面上に何を表示しているかを示す非常に簡単なアプリケーションを作成しようとしています。私はエミュレータ(私が使った電話機と同じ仕様)を使ってアプリケーションを作成しました。これは黒色と白の二乗された背景に灰色の表示ボックスが表示されているので、すべてのコードと権限が正しいと確信しています。Androidカメラのプレビュー - 'ファイルがありません - カメラを切り替えることができません'

Wildfire Phone(Androidバージョン:2.2.1)でアプリケーションを実行しようとすると、何かが表示される前に強制終了され、ログを確認するとこのエラーが表示されます。

  • 12月8日12:41:42.649:W/CameraSwitch(3004):オープンメインカメラ
  • 12月8日12:41:42.659:W/CameraSwitch(3004):なしファイル - できませんスイッチカメラ
  • 12-08 12:41:43.239:D/AndroidRuntime(3004):VM

をシャットダウン、私はいくつかのサイトを通じて見て、それはOSやハードウェアに問題がある可能性があるようです。誰かが周りの仕事を見つけましたか?

愚かな間違いをした場合に備えて私のコードを投稿します。

import android.app.Activity; 
import android.content.pm.ActivityInfo; 
import android.os.Bundle; 

public class InformationPassingTestActivity extends Activity { 

Preview preview; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    preview = new Preview(this); 
    setContentView(preview); 
    } 
} 

カメラに

class Preview extends SurfaceView implements SurfaceHolder.Callback { 

SurfaceHolder mHolder; 
public Camera camera; 

Preview(Context context) { 
    super(context); 

    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 

    camera = Camera.open(); 
    try { 
     camera.setPreviewDisplay(holder); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview(); 
    camera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(width, height); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 
} 

を扱う私のプレビュークラスがたManifest.xml

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 

<uses-sdk android:minSdkVersion="8" /> 
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > 
<activity android:label="@string/app_name"   android:name=".InformationPassingTestActivity" > 
    <intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    </activity> 
</application> 

すべてのヘルプは素晴らしいだろう:)

答えて

3

あなたの問題は、おそらくですこの李からne(またはそれがまだない場合):parameters.setPreviewSize(width, height);

実際のカメラはすべてのプレビューサイズをサポートすることはできません。サーフェスのサイズに近く、カメラハードウェアでサポートされているプレビューサイズを選択する必要があります。ここではそれを行うためのサンプル方法です:

private Camera.Size getBestPreviewSize(int width, int height, 
              Camera.Parameters parameters) { 
    Camera.Size result=null; 

    for (Camera.Size size : parameters.getSupportedPreviewSizes()) { 
     if (size.width<=width && size.height<=height) { 
     if (result==null) { 
      result=size; 
     } 
     else { 
      int resultArea=result.width*result.height; 
      int newArea=size.width*size.height; 

      if (newArea>resultArea) { 
      result=size; 
      } 
     } 
     } 
    } 

    return(result); 
    } 

あなたはまた、カメラが既に開かれているかどうかを確認せずsurfaceCreatedCamera.open()を呼び出す問題がある可能性があります。その電話をonCreateonResumeの方法に移動し、の方法でCamera.release()に電話をかけて、複数回カメラを開こうとしないでください。

+0

...カメラがプレビューサイズを宣伝しても、必ずしもそれをサポートするとは限りません。 HTC Heroが一度噛んだ@ssを取得しました;) –

+0

@ethan Camera.close()はありません。release()を意味しますか? –

+0

申し訳ありませんが、あなたの答えをコメントする/承認する/評価するのはずっとかかりましたが、これは完全に機能します。問題はサポートされたサイズでしたが、私はあなたのコードを直接使用していませんでしたが、問題を明らかにしました。どうもありがとうございます :) –

関連する問題