dm77条码扫描器Zbar相机片段预览延迟

时间:2018-08-24 05:37:08

标签: android android-fragments zbar

嗨,我正在使用this library作为我的android条形码阅读器,它可以很好地与活动配合使用,但是当与该片段一起使用时,它会给启动带来一些延迟(不像在活动中使用时那样平滑)解决方案。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_gravity="top"
        android:minHeight="?attr/actionBarSize"
        android:background="@color/actionbar_opacity"
        app:theme="@style/TransparentToolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <RelativeLayout
        android:id="@+id/btn_enable_qr"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginBottom="55dp"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:gravity="bottom"
        android:layout_alignParentBottom="true"
        android:clickable="true"
        android:layout_gravity="bottom"
        android:background="@drawable/circle_layout_for_start_scan">



    </RelativeLayout>
</RelativeLayout>

这是我的片段,当应用程序启动时,我将此片段设置为我的主要活动

public class ScannerFragment extends Fragment implements ZBarScannerView.ResultHandler {
    private ZBarScannerView mScannerView;
    private FrameLayout contentFrame;
    RelativeLayout enableQR;
    private static final int ZBAR_CAMERA_PERMISSION = 1;

    public static ScannerFragment newInstance() {
        return new ScannerFragment();
    }


    @SuppressLint("ClickableViewAccessibility")
    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = null;
        try {
            rootView = inflater.inflate(R.layout.activity_full_scanner, container, false);
            contentFrame = (FrameLayout) rootView.findViewById(R.id.content_frame);
            enableQR = (RelativeLayout) rootView.findViewById(R.id.btn_enable_qr);


            enableQR.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {

                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN: {
                            launchActivity();
                            break;
                        }
                        case MotionEvent.ACTION_UP: {
                            releaseCamera();
                        }
                    }
                    return true;
                }
            });
        } catch (Exception e) {
//            Log.e(TAG, "onCreateView: " + e.toString());
        }

        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();

    }

    public void launchActivity() {
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.CAMERA}, ZBAR_CAMERA_PERMISSION);
        } else {
            setUpQrScanner();
        }
    }

    public void setUpQrScanner() {
        mScannerView = new ZBarScannerView(getActivity());
        mScannerView.setFormats(BarcodeFormat.ALL_FORMATS);
        contentFrame.addView(mScannerView);
        mScannerView.setResultHandler(ScannerFragment.this);
        mScannerView.startCamera(-1);
        mScannerView.setAutoFocus(true);
    }

    public void releaseCamera() {
        mScannerView.stopCamera();
        contentFrame.removeView(mScannerView);
    }

    @Override
    public void handleResult(Result rawResult) {
        try {
            scannerSoundAndVibration();
        } catch (Exception e) {}
        Toast.makeText(getActivity(), "Result" + rawResult.getContents()+" TYPE: "+rawResult.getBarcodeFormat().getId(), Toast.LENGTH_LONG).show();
    }

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

    private void scannerSoundAndVibration() {
        /**
         * scanner sound alert time in millisecond
         */
        final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 200);
        tg.startTone(ToneGenerator.TONE_CDMA_KEYPAD_VOLUME_KEY_LITE);

        /**
         * scanner vibration alert time in millisecond
         */
        Vibrator v = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
        v.vibrate(250);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,  String permissions[], int[] grantResults) {
        switch (requestCode) {
            case ZBAR_CAMERA_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  setUpQrScanner();
                } else {
                    Toast.makeText(getActivity(), "Please grant camera permission to use the QR Scanner", Toast.LENGTH_SHORT).show();
                }
                return;
        }
    }
}

0 个答案:

没有答案