在onResume的Andr​​oid摄像头API的应用程序崩溃 [英] Android camera API app crashes at onResume

查看:277
本文介绍了在onResume的Andr​​oid摄像头API的应用程序崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的摄像头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是空的的著名的Andr​​oid应用程序的例子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的Andr​​oid摄像头API的应用程序崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆