Camera.open()时出现Android错误

时间:2011-11-24 20:27:45

标签: android camera

我只想尝试在Android上访问我的相机。我不知道如何获取错误日志,但是当我调用函数Camera.open()时出现错误。

我正在使用SDK示例代码,但它没有用。

我还尝试在释放之前将mCamera设置为null。是的,我已经在manifest.xml中设置了权限

即使使用我的htc

,它也无法与模拟器一起使用
package com.example.android.apis.graphics;

import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import java.io.IOException;


public class CameraPreview extends Activity {    
    private Preview mPreview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Hide the window title.
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // Create our Preview view and set it as the content of our activity.
    mPreview = new Preview(this);
    setContentView(mPreview);
}

}


class Preview extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;


Preview(Context context) {
    super(context);

    // Install a SurfaceHolder.Callback so we get notified when the
    // underlying surface is created and destroyed.
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void surfaceCreated(SurfaceHolder holder) {
    // The Surface has been created, acquire the camera and tell it where
    // to draw.
    mCamera = Camera.open();
    try {
       mCamera.setPreviewDisplay(holder);
    } catch (IOException exception) {
        mCamera.release();
        mCamera = null;
        // TODO: add more exception handling logic here
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    // Surface will be destroyed when we return, so stop the preview.
    // Because the CameraDevice object is not a shared resource, it's very
    // important to release it when the activity is paused.
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // Now that the size is known, set up the camera parameters and begin
    // the preview.
    Camera.Parameters parameters = mCamera.getParameters();
    parameters.setPreviewSize(w, h);
    mCamera.setParameters(parameters);
    mCamera.startPreview();
}

}

5 个答案:

答案 0 :(得分:3)

查看接受的答案here中提供的代码。它应该有助于你开始。

编辑:啊,您的logcat错误表明您的清单文件中没有以下某行(位于结束</application>元素下方:

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

答案 1 :(得分:2)

听起来你仍然没有打开相机,也没有从之前的运行或代码测试中释放出来。

也许你在代码到达SurfaceDestroyed事件和......之前停止了代码的执行。

mCamera.stopPreview();
mCamera.release();
mCamera = null;

......没有被召唤。

我有同样的问题,这就是原因。您可以确认它,因为当它发生时尝试打开手机上的相机应用程序,您将收到相同的错误。

我使用http://www.41post.com/3794/programming/android-take-a-picture-without-displaying-a-preview教程中的相同代码。

我改变了

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)

调用SurfaceView的“on_click”事件。

public void TakePicture_click(View view)

这样我可以决定何时拍摄照片,而不是在活动开始后立即拍照。

然后在我加载ImageView之后,我立即释放了相机。然后我再没有得到同样的问题。

我还做了检查以确保相机在返回on_click代码之前可用,否则你会收到另一个错误。

如果有人感兴趣我使用此相机代码在捕获图像的顶部做一些动画。因此,必须确保我正在使用的imageVeiw被带到了顶部,而我无法看到它。我发现你看不到SurfaceView图层。

public void TakePicture_click(View view)
{
      //check here if the camera is still running in case you click the screen later
      //otherwise you'll get an error.
    if (mCamera !=null) 
    {
            //sets what code should be executed after the picture is taken

        Camera.PictureCallback mCall = new Camera.PictureCallback()
        {
            @Override
            public void onPictureTaken(byte[] data, Camera camera)
            {
                //play the shutter.wav sound
                mPlay.start();

                //decode the data obtained by the camera into a Bitmap
                bmp = BitmapFactory.decodeByteArray(data, 0, data.length);

                //store the image the imageView
                background_image.setImageBitmap(bmp);

                //I use another imageview to show a layer over the captured image 
                //so you have to bring the imageview to the top...
                //because you can't see through the SurfaceView. 
                animate_image.bringToFront();

                //release the camera straight away so we don't have any chance of it staying open
                if (mCamera !=null) {
                    //stop the preview
                    mCamera.stopPreview();
                    //release the camera
                    mCamera.release();
                    //unbind the camera from this object
                    mCamera = null;
                }

            }
        };

        mCamera.takePicture(null, null, mCall);
    }
}

希望能帮助您和其他遇到同样问题的人。

感谢DimasTheDriver的原始教程,它帮助了我,因为我想要一个没有相机控制和确认屏幕的简单捕获程序。

快门声

对于那些感兴趣的人,我还添加了一个快门点击声,可以在以下网址找到:wwww.freesound.org/people/Nathan_Lomeli/sounds/79190 将.wav文件放在res / raw文件夹中

在OnCreate

之前定义.wav文件的播放器
private MediaPlayer mPlay

在OnCreate中为.wav文件创建播放器

mPlay = MediaPlayer.create(this, R.raw.shutter);

拍摄照片时,在On_Click中播放shutter.wav声音

mPlay.start();

答案 2 :(得分:0)

在我的情况下,问题是由于缺少手电筒权限造成的:

<uses-permission android:name="android.permission.FLASHLIGHT"/>

答案 3 :(得分:0)

将权限置于应用程序之上  标记,在您的清单文件中

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

 <application>
          <activity></activity>
 </application> 

我保留了错误地方的权限,这就是为什么我一直在犯同样的错误!希望这对你也有帮助

答案 4 :(得分:0)

如果您已将权限置于AndroidManifest中的<application>元素之上且不起作用, 检查您的导入,它应该是import android.hardware.Camera