简体   繁体   中英

When switching between two activities with camera in them: “Unfortunately app has stopped”

So my MainActivity has the Camera going and on top of it there's a button. When the button is pushed it should lead to TheGuy.java where the camera should be also working.

When the button is pushed, I get the "Unfortunately app has stopped" on my Lenovo A319 phone (Android 4.4.2).

The Manifest is set.

That's the code of the MainActivity:

package com.example.freewaresys.theguy2;

import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import java.io.IOException;


public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    android.hardware.Camera camera;
    SurfaceView camView;
    SurfaceHolder surfaceHolder;

    @Override
    public void onWindowFocusChanged(boolean hasFocus)
    {
        super.onWindowFocusChanged(hasFocus);
        View decorView = getWindow().getDecorView();
        if (hasFocus) {
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        camView = (SurfaceView) findViewById(R.id.camerapreview);
        surfaceHolder = camView.getHolder();
        surfaceHolder.addCallback((SurfaceHolder.Callback) this);

    }


    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        camera = android.hardware.Camera.open();
        camera.setDisplayOrientation(90);

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        if (camera != null) {
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        camera.stopPreview();
        camera.release();
        camera = null;

    }

    public void TheGuy(View view) {
        Intent intent = new Intent(MainActivity.this, TheGuy.class);
        startActivity(intent);
        camera.setPreviewCallback(null);
        camera.stopPreview();


    }

}

And this is the targeted TheGuy.java

package com.example.freewaresys.theguy2;


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.io.IOException;



public class TheGuy extends AppCompatActivity implements SurfaceHolder.Callback {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.the_guy);

        camView = (SurfaceView) findViewById(R.id.camerapreviewguy);
        surfaceHolder = camView.getHolder();
        surfaceHolder.addCallback(this);

    }

    public TheGuy() {

    }

    android.hardware.Camera camera;
    SurfaceView camView;
    SurfaceHolder surfaceHolder;


    @Override
    public void onWindowFocusChanged(boolean hasFocus)
    {
        super.onWindowFocusChanged(hasFocus);
        View decorView = getWindow().getDecorView();
        if (hasFocus) {
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        }
    }



    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        camera = android.hardware.Camera.open();
        camera.setDisplayOrientation(90);

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
        if (camera != null) {
            try {
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        camera.stopPreview();
        camera.release();
    }

}

I have an openCV class and when I make it so the button leads to it, the app works fine. Here's the code just in case:

package com.example.freewaresys.theguy2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class cvCamera extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {



    JavaCameraView javaCameraView;
    Mat mRgba, imgGray, imgCanny;



    BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case BaseLoaderCallback.SUCCESS: {
                    javaCameraView.enableView();
                    break;
                }
                default: {
                    super.onManagerConnected(status);
                    break;
                }

            }
            super.onManagerConnected(status);
        }
    };


    @Override
    public void onWindowFocusChanged(boolean hasFocus)
    {
        super.onWindowFocusChanged(hasFocus);
        View decorView = getWindow().getDecorView();
        if (hasFocus) {
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cvcamera_layout);

        javaCameraView = (JavaCameraView) findViewById(R.id.java_camera_view);
        javaCameraView.setVisibility(SurfaceView.VISIBLE);
        javaCameraView.setCvCameraViewListener(this);

    }

    @Override
    protected void onPause(){
        super.onPause();
        if (javaCameraView!=null)
            javaCameraView.disableView();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (javaCameraView!=null)
            javaCameraView.disableView();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (OpenCVLoader.initDebug()){
            mLoaderCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }

        else{
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_2_0, this, mLoaderCallBack);
        }
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        mRgba = new Mat(width, height, CvType.CV_8UC4);
        imgGray = new Mat(width, height, CvType.CV_8UC1);
        imgCanny = new Mat(width, height, CvType.CV_8UC1);


    }

    @Override
    public void onCameraViewStopped() {
        mRgba.release();

    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        mRgba = inputFrame.rgba();

        Imgproc.cvtColor(mRgba, imgGray, Imgproc.COLOR_RGB2GRAY);
        Imgproc.Canny(imgGray, imgCanny, 80, 255);

        return imgCanny;
    }

}

EDIT: LogCat prints too much lines. I made it show only Errors and now I'm copying the top part of the log. Hope this is sufficient:

08-16 21:06:16.555 1574-1574/com.example.freewaresys.theguy2 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                               Process: com.example.freewaresys.theguy2, PID: 1574
                                                                               java.lang.RuntimeException: Fail to connect to camera service
                                                                                   at android.hardware.Camera.native_setup(Native Method)
                                                                                   at android.hardware.Camera.<init>(Camera.java:469)
                                                                                   at android.hardware.Camera.open(Camera.java:442)
                                                                                   at com.example.freewaresys.theguy2.TheGuy.surfaceCreated(TheGuy.java:54)
                                                                                   at android.view.SurfaceView.updateWindow(SurfaceView.java:637)
                                                                                   at android.view.SurfaceView.access$000(SurfaceView.java:90)
                                                                                   at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:193)
                                                                                   at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)
                                                                                   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2343)
                                                                                   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
                                                                                   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6420)
                                                                                   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
                                                                                   at android.view.Choreographer.doCallbacks(Choreographer.java:591)
                                                                                   at android.view.Choreographer.doFrame(Choreographer.java:560)
                                                                                   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
                                                                                   at android.os.Handler.handleCallback(Handler.java:808)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                                   at android.os.Looper.loop(Looper.java:193)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5299)
                                                                                   at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
                                                                                   at dalvik.system.NativeStart.main(Native Method)

Ok, so I removed the camera from MainActivity, now there's only the button. And I AsynkTask the camera in TheGuy like this (everything works):

public class TheGuy extends AppCompatActivity implements SurfaceHolder.Callback  {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.the_guy);

        camView = (SurfaceView) findViewById(R.id.camerapreviewguy);
        surfaceHolder = camView.getHolder();
        surfaceHolder.addCallback(this);
    }

//    public TheGuy() {
//
//    }


    Camera camera = null;
    SurfaceView camView;
    SurfaceHolder surfaceHolder;

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        View decorView = getWindow().getDecorView();
        if (hasFocus) {
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        }
    }


    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        new ShowCameraTask().execute();
        camera.setDisplayOrientation(90);
    }

    private class ShowCameraTask extends AsyncTask<Object, Object, Camera> {

        @Override
        protected Camera doInBackground(Object... params) {

            if (camera != null) {
                try {
                    camera.setPreviewDisplay(surfaceHolder);
                    camera.startPreview();

                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                camera = Camera.open();
            }
            return camera;
        }
    }


    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

        new ShowCameraTask().execute();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        camera.stopPreview();
        camera.release();

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM