Android相机应用程序在关闭时崩溃

时间:2016-08-23 11:54:38

标签: android

我写了一个相机应用程序。它在“onCreate”中创建了一个无限循环,每秒拍摄一张照片:

    Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            camera.takePicture(null, null, mPicture);
            mHandler.postDelayed(this, 1000);
        }
    };
    mHandler.postDelayed(mRunnable,1000);

之后它运行基于caffe的分类器。但是,当我在某个时候退出应用程序时,我总是会收到错误消息:

"App has been stopped"

同时我在Android Monitor中收到以下错误消息:

E/AndroidRuntime: FATAL EXCEPTION: main
             Process: com.myUsername.myAppName, PID: 25490
             java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.takePicture(android.hardware.Camera$ShutterCallback, android.hardware.Camera$PictureCallback, android.hardware.Camera$PictureCallback)' on a null object reference
                 at com.myUsername.myAppName.MainActivity$1.run(MainActivity.java:178)
                 at android.os.Handler.handleCallback(Handler.java:746)
                 at android.os.Handler.dispatchMessage(Handler.java:95)
                 at android.os.Looper.loop(Looper.java:135)
                 at android.app.ActivityThread.main(ActivityThread.java:5343)
                 at java.lang.reflect.Method.invoke(Native Method)
                 at java.lang.reflect.Method.invoke(Method.java:372)
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)

有谁知道如何避免此错误?在完成结束无限循环的应用程序或明确关闭以预览模式运行的相机时,是否需要调用一些特殊功能?

4 个答案:

答案 0 :(得分:1)

关闭活动后必须停止循环。例如:

 $newArray=array();
 foreach($x as $key=>$value){
     if(!key_exists($key,$y))
     $newArray[$key]  =$value;
 }

//$newArray has what you need

答案 1 :(得分:0)

如果您使用自定义相机,则需要在离开活动前释放相机。所以在onDestroy()方法中调用camera.release()。

答案 2 :(得分:0)

你需要在app关闭之前停止runnable(可能在你的onBackPressed()方法中),因为runnable在摄像机为空后执行takePicture。

答案 3 :(得分:0)

您可以像这样检查无效:

 Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            if(camera!=null)
              camera.takePicture(null, null, mPicture);
            mHandler.postDelayed(this, 1000);
        }
    };
    mHandler.postDelayed(mRunnable,1000);