Java 无法连接到摄像头服务
我把相机设置为Java 无法连接到摄像头服务,java,android,Java,Android,我把相机设置为this.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向)可以正常工作,但如果我将其更改为纵向而不是横向,则它会崩溃,并出现以下错误 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): FATAL EXCEPTION: main 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): java.lang.RuntimeE
this.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u横向)
可以正常工作,但如果我将其更改为纵向
而不是横向
,则它会崩溃,并出现以下错误
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
它在mCamera=Camera.open()时崩溃代码>
我的清单文件有
如何解决此问题,以便在纵向视图中查看我的应用程序?您在AndroidManifest.xml中有此设置吗
uses-permission android:name="android.permission.CAMERA"
我看到您已将预览区域设置为800 x 480。在纵向模式下,此大小无效,API中可能存在导致其崩溃的错误
尝试将预览区域设置为200x200,以供参考,这是我在应用程序中使用的SurfaceHolderCallBack内部类,在Nexus One 2.2的纵向模式下工作良好-希望有帮助
编辑:“哪个有效”=“哪个不崩溃”。尽管我还没有弄清楚如何正确旋转预览图像(请参见上面我的第一条评论)。这就是为什么我实际上必须使用横向,并将围绕预览表面的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;
}
}
}
平台中存在一些并发问题:
解决方法是在释放cam之前清除回调,也就是说,我建议使用以下清理代码:
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCam != null) {
mCam.stopPreview();
mCam.setPreviewCallback(null);
mCam.release();
mCam = null;
}
}
我认为你的问题是,当你旋转相机时,它没有正确地释放,或者根本没有释放。如果从横向
切换到纵向
则再次启动意图。如果未释放并重新打开相机,则尝试打开已打开的相机,这会引发错误。而不是使用:
<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" />
尝试使用:
<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" />
并且不要忘记添加照相机的权限:
<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" />
如果您使用的是Android仿真器,另一种可能是前后摄像头在Android虚拟设备设置中被定义为“无”。这可能有效
@Override public void surfaceDestroyed(SurfaceHolder holder) {
Log.d("surfaceDestroyed", "");
cameraSource.stop(); //check if you have this line
}
您使用的是什么设备?SDK的版本是什么?Afaik相机预览仅在横向模式下正常工作,但在纵向模式下正常工作。我还想在肖像模式下使用它(在N1上,在三星Galaxy S上),但没有成功。另请参阅位于的bug跟踪器;虽然我从来没有遇到过像你上面提到的错误。你有其他设备来测试它吗?它在Emulator中工作吗?如果它是一个小apk,我可以帮助你在我的N1和Galaxy s上测试它。你的2.2是最终的2.2 FRF91?我在同一条线上面临着同样的问题。异常并不总是发生,但它有时会发生。有人能解释为什么它有时会崩溃,有时不总是。。。。。?我使用的是三星gt-s5360Skizit,关于我在上面的代码示例中尝试了800x480 previewSize,在NexusOne2.2上运行正常,你能帮我一下吗。事实上,800x480是在调用:p.getSupportedPreviewSizes().get(0);-因此它是一个正确的预览大小。是的,这并不能解决任何问题。它打破了我的设置参数。你必须找到最佳的预览大小得到所有大小的比较,并得到最大的一个,它将工作,100rabh。。。你能帮我谢谢你发这个帖子吗,即使很明显,这对一些搜索这个的人(比如我)来说是一个有用的提示。。。关于Kangur,你能帮我一下吗。。。你能帮我一下吗对不起,我已经三年没做过雄激素了。。不知道它现在是怎么工作的:)马蒂亚斯·林。。。你能帮我解释一下你在哪里使用了finish方法(在catch块中)以及它的作用吗?它似乎在nexus7(Android 5.0)上对我有所帮助。额外的组
和级别
行的含义是什么?