setPreviewDisplay导致活动在重新加载surfaceview时崩溃

时间:2017-10-28 20:39:22

标签: java android surfaceview

我有一个使用条形码扫描器将数据传递到下一个活动的应用程序。我已设法将数据传递到下一个活动,但当我返回条形码扫描仪时,应用程序崩溃。我认为这是因为它试图再次打开Surfaceview。

返回条形码扫描仪时如何继续使用surfaceview

****条形码扫描仪****

 public class BarcodeScannerNew extends AppCompatActivity {

    private Camera mCamera;
    private CameraPreview mPreview;
    private Handler autoFocusHandler;

    private Button scanButton;
    private ImageScanner scanner;

    private boolean barcodeScanned = false;
    private boolean previewing = true;

    static {
        System.loadLibrary("iconv");
    }




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

    initControls();
}



private void initControls() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    autoFocusHandler = new Handler();
    mCamera = getCameraInstance();

    // Instance barcode scanner
    scanner = new ImageScanner();
    scanner.setConfig(0, Config.X_DENSITY, 10);
    scanner.setConfig(0, Config.Y_DENSITY, 10);

    mPreview = new CameraPreview(BarcodeScannerNew.this, mCamera, previewCb,
            autoFocusCB);
    FrameLayout preview = (FrameLayout) findViewById(R.id.cameraPreview);
    preview.addView(mPreview);

    scanButton = (Button) findViewById(R.id.ScanButton);

    scanButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (barcodeScanned) {
                barcodeScanned = false;
                mCamera.setPreviewCallback(previewCb);
                mCamera.startPreview();
                previewing = true;
                mCamera.autoFocus(autoFocusCB);
            }
        }
    });
}


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        releaseCamera();
    }
    return super.onKeyDown(keyCode, event);

}


/**
 * A safe way to get an instance of the Camera object.
 */
public static Camera getCameraInstance() {
    Camera c = null;
    try {
        c = Camera.open();
    } catch (Exception e) {
    }
    return c;
}

private void releaseCamera() {
    if (mCamera != null) {
        previewing = false;
        mCamera.setPreviewCallback(null);
        mCamera.release();
        mCamera = null;
    }
}

private Runnable doAutoFocus = new Runnable() {
    public void run() {
        if (previewing)
            mCamera.autoFocus(autoFocusCB);
    }
};

Camera.PreviewCallback previewCb = new Camera.PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera camera) {
        Camera.Parameters parameters = camera.getParameters();
        Camera.Size size = parameters.getPreviewSize();

        Image barcode = new Image(size.width, size.height, "Y800");
        barcode.setData(data);

        int result = scanner.scanImage(barcode);

        if (result != 0) {
            previewing = false;

            mCamera.stopPreview();
            mCamera.setPreviewCallback(null);

            TextView labelScanResult = (TextView)findViewById(R.id.labelScanResult);

            SymbolSet syms = scanner.getResults();
            for (Symbol sym : syms) {

                Log.i("<<<<<<Asset Code>>>>> ",
                        "<<<<Bar Code>>> " + sym.getData());
                String scanResult = sym.getData().trim();

             // shows dialog   showAlertDialog(scanResult);
                labelScanResult.setText(scanResult);
              /*  Toast.makeText(BarcodeScanner.this, scanResult,
                        Toast.LENGTH_SHORT).show();*/

                Intent i = new Intent(BarcodeScannerNew.this, BarcodeScanner.class);
                i.putExtra("" , labelScanResult.getText().toString());
                startActivity(i);
                finish();
                barcodeScanned = true;

                break;
            }
        }
    }
};

// Mimic continuous auto-focusing
Camera.AutoFocusCallback autoFocusCB = new Camera.AutoFocusCallback() {
    public void onAutoFocus(boolean success, Camera camera) {
        autoFocusHandler.postDelayed(doAutoFocus, 1000);
    }
};


private void showAlertDialog(String message) {



    new AlertDialog.Builder(this)

            .setCancelable(false)
            .setMessage(message)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                }
            })

            .show();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_home, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.

    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    if (id == R.id.homebutton){
        startActivity(new Intent(this,MainActivity.class));

    }

    return super.onOptionsItemSelected(item);
}


}

相机活动

package com.example.dsouchon.myapplication;

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;


public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;
    private Camera.PreviewCallback previewCallback;
    private Camera.AutoFocusCallback autoFocusCallback;

    public CameraPreview(Context context, Camera camera,
                         Camera.PreviewCallback previewCb,
                         Camera.AutoFocusCallback autoFocusCb) {
        super(context);
        mCamera = camera;
        previewCallback = previewCb;
        autoFocusCallback = autoFocusCb;

        /*
         * Set camera to continuous focus if supported, otherwise use
         * software auto-focus. Only works for API level >=9.
         */
        /*
        Camera.Parameters parameters = camera.getParameters();
        for (String f : parameters.getSupportedFocusModes()) {
            if (f == Parameters.FOCUS_MODE_CONTINUOUS_PICTURE) {
                mCamera.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                autoFocusCallback = null;
                break;
            }
        }
        */

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);

        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {



        try {
            mCamera.setPreviewDisplay(holder);


        }



        catch (IOException e) {
            Log.d("DBG", "Error setting camera preview: " + e.getMessage());
        }
    }





    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 /*
         * If your preview can change or rotate, take care of those events here.
         * Make sure to stop the preview before resizing or reformatting it.
         */
        if (mHolder.getSurface() == null) {
            // preview surface does not exist
            return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e) {
            // ignore: tried to stop a non-existent preview
        }

        try {
            // Hard code camera surface rotation 90 degs to match Activity view in portrait
            mCamera.setDisplayOrientation(90);

            mCamera.setPreviewDisplay(mHolder);
            mCamera.setPreviewCallback(previewCallback);
            mCamera.startPreview();
            mCamera.autoFocus(autoFocusCallback);
        } catch (Exception e) {
            Log.d("DBG", "Error starting camera preview: " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
}

日志

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.hardware.Camera.setPreviewDisplay(android.view.SurfaceHolder)' on a null object reference
                  at com.example.dsouchon.myapplication.CameraPreview.surfaceCreated(CameraPreview.java:56)
                  at android.view.SurfaceView.updateWindow(SurfaceView.java:607)
                  at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:184)
                  at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:921)
                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2164)
                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191)
                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642)
                  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
                  at android.view.Choreographer.doCallbacks(Choreographer.java:590)
                  at android.view.Choreographer.doFrame(Choreographer.java:560)
                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:145)
                  at android.app.ActivityThread.main(ActivityThread.java:5951)
                  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:1400)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)

0 个答案:

没有答案