2012-07-11 71 views
1

我是一個begginer android程序員,我對相機有問題。我想要做的是在相機上預覽。問題是,Camera.open()總是返回null。該代碼是這樣的:Android模擬器上的相機不起作用

CameraPreview.java

public class CameraPreview extends Activity implements SurfaceHolder.Callback 
{ 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_camera_preview); 

     SurfaceHolder holder; 
     SurfaceView preview = (SurfaceView) findViewById(R.id.surface1); 
     holder = preview.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     Camera camera = Camera.open(); 
     if(camera!=null) 
     { 
      try 
      { 
       camera.setPreviewDisplay(holder); 
      } 
      catch (IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      camera.startPreview(); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     // TODO Auto-generated method stub  
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 
} 

AndroidManifest.xml中

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.paparazzi" 
android:versionCode="1" 
android:versionName="1.0" > 
<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="15" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".CameraPreview"> </activity> 
</application> 

模擬器配置:

hw.lcd.density=240 
hw.cpu.arch=arm 
skin.name=WVGA800 
sdcard.size=64M 
abi.type=armeabi-v7a 
hw.camera.back=emulated 
image.sysdir.1=system-images\android-16\armeabi-v7a\ 
hw.gpu.enabled=yes 
hw.camera.front=emulated 
skin.path=platforms\android-16\skins\WVGA800 
hw.cpu.model=cortex-a8 
vm.heapSize=48 
hw.ramSize=512 

我與Android p日食使用魯金和最新的sdk。我真的很感激任何建議。

+0

測試在真實設備用的代碼非常少的線來完成....不因爲它不支持相機資源... – 2012-07-11 11:27:44

+0

好的,感謝您的建議,但它仍然無法正常工作。這次我會把它簡化 - 你認爲甚至可以讓相機在模擬器上正常工作,或者我應該使用真實的設備嗎? – 2012-07-11 11:59:52

+0

您無法在模擬器上測試,因爲相機在模擬器上不工作。您將不得不在真實設備上測試您的應用程序,因爲Mainank已經告訴您 – banzai86 2012-07-11 12:05:18

回答

0

您尚未在清單中提供以下功能。給它並再次運行它。

<uses-feature android:name="android.hardware.camera" android:required="true"/> 

如果仍然得到異常,請將您的Logcat輸出放在此處。

更新:在你的

private static Camera camera; 

    public static Camera getCameraInstance(){ 
     try { 
      camera = Camera.open(); 
     } 
     catch (Exception e){ 
      // Camera is not available (in use or does not exist) 
      Toast.makeText(context, "Camera is occupied by another program" , Toast.LENGTH_SHORT).show(); 
     } 
     return camera; // returns null if camera is unavailable 
    } 

使用上面的代碼,並嘗試提取異常,如果它一次又一次地得到。

呼叫

CameraPreview.getCameraInstance(); 

surfaceCreated方法內部

感謝@alextsc提醒我關於使用特徵

+2

這是a)不需要。這只是市場的暗示(例如谷歌播放)根據某些標準過濾應用程序b)已包含在內。如果您在沒有'<使用特徵/>'的情況下請求相機權限,則假定此功能。請參閱[文檔](http://developer.android.com/guide/topics/manifest/uses-feature-element.html#implicit)。儘管如此,你可以拼出來讓你的清單/代碼更具可讀性,但是關於它。 – 2012-07-11 11:29:36

0

使用Android的內置攝像頭的應用程序,啓動相機和拍攝圖片是否能夠使用意向的力量

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    // start the image capture Intent 
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);