2011-12-08 52 views
2

我試圖創建一個非常簡單的應用程序,僅僅顯示了攝像機觀看的屏幕上。我創建了一個仿真器(相同規格爲我所用的手機),這顯示了黑色和白色背景的平方與灰觀看箱移動了它的應用程序,所以我敢肯定,我已經得到了所有代碼和權限正確。Android攝像頭預覽 - 「無文件 - 不能切換相機

當我嘗試在我的Wildfire手機上運行應用程序時(Android版本:2.2.1)在顯示任何內容之前強制關閉,當我檢查日誌時顯示此錯誤。

  • 12月12日至8日:41:42.649:W/CameraSwitch(3004):打開主攝像機
  • 12月12日至8日:41:42.659:W/CameraSwitch(3004):沒有文件 - 不能切換相機
  • 12月12日至8日:41:43.239:d/AndroidRuntime(3004):關閉VM

我通過一些網站看了一下,現在看來,這可能是與操作系統或硬件問題。有沒有人找到解決辦法?

我會發布我的代碼,以防萬一我犯了一個愚蠢的錯誤。

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

...並記住,即使相機發布預覽大小並不總是支持。得到了我的@ss由HTC Hero的被咬一次;) –

+0

@ethan有沒有Camera.close(),你的意思是釋放()? –

+0

對不起,我花了這麼長時間來評論/批准/評價你的答案,這完美的作品。問題是支持的大小,而我沒有直接使用你的代碼,它確實揭示了這個問題。非常感謝 :) –