在片段中,如何停止 ZXing Scanner 的摄像头?

Posted

技术标签:

【中文标题】在片段中,如何停止 ZXing Scanner 的摄像头?【英文标题】:In fragment, how to stop camera of ZXing Scanner? 【发布时间】:2016-12-04 12:48:03 【问题描述】:

按照本教程 (http://www.truiton.com/2015/06/android-tabs-example-fragments-viewpager/),我使用片段和 ViewPager 制作了 Android 选项卡。到目前为止,我向其中一个片段添加了一个 QR 码扫描仪(使用基于 ZXing 的 Barcode Scanner 库),并且工作正常。

问题是当我转到其他选项卡(片段)时,相机本身会在内部继续工作(内部相机不会停止)。因此,即使我在不​​同片段的屏幕上没有看到摄像头,但当我将手机(摄像头部分)靠近 QR 码时,它会读取它并开始新的活动。

那么当我转到其他片段时如何停止相机?

这是我的二维码扫描器的片段。

public class TabFragment1 extends Fragment implements ZXingScannerView.ResultHandler

   private ZXingScannerView mScannerView;
   private LinearLayout qrCameraLayout;

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
   
      View v = inflater.inflate(R.layout.tab_fragment_1, container, false);

      qrCameraLayout = (LinearLayout) v.findViewById(R.id.ll_qrcamera);
      mScannerView = new ZXingScannerView(getActivity().getApplicationContext());
      mScannerView.setLayoutParams(new LinearLayout.LayoutParams(
         LinearLayout.LayoutParams.MATCH_PARENT,
         LinearLayout.LayoutParams.MATCH_PARENT));
      qrCameraLayout.addView(mScannerView);

      List<BarcodeFormat> formats = new ArrayList<>();
      formats.add(BarcodeFormat.QR_CODE);
      mScannerView.setFormats(formats);

      return v;
   

   @Override
   public void onResume()
   
      super.onResume();
      mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.
      mScannerView.startCamera();          // Start camera on resume
   

   @Override
   public void onPause()
   
      super.onPause();
      mScannerView.stopCamera();
   

   @Override
   public void handleResult(final Result result)
   
      //handling results
   

【问题讨论】:

【参考方案1】:

我尝试了一些方法来解决这个问题,最终得到了解决方案。

public void handleResult(Result result) 
        //Hold result
        Log.e("handler", result.getText()); // Prints scan results
        Log.e("handler", result.getBarcodeFormat().toString()); // Prints the scan format (qrcode)
        mScannerView.removeAllViews(); //<- here remove all the views, it will make an Activity having no View
        mScannerView.stopCamera(); //<- then stop the camera
        setContentView(R.layout.activity_Main); //<- and set the View again.
        final String vString = result.getText();
        runOnUiThread(new Runnable() 
            @Override
            public void run() 
                Toast.makeText(mContext,vString,Toast.LENGTH_LONG).show();
            
        );
        // to resume scanning
        // mScannerView.resumeCameraPreview(this);<br />
    

再次设置ContentView解决了m的问题

【讨论】:

【参考方案2】:

试试这个代码,如果您仍然遇到任何问题,请告诉我

public class TabFragment1 extends Fragment implements ZXingScannerView.ResultHandler

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) 
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) 
            mScannerView.setResultHandler(this);
            mScannerView.startCamera();
        
        else if(mScannerView != null) 
            mScannerView.stopCamera();
        
    

【讨论】:

不幸的是我得到了 NullPointerException。 java.lang.NullPointerException: Attempt to invoke virtual method 'void me.dm7.barcodescanner.zxing.ZXingScannerView.stopCamera()' on a null object reference 有人知道原因吗?我正在使用 Activity 并在得到结果时调用了 stopCamera(),但 Camera 仍然打开。如何从相机视图返回? 在 startCamera() 附近放置一些日志并检查它被调用的次数或检查 stopCamera() 不应该抛出任何错误,我确定你的代码有问题【参考方案3】:

使用StartActivityForResult() 启动TabFragment1 Activity,然后处理结果并在onActivityResult() 中停止摄像头

【讨论】:

以上是关于在片段中,如何停止 ZXing Scanner 的摄像头?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过zxing-android-embedded在Android中停止连续扫描

在 zxing 片段库中打开/关闭手电筒

Zxing QR扫描仪onActivityResult未在片段中调用[重复]

Android zxing Journeyapps 条码扫描器内部片段

Android:更换片段时如何停止音乐?

如何在切换片段时停止 AsyncTask?