Java 当设备方向更改时,Qr扫描应用程序正在崩溃

Java 当设备方向更改时,Qr扫描应用程序正在崩溃,java,android,Java,Android,我用android做了一个基本的二维码扫描器,但在扫描二维码时将设备旋转到横向模式,然后再次旋转到纵向模式后,它崩溃了。 还请简要说明问题的原因。我需要释放一些资源吗。我是个初学者 package com.example.android.qrking; import android.app.Activity; import android.support.v7.app.AlertDialog; import android.os.Bundle; import android.util.Log;

我用android做了一个基本的二维码扫描器,但在扫描二维码时将设备旋转到横向模式,然后再次旋转到纵向模式后,它崩溃了。 还请简要说明问题的原因。我需要释放一些资源吗。我是个初学者

package com.example.android.qrking;

import android.app.Activity;
import android.support.v7.app.AlertDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.google.zxing.Result;
import me.dm7.barcodescanner.zxing.ZXingScannerView;

public class MainActivity extends Activity implements ZXingScannerView.ResultHandler{
    private  ZXingScannerView mScannerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View v){
        mScannerView = new ZXingScannerView(this);
        setContentView(mScannerView);
        mScannerView.setResultHandler(this);
        mScannerView.startCamera();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mScannerView.stopCamera();
    }

    @Override
    public void handleResult(Result result){
        Log.v("handler result", result.getText());
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("scan results");
        builder.setMessage(result.getText());
        AlertDialog alertDialog = builder.create();
        alertDialog.show();
        //uncomment to scan again
        mScannerView.resumeCameraPreview(this);
    }
}
Logcat详细信息

03-09 21:18:24.460 10365-10365/com.example.android.qrking W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x419bac98)
03-09 21:18:24.461 10365-10365/com.example.android.qrking W/dalvikvm: threadid=1: uncaught exception occurred
03-09 21:18:24.461 10365-10365/com.example.android.qrking W/System.err: java.lang.RuntimeException: Unable to pause activity {com.example.android.qrking/com.example.android.qrking.MainActivity}: java.lang.NullPointerException
03-09 21:18:24.464 10365-10365/com.example.android.qrking W/System.err:     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3242)
03-09 21:18:24.464 10365-10365/com.example.android.qrking W/System.err:     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3193)
03-09 21:18:24.464 10365-10365/com.example.android.qrking W/System.err:     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3899)
03-09 21:18:24.464 10365-10365/com.example.android.qrking W/System.err:     at android.app.ActivityThread.access$900(ActivityThread.java:151)
03-09 21:18:24.464 10365-10365/com.example.android.qrking W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327)
03-09 21:18:24.464 10365-10365/com.example.android.qrking W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:110)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err:     at android.os.Looper.loop(Looper.java:193)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5292)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err:     at java.lang.reflect.Method.invoke(Method.java:515)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err:     at dalvik.system.NativeStart.main(Native Method)
03-09 21:18:24.465 10365-10365/com.example.android.qrking W/System.err: Caused by: java.lang.NullPointerException
03-09 21:18:24.466 10365-10365/com.example.android.qrking W/System.err:     at com.example.android.qrking.MainActivity.onPause(MainActivity.java:29)
03-09 21:18:24.466 10365-10365/com.example.android.qrking W/System.err:     at android.app.Activity.performPause(Activity.java:5368)
03-09 21:18:24.466 10365-10365/com.example.android.qrking W/System.err:     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1239)
03-09 21:18:24.466 10365-10365/com.example.android.qrking W/System.err:     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3224)
03-09 21:18:24.466 10365-10365/com.example.android.qrking W/System.err:     ... 12 more
03-09 21:18:24.466 10365-10365/com.example.android.qrking W/dalvikvm: threadid=1: calling UncaughtExceptionHandler
03-09 21:18:24.469 10365-10365/com.example.android.qrking E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.qrking, PID: 10365
java.lang.RuntimeException: Unable to pause activity {com.example.android.qrking/com.example.android.qrking.MainActivity}: java.lang.NullPointerException
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3242)
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3193)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3899)
    at android.app.ActivityThread.access$900(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327)
    at android.os.Handler.dispatchMessage(Handler.java:110)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5292)
    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:824)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
    at com.example.android.qrking.MainActivity.onPause(MainActivity.java:29)
    at android.app.Activity.performPause(Activity.java:5368)
    at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1239)
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3224)
    at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3193) 
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3899) 
    at android.app.ActivityThread.access$900(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1327) 
    at android.os.Handler.dispatchMessage(Handler.java:110) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:5292) 
    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:824) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
    at dalvik.system.NativeStart.main(Native Method) 
03-09 21:18:30.246 10365-10365/com.example.android.qrking I/Process: Sending signal. PID: 10365 SIG: 9

默认情况下,更改方向时,您的活动将重新启动,这可能导致崩溃

将其添加到manifest.xml文件中:

    android:configChanges="keyboardHidden|orientation|screenSize"

要停止活动,请每次重新启动

最初屏幕处于
纵向模式

步骤1:单击按钮,初始化
mScannerView
对象

步骤2:根据您已覆盖的
水平旋转手机
onPause()
,这样摄像头将
停止
使用
停止摄像头()
和您的
肖像
活动将被销毁,现在您新创建的
水平活动
将具有
mScannerView
null

步骤3:再次将设备旋转至
纵向模式

现在,您的
水平
活动再次进入
暂停
状态,并且
mScannerView
对象为
null
因此
mScannerView.stopCamera()
将导致调用
null
对象上的函数的异常,从而导致崩溃

因此,解决方案在
onCreate
中初始化您的视图,因为
onCreate
将在重新创建活动后执行


解决方案:移动
mScannerView=new ZXingScannerView(此)
inside
onCreate

发布应用程序崩溃时打印的Logcat错误这是Logcat错误:-move
mScannerView=new ZXingScannerView(此)内部
onCreate
放置mScannerView=new ZXingScannerView(此);内部onCreate解决了崩溃问题。先生,你能解释一下它是怎么工作的吗?谢谢@PavneetSinghadding android:configChanges=“keyboardHidden | orientation | screenSize”以显示可防止应用程序崩溃,但每次旋转设备时窗口大小都会减小。