我只想尝试在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();
}
}
答案 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