【问题标题】:Android zxing : Camera shows black screen or freezes on calling Scanner fragment second timeAndroid zxing:第二次调用扫描仪片段时相机显示黑屏或冻结
【发布时间】:2017-06-19 19:23:31
【问题描述】:

我有一个“扫描片段”和“产品表单片段”。任务流程就像, Main Activity -> ScanFragment(按钮单击/扫描某些东西)--> 表单片段(按钮单击)--> ScanFragment(再次显示相同的片段)

如果 ScanFragment 只显示一次,效果很好。但是,当第二次调用时,扫描片段显示黑屏。如果在从 ScanFragment 移动到产品 Fragment 时停止相机,则它会冻结。我认为它的相机问题,但无法弄清楚如何解决这个问题。

ScanFragment onClick 方法:

private void onClickMethods(){
     btn_Skip.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            PrintLog.show("-- Skip Button is clicked ---");
            //releaseCamera(); -- if used, then shows camera but camera freezes
            ProductDetailFormFragment productDetailFormFragment  = new ProductDetailFormFragment();
            getActivity().getSupportFragmentManager().beginTransaction()
                    .add(R.id.mainFragment, productDetailFormFragment).addToBackStack(AppConstants.C_BACKSTACK_SCAN).commit();

    });
}

private void releaseCamera(){
// calls child fragment's camera releasing methods here
// if used camera shows freezed screen only
    SimpleScannerFragment simpleScannerFragment = (SimpleScannerFragment) getChildFragmentManager()
            .findFragmentById(R.id.scanner_fragment);
    simpleScannerFragment.releaseCamera();
}

SimpleScannerFragment(包含 zxing 代码)包含在 Scanlayout 中,如下所示:

<LinearLayout...... >
 .....
<fragment android:name="np.com.lins.serviceapp.UI.Modules.BarcodeScanner.SimpleScannerFragment"
    android:id="@+id/scanner_fragment"
    android:layout_weight="1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
....
</LinearLayout>

SimpleScannerFragment 代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mScannerView = new ZXingScannerView(getActivity());
    PrintLog.show("===  Scanner Fragment : before Return view ==");
    return mScannerView;
}

@Override
public void onResume() {
    super.onResume();
    PrintLog.show("Resume state===");
    mScannerView.setResultHandler(this);
    mScannerView.stopCamera();
    mScannerView.startCamera();
}

//called by parent ScanFragment
public void releaseCamera(){
    try{
        mScannerView.stopCameraPreview();
        mScannerView.stopCamera();
    }catch (Exception e){
        PrintLog.showException(TAG,"== exception while releasing camera resourc == ",e);
    }
}

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

ProductDetailFormFragment 代码:

    public void scanFromFragment() {
    ScanFragment scanFragment = new ScanFragment();
    Bundle bundle = new Bundle();
    bundle.putString(AppConstants.C_PARENT_FRAGMENT,AppConstants.C_FRAGMENT_PRODUCT_DETAILS);
    scanFragment.setArguments(bundle);
    getActivity().getSupportFragmentManager().beginTransaction()
            .add(R.id.mainFragment, scanFragment).addToBackStack(AppConstants.C_BACKSTACK_PRODUCT_DETAIL_FORM).commit();
    //IntentIntegrator.forSupportFragment(this).initiateScan();
}

【问题讨论】:

标签: android zxing


【解决方案1】:

尝试这样做可能对你有帮助

当你从主要活动中调用时

 private void callFragment(Fragment fragment, String tag) {
        FragmentTransaction transaction = this.getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.mainFragment, fragment, tag);
        transaction.commit();
    }

当您从同一个 Fragment (ScanFragment) 调用时,然后调用它并在此之前停止所有相机的其他操作

private void callScanFragment(String tag) {
    // Reload current fragment
    Fragment frg = null;
    frg = getSupportFragmentManager().findFragmentByTag(tag);
    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.detach(frg);
    ft.attach(frg);
    ft.commit();
}

【讨论】:

  • 不走运,兄弟,我以前也试过这个。就像在 fragmentTransaction 和附加、分离时使用替换而不是添加一样。我重试并没有工作。感谢兄弟的帮助:)
  • .addToBackStack(AppConstants.C_BACKSTACK_PRODUCT_DETAIL_FORM) 它会复制将出现在堆栈中的片段,所以如果不保持这一行可能会帮助你兄弟。
  • 但我需要这条线,因为我也必须跟踪以前的片段。如果我删除该行,我必须再次回忆以前的片段。
【解决方案2】:

我使用了我在 Github 上找到的这个 gradle compile,效率极高,效果很好

compile 'com.edwardvanraak:MaterialBarcodeScanner:0.0.6-ALPHA'

那么开始扫描并获取值的代码是这样的:

Barcode barcodeResult;
TextView result;

private void startScan() {
    /**
     * Build a new MaterialBarcodeScanner
     */
    result = (TextView)findViewById(R.id.result);

    final MaterialBarcodeScanner materialBarcodeScanner = new MaterialBarcodeScannerBuilder()
            .withActivity(MainActivity.this)
            .withEnableAutoFocus(true)
            .withBleepEnabled(true)
            .withBackfacingCamera()
            .withText("Scanning...")
            .withResultListener(new MaterialBarcodeScanner.OnResultListener() {
                @Override
                public void onResult(Barcode barcode)
                {
                    barcodeResult = barcode;
                    result.setText(barcode.rawValue);
                }
            })
            .build();
    materialBarcodeScanner.startScan();
}

希望对你有帮助

【讨论】:

  • 我使用的库'zxing'也很好用兄弟。但是,问题是当从不同的 Fragment 调用它时,相机会冻结或显示黑屏。我认为您缺少问题的详细信息。无论如何,谢谢你的帮助:)
  • 好的,没问题,对不起,我没有更多帮助。祝你好运
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 2016-08-21
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2022-10-21
相关资源
最近更新 更多