简体   繁体   English

Android zxing:相机显示黑屏或第二次调用Scanner片段时死机

[英]Android zxing : Camera shows black screen or freezes on calling Scanner fragment second time

I have a "Scan Fragment" & "Product Form fragment". 我有一个“扫描片段”和“产品表格片段”。 Task flow goes like, Main Activity -> ScanFragment (button click / scan something ) --> Form fragment (button click) --> ScanFragment (show same fragment again) 任务流程如下所示:Main Activity-> ScanFragment(单击按钮/扫描某物)-> Formfragment(单击按钮)-> ScanFragment(再次显示相同的片段)

It works well if ScanFragment is to be shown only one time. 如果ScanFragment仅显示一次,则效果很好。 But, when called for second time, Scan fragment shows black screen. 但是,当第二次调用时,“扫描”片段显示黑屏。 If stopped camera when moving to product Fragment from ScanFragment then, it freezes. 如果从ScanFragment移至product Fragment时停止了相机,则相机将冻结。 I think its camera problem, but couldn't figure out how to solve this. 我认为是相机问题,但无法解决该问题。

ScanFragment onClick method: 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 (containing zxing code) is included in Scanlayout as follows : SimplelaynerFragment(包含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 code : 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 code : 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();
}

try to do this may be it help you 尝试这样做可能会帮助您

When you are calling from main activity 当您从主要活动中拨打电话时

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

When you are calling from same Fragment (ScanFragment) then call this and do all camera stop n other stuff before this 当您从同一个片段(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();
}

I made use of this gradle compile I found on Github, extremely efficient and works brilliantly 我使用了在Github上找到的gradle编译器,效率极高,工作出色

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

Then the code to start the scan and get the value is as such: 然后,开始扫描并获取值的代码如下:

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();
}

I hope that this helps 我希望这个对你有用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM