2013-03-23 88 views
1

我正在尝试为Android编写相机应用程序,但我无法使预览工作。我试图按照Android给出的步骤here,但它不起作用,应用程序不断崩溃。我不确定我做错了什么,但我很确定我是按照正确的步骤行事的。Android - 相机预览不起作用

这是我到目前为止有: 相机Activity类

public class CameraActivity extends Activity 
{ 
    private CameraPreview mPreview = null; 
    private Camera mCamera = null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera); 

     mCamera = getCameraInstance(); 

     mPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mPreview); 

    } 
    public static Camera getCameraInstance() 
    { 
     Camera c = null; 

     try 
     { 
      //attempt to get a Camera instance 
      c = Camera.open(); 
     } 
     catch(Exception e) 
     { 
      //Camera is not available(in use or does not exist) 
     } 
     return c;//returns null if camera is unavailable 
    } 


    public void onPause() 
    { 
     super.onPause(); 
     mCamera.stopPreview(); 
     releaseCamera(); 
    } 


    private void releaseCamera() 
    { 
     if(mCamera != null) 
     { 
      mCamera.release(); 
      mCamera = null; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.camera, menu); 
     return true; 
    } 
} 

摄像头预览类

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private final String TAG = "CameraPreview"; 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview(Context context, Camera camera) 
    { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     //deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) 
    { 
     //the Surface has been created, now tell the camera where to draw the preview 
      try 
      { 
       mCamera.setPreviewDisplay(holder); 
       mCamera.startPreview(); 
      } 
      catch(IOException e) 
      { 
       Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
      } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     //empty. take care of releasing the Camera preview in your activity 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     //if your preview can change or rotate, take care of those events here. 
     //make sure to stop the preview before resizing of reformatting it. 
     if(mHolder.getSurface() == null) 
     { 
      //preview surface does not exist 
      return; 
     } 

     //stop preview before making changes 
     try 
     { 
      mCamera.stopPreview(); 
     } 
     catch(Exception e) 
     { 
      //ignore: tried to stop a non-existent preview 
     } 

     //set preview size and make any resize, rotate or 
     //reformatting changes here 
     try 
     { 
      //start preview with new settings 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     } 
     catch(Exception e) 
     { 
      Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
     } 
    } 
} 

,这是我的相机活动的.xml:

<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/camera_preview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     /> 


    <Button 
     android:id="@+id/button_capture" 
     android:text="Capture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     /> 
</LinearLayout> 

据我所知,我正确地按照指南,它应该工作。由于下一部分与录音有关,我想到了所有步骤,直到此时应该产生工作预览,但它不起作用。任何人都可以看到我需要改变的错误吗? 感谢

编辑:增加了我的清单 的manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.ics466.project.warpwalker" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

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

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.ics466.project.warpwalker.WarpIntro" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
      </activity> 
      <activity 
      android:name="com.ics466.project.warpwalker.CameraActivity" 
      android:label="@string/title_activity_camera" > 
     </activity> 
    </application> 

</manifest> 
+0

你说崩溃。怎么样?发布你的logcat – ElefantPhace 2013-03-23 04:25:01

+0

添加清单http://developer.android.com/reference/android/hardware/Camera.html – 2013-03-23 04:28:45

+0

什么是你的logcat说?? – Shiv 2013-03-23 04:50:10

回答

0

android:minSdkVersion="8"应该android:minSdkVersion="9"

,如果你已经使用这些API中的9

增加了一些功能和阅读此链接How To Enable Camera in Android Emulator

或者在Rea中测试这个应用程序l带摄像头的设备。

+0

好了,在将最低版本更改为9之后,它已停止崩溃,但现在屏幕只是黑色。我有虚拟设备,我正在测试它模拟相机,所以我认为它不应该是黑色的...? – Kamakana 2013-03-23 04:52:47

+0

如果你正在模拟器中运行它....模拟器中的相机和预览在哪里,所以它不应该是黑色? – Shiv 2013-03-23 04:58:19

+0

整个屏幕是黑色的或只是camera_preview framelayout是黑色的? – Shiv 2013-03-23 05:09:51

0

在大多数设备上,相机预览的默认方向是横向。

尝试将android:orientation="horizontal"添加到您的.xml文件的LinearLayout中。