在onResume的Android摄像头API的应用程序崩溃 [英] Android camera API app crashes at onResume
问题描述
我使用的摄像头API编写的应用程序:显示preVIEW,并拍照。
第一个版本的作品非常好。
在课堂上preVIEW延伸SurfaceView实现SurfaceHolder.Callback
公共无效surfaceCreated(SurfaceHolder持有人){
//表面有被创建,获取摄像机,并告诉它在哪里
//绘制。
相机= Camera.open();
尝试{
camera.set previewDisplay(支架);
camera.start preVIEW(); }赶上(IOException异常五){
e.printStackTrace();
} hasSurface = TRUE;
}
公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释W,INT高){
//它将被surfaceCreated后立即调用
//我移动将继续进行。
setCamera previewParameters(); camera.start preVIEW();}
在主要活动:
公共类CameraDemo扩展活动
我还设置一员:
CameraUnit UI;
它是:
公共类CameraUnit扩展的LinearLayout
在OnCreate,
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState); UI =新CameraUnit(本);
的setContentView((查看)用户界面); Log.d(TAGonCreate'd);
}
它创建的LinearLayout对象,其中包含了surfaceView和拍照键。
在onResume是:
@覆盖
保护无效onResume(){
super.onResume();
}
虽然它的作品,我觉得onResume不能为空。我也看到了surfaceCreated和surfaceChanged是空的的著名的Android应用程序的例子OCRTest
所以,我相信这是更好,也是可行的在surfaceCreated和surfaceChanged命令移动到onResume。
我觉得对于我的应用程序应该是第一个版本的流动聊天:
主要活动的onCreate(其中的LinearLayout和surfaceView,拍照键创建)
surfaceCreated和surfaceChanged被称为,
onResume。
所以,我可以简单地移动中的命令surfaceCreated和surfaceChanged到onResume。
但是,这是行不通的!
我用调试找出表面为空。我觉得surfaceCreatd不叫。我的应用程序是不同的OCRTest,这在主要活动实现SurfaceHolder.Callback。我在SurfaceView实施SurfaceHolder.Callback:
类preVIEW延伸SurfaceView实现SurfaceHolder.Callback
于是我在onResume添加其他两行
UI preview.surfaceCreated。(UI preview.mHolder);
。UI preview.surfaceChanged(UI preview.mHolder,0,800,400);
我随意设定的最后三个整数参数。当我开始活动,在Android手机错误窗口弹出。
它说:产生的原因:了java.lang.RuntimeException:无法连接到相机的服务。
但如何解决它????
非常感谢!
错误是:
01-07 00:27:57.173:W / dalvikvm(11625):主题ID = 1:螺纹未捕获的异常退出(组= 0x4001d5a0)
01-07 00:27:57.173:E / AndroidRuntime(11625):致命异常:主要
01-07 00:27:57.173:E / AndroidRuntime(11625):了java.lang.RuntimeException:无法恢复活动{com。示例/ com.example.CameraDemo}了java.lang.RuntimeException:无法连接到相机服务
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2460)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2481)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1847)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.ActivityThread.access $ 1500(ActivityThread.java:132)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1038)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.os.Handler.dispatchMessage(Handler.java:99)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.os.Looper.loop(Looper.java:150)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.ActivityThread.main(ActivityThread.java:4263)
01-07 00:27:57.173:E / AndroidRuntime(11625):在java.lang.reflect.Method.invokeNative(本机方法)
01-07 00:27:57.173:E / AndroidRuntime(11625):在java.lang.reflect.Method.invoke(Method.java:507)
01-07 00:27:57.173:E / AndroidRuntime(11625):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
01-07 00:27:57.173:E / AndroidRuntime(11625):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-07 00:27:57.173:E / AndroidRuntime(11625):在dalvik.system.NativeStart.main(本机方法)
01-07 00:27:57.173:E / AndroidRuntime(11625):了java.lang.RuntimeException:产生的原因无法连接到相机服务
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.hardware.Camera.native_setup(本机方法)
。01-07 00:27:57.173:E / AndroidRuntime(11625):在android.hardware.Camera<&初始化GT;(Camera.java:265)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.hardware.Camera.open(Camera.java:241)
01-07 00:27:57.173:E / AndroidRuntime(11625):在com。示例preview.surfaceCreated(preview.java:60)。
01-07 00:27:57.173:E / AndroidRuntime(11625):在com.example.CameraDemo.onResume(CameraDemo.java:64)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1242)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.Activity.performResume(Activity.java:3904)
01-07 00:27:57.173:E / AndroidRuntime(11625):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2450)
01-07 00:27:57.173:E / AndroidRuntime(11625):... 12多
01-07 00:27:59.455:I /流程(11625):发送信号。 PID:11625 SIG:9
您得到这个
了java.lang.RuntimeException:无法连接到相机服务
异常,当正在使用的其他应用程序的相机。但我相信,其他的应用程序是应用程序本身。你必须释放相机。
这是你应该释放相机的情况:
在preVIEW类:
公共无效surfaceDestroyed(SurfaceHolder持有人){ //空。参加你的活动释放相机preVIEW照顾。
如果(mCamera!= NULL){
mCamera.release();
}
}
在活动:
@覆盖
公共无效onBack pressed(){
super.onBack pressed();
如果(myCamera!= NULL){
myCamera.release();
}
完();
}@覆盖
保护无效的onPause(){
// TODO自动生成方法存根
super.onPause();
如果(myCamera!= NULL){
myCamera.release();
}
}
还有上的取消点击,然后还当你使用相机结束后即..,当图像被捕获,你回来了活动。
另外试试这个:
公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释W,INT高){ 如果(mHolder.getSurface()== NULL){
返回;
} 尝试{
mCamera.stop preVIEW();
}赶上(例外五){
//你可以忽略这一点,因为这意味着preVIEW不存在
//所以,没有必要尝试停止
} 尝试{
mCamera.set previewDisplay(mHolder);
mCamera.start preVIEW();
}赶上(例外五){
//捕捉这个
}
}
I am using camera API to write an app: show preview, and take a photo. The first version works very well. In class Preview extends SurfaceView implements SurfaceHolder.Callback
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
hasSurface = true;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// It will be called immediately after surfaceCreated
// I move it to Resume.
setCameraPreviewParameters();
camera.startPreview();
}
In the main activity:
public class CameraDemo extends Activity
I also set a member: CameraUnit ui; It is:
public class CameraUnit extends LinearLayout
In the onCreate,
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ui = new CameraUnit(this);
setContentView((View) ui);
Log.d(TAG, "onCreate'd");
}
it create a LinearLayout object, which contains the surfaceView, and a camera button.
The onResume is:
@Override
protected void onResume() {
super.onResume();
}
Although it works, I think the onResume shouldn't be empty. I also see the surfaceCreated and surfaceChanged are empty in a famous Android app example OCRTest So I believe it is better and also feasible to move the commands in surfaceCreated and surfaceChanged to onResume.
I think the flow chat for the 1st Version of my app should be: Main activity onCreate (where the LinearLayout and its surfaceView, camera button are created), surfaceCreated and surfaceChanged are called, onResume.
So I may simply move the commands in surfaceCreated and surfaceChanged to onResume. But it doesn't work! I used Debug to find out the surface is null. I think the surfaceCreatd is not called. My app is different OCRTest, which implements SurfaceHolder.Callback in the main activity. I implement SurfaceHolder.Callback in the SurfaceView:
class Preview extends SurfaceView implements SurfaceHolder.Callback
So I add two other lines in onResume
ui.preview.surfaceCreated(ui.preview.mHolder);
ui.preview.surfaceChanged(ui.preview.mHolder, 0, 800, 400);
I randomly set the last three integer arguments. When I start the activity, the error window in Android phone pops out. It says "Caused by: java.lang.RuntimeException: Fail to connect to camera service". But how to fix it???? Thanks a lot!
Errors are:
01-07 00:27:57.173: W/dalvikvm(11625): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
01-07 00:27:57.173: E/AndroidRuntime(11625): FATAL EXCEPTION: main
01-07 00:27:57.173: E/AndroidRuntime(11625): java.lang.RuntimeException: Unable to resume activity {com.example/com.example.CameraDemo}: java.lang.RuntimeException: Fail to connect to camera service
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2460)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2481)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1847)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.access$1500(ActivityThread.java:132)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Handler.dispatchMessage(Handler.java:99)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.os.Looper.loop(Looper.java:150)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.main(ActivityThread.java:4263)
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invokeNative(Native Method)
01-07 00:27:57.173: E/AndroidRuntime(11625): at java.lang.reflect.Method.invoke(Method.java:507)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-07 00:27:57.173: E/AndroidRuntime(11625): at dalvik.system.NativeStart.main(Native Method)
01-07 00:27:57.173: E/AndroidRuntime(11625): Caused by: java.lang.RuntimeException: Fail to connect to camera service
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.native_setup(Native Method)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.<init>(Camera.java:265)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.hardware.Camera.open(Camera.java:241)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.Preview.surfaceCreated(Preview.java:60)
01-07 00:27:57.173: E/AndroidRuntime(11625): at com.example.CameraDemo.onResume(CameraDemo.java:64)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1242)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.Activity.performResume(Activity.java:3904)
01-07 00:27:57.173: E/AndroidRuntime(11625): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2450)
01-07 00:27:57.173: E/AndroidRuntime(11625): ... 12 more
01-07 00:27:59.455: I/Process(11625): Sending signal. PID: 11625 SIG: 9
You get this
java.lang.RuntimeException: Fail to connect to camera service
Exception, when the Camera is being used by other applications. But i believe that other application is your application itself. You have to release the Camera.
These are the cases where you should release the Camera:
In the Preview class:
public void surfaceDestroyed(SurfaceHolder holder) {
// empty. Take care of releasing the Camera preview in your activity.
if (mCamera != null) {
mCamera.release();
}
}
In the Activity:
@Override
public void onBackPressed() {
super.onBackPressed();
if (myCamera != null) {
myCamera.release();
}
finish();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (myCamera != null) {
myCamera.release();
}
}
Also on Cancel clicked, and also when you are finished using the Camera i.e.., when the Image is Captured and you come back to the Activity.
Also try this:
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
//You can ignore this, because this means the Preview doesn't Exist
//So, no need to try stopping
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
//Catch this
}
}
这篇关于在onResume的Android摄像头API的应用程序崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!