按下主页按钮时关闭时相机应用程序崩溃

时间:2013-10-04 06:06:26

标签: android crash camera onpause

在我的相机应用程序中,当我按下主页按钮时,它会显示该消息 “不幸的是,测试(myappname)已停止”。我一直在寻找一段时间,但永远不能摆脱这个错误。感谢任何帮助,我已经坚持了很长一段时间:(。如果我错过任何东西只是问。谢谢

public class MainActivity extends Activity implements OnInitListener, OnUtteranceCompletedListener{

private Camera myCamera;
private MyCameraSurfaceView myCameraSurfaceView;

Button myButton;
Button speakButton;
boolean recording;

Button Speak;
TextView TextBox;
private TextToSpeech mTts;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}


Button.OnClickListener speakButtonOnClickListener = new Button.OnClickListener() {
    @Override
    public void onClick(View v) {
        //when Button Speak is clicked
        //grab text from the EditText Speech
        String TALK = TextBox.getText().toString(); //Talk now has text from EditText
        mTts.speak(TALK, TextToSpeech.QUEUE_ADD, null);
    }};

Button.OnClickListener myButtonOnClickListener
        = new Button.OnClickListener(){

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if(recording){
            // stop recording and release camera
            myButton.setText("START");
            recording = false;
        }else{
            recording = true;
            myButton.setText("STOP");
        }
    }};

private Camera getCameraInstance(){
// TODO Auto-generated method stub
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
        c.setDisplayOrientation(90);
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }
    return c; // returns null if camera is unavailable
}

@Override
protected void onPause() {
    super.onPause();
    releaseCamera();
                  // release the camera immediately on pause event
}

@Override
protected void onResume() {
    super.onResume();

    if (myCamera == null) {
        getWindow().setFormat(PixelFormat.UNKNOWN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        recording = false;
        setContentView(R.layout.activity_main);

        Speak = (Button)this.findViewById(R.id.button1);
        TextBox = (TextView)this.findViewById(R.id.textView1);
        //initialise TTS
        mTts= new TextToSpeech(this, this);

        //Get Camera for preview
        myCamera = getCameraInstance();
        if(myCamera == null){
            Toast.makeText(MainActivity.this,
                    "Fail to get Camera",
                    Toast.LENGTH_LONG).show();
        }


        myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
        FrameLayout myCameraPreview = (FrameLayout)findViewById(R.id.videoview);
        myCameraPreview.addView(myCameraSurfaceView);


        speakButton = (Button) findViewById(R.id.button1);
        speakButton.setOnClickListener(speakButtonOnClickListener);
    }
}

@Override
protected void onStop() {
    super.onStop();
    // release the camera immediately on pause event
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // release the camera immediately on pause event
    releaseCamera();

}


private void releaseCamera(){
    if (myCamera != null){
        myCamera.stopPreview();
        myCamera.release();        // release the camera for other applications
        myCamera = null;
        myCamera.setPreviewCallback(null);
    }
}

@SuppressWarnings("deprecation")
@Override
public void onInit(int status) {
    mTts.setOnUtteranceCompletedListener(this);
}

@Override
public void onUtteranceCompleted(String utteranceId) {
    mTts.shutdown();
}
}

logcat的

10-04 16:00:23.330: E/AndroidRuntime(2871): FATAL EXCEPTION: main
10-04 16:00:23.330: E/AndroidRuntime(2871): java.lang.RuntimeException: Unable to pause     activity {com.example.test/com.example.test.MainActivity}: java.lang.NullPointerException
10-04 16:00:23.330: E/AndroidRuntime(2871):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3064)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3019)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2997)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at android.app.ActivityThread.access$800(ActivityThread.java:141)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1267)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at     android.os.Handler.dispatchMessage(Handler.java:99)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at android.os.Looper.loop(Looper.java:137)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at java.lang.reflect.Method.invokeNative(Native Method)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at java.lang.reflect.Method.invoke(Method.java:525)
10-04 16:00:23.330: E/AndroidRuntime(2871):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)

2 个答案:

答案 0 :(得分:0)

试试这个 -

  @Override
    protected void onPause() {
        super.onPause();
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

答案 1 :(得分:0)

错误在releaseCamera方法中:

private void releaseCamera(){
    if (myCamera != null){
        myCamera.stopPreview();
        myCamera.release();        // release the camera for other applications
        myCamera = null;
        myCamera.setPreviewCallback(null);
    }
}

你在null上调用setPreviewCallback。

解决方案:将myCamera.setPreviewCallback(null);移至顶部。