无法连接到相机服务
我有我的相机设置为,它工作正常,但如果我把它更改为PORTRAIT
而不是LANDSCAPE
然后将它与下面的错误崩溃......无法连接到相机服务
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): FATAL EXCEPTION: main
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): java.lang.RuntimeException: Fail to connect to camera service
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at android.hardware.Camera.native_setup(Native Method)
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at android.hardware.Camera.<init>(Camera.java:110)
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at android.hardware.Camera.open(Camera.java:90)
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at org.digital.com.CamLayer.surfaceCreated(CamLayer.java:3
的方法,它在崩溃是...
public void surfaceCreated(SurfaceHolder holder) {
synchronized(this) {
mCamera = Camera.open();
Camera.Parameters p = mCamera.getParameters();
p.setPreviewSize(800, 480);
mCamera.setParameters(p);
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
Log.e("Camera", "mCamera.setPreviewDisplay(holder);");
}
mCamera.startPreview();
mCamera.setPreviewCallback(this);
}
}
它崩溃的mCamera = Camera.open();
我的清单文件有<uses-permission android:name="android.permission.CAMERA"></uses-permission>
我该如何解决这个问题,以便我可以在Portrait中查看我的应用程序?
预览区域供您参考,这是我用我的应用程序的SurfaceHolderCallBack内部类和其在纵向模式下在Nexus One 2.2工作正常 - 希望它帮助。
编辑:“which works”=“它不会崩溃”。虽然我还没有想出如何正确旋转预览图像(请参阅上面的第一条评论)。这就是为什么我实际上不得不使用横向和'转换'的UI预览表面到环境模式的东西。 Afaik预览(正确旋转预览图像)仅适用于横向模式。我试过的旋转&方位参数根本没有帮助。
class SurfaceHolderCallback implements SurfaceHolder.Callback {
private static final int IMAGE_WIDTH = 512;
private static final int IMAGE_HEIGHT = 384;
private static final String ORIENTATION = "orientation";
private static final String ROTATION = "rotation";
private static final String PORTRAIT = "portrait";
private static final String LANDSCAPE = "landscape";
public void surfaceCreated(SurfaceHolder holder) {
try {
// This case can actually happen if the user opens and closes the camera too frequently.
// The problem is that we cannot really prevent this from happening as the user can easily
// get into a chain of activites and tries to escape using the back button.
// The most sensible solution would be to quit the entire EPostcard flow once the picture is sent.
camera = Camera.open();
} catch(Exception e) {
finish();
return;
}
//Surface.setOrientation(Display.DEFAULT_DISPLAY,Surface.ROTATION_90);
Parameters p = camera.getParameters();
p.setPictureSize(IMAGE_WIDTH, IMAGE_HEIGHT);
camera.getParameters().setRotation(90);
Camera.Size s = p.getSupportedPreviewSizes().get(0);
p.setPreviewSize(s.width, s.height);
p.setPictureFormat(PixelFormat.JPEG);
p.set("flash-mode", "auto");
camera.setParameters(p);
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (Throwable ignored) {
Log.e(APP, "set preview error.", ignored);
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (isPreviewRunning) {
camera.stopPreview();
}
try {
camera.startPreview();
} catch(Exception e) {
Log.d(APP, "Cannot start preview", e);
}
isPreviewRunning = true;
}
public void surfaceDestroyed(SurfaceHolder arg0) {
if(isPreviewRunning && camera != null) {
if(camera!=null) {
camera.stopPreview();
camera.release();
camera = null;
}
isPreviewRunning = false;
}
}
}
Mathias Lin ...你能帮我关于http://*.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk 2014-11-04 05:49:12
你在哪里实现了完成方法(在catch块中)以及它做了什么? – 2016-05-31 10:37:44
你是否在AndroidManifest.xml中有这个集合?
uses-permission android:name="android.permission.CAMERA"
我看你已经设置你的预览区域设置为800 x 480的在纵向模式下,这个尺寸是无效的,并可能有这使得它崩溃API中的错误。
尝试设置的200×200
有在平台上的一些并发问题:http://code.google.com/p/android/issues/detail?id=6201
解决办法是释放凸轮之前清除回调,这是我会建议以下清理代码:
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCam != null) {
mCam.stopPreview();
mCam.setPreviewCallback(null);
mCam.release();
mCam = null;
}
}
我想你的问题是,当你旋转相机时,它不能正确释放或根本不释放。如果您从landscape
切换到portrait
,则该意向会再次启动。如果相机未被释放并重新打开,请尝试打开已打开的相机,该相机会引发错误。
而不是使用:
<uses-permission
android:name="android.permission.FLASHLIGHT"/>
尝试使用:
<uses-permission
android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal" />
,不要忘记添加的权限相机:
<uses-permission android:name="android.permission.CAMERA" />
它似乎帮助我在Nexus 7(Android 5.0)上。额外的'group'和'level'线的含义是什么? – 2014-12-26 13:17:53
如果您使用的是Android仿真器,另一种可能是前后摄像头在Android虚拟设备设置中定义为“无”。
你在使用什么设备以及SDK版本是什么? Afaik相机预览只能在横向模式下正常工作,但在纵向模式下正常工作。我也想用肖像模式(在N1上,在三星Galaxy S上)使用它,但没有成功。另请参阅http://code.google.com/p/android/issues/detail?id=1193上的错误跟踪器;虽然我从来没有像你上面提到的错误。 – 2010-08-01 14:45:51
我使用的是Nexus One 2.2 – Skizit 2010-08-01 16:47:57
您是否有其他设备进行测试?它在模拟器中工作吗?如果它是一个小apk,我可以帮你在我的N1和Galaxy S上测试它。你的2.2是最后的2.2 FRF91? – 2010-08-03 11:24:31