【问题标题】:How to ZXING Barcode Scanner not full screen only half screenZXING条码扫描仪如何不全屏只有半屏
【发布时间】:2017-05-14 12:43:00
【问题描述】:

我想创建应用程序 使用 ZXING 条码扫描器扫描条码

喜欢黑莓信使

这是我的代码“MainActivity.java

package com.example.ridwan.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import info.vividcode.android.zxing.CaptureActivity;
import info.vividcode.android.zxing.CaptureActivityIntents;

public class MainActivity extends AppCompatActivity  {

    private TextView tvScanResult;

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

        Intent captureIntent = new Intent(MainActivity.this, CaptureActivity.class);
        CaptureActivityIntents.setPromptMessage(captureIntent, "Barcode scanning...");
        startActivityForResult(captureIntent, 0);

        tvScanResult = (TextView) findViewById(R.id.tv_scanresult);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 0) {
            if (resultCode == Activity.RESULT_OK && data != null) {
                String value = data.getStringExtra("SCAN_RESULT");
                tvScanResult.setText(value);
            } else if (resultCode == Activity.RESULT_CANCELED) {
                tvScanResult.setText("Scanning Gagal, mohon coba lagi.");
            }
        } else {

        }
        super.onActivityResult(requestCode, resultCode, data);
    }


}

那么这是我的“activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.ridwan.myapplication.MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:layout_marginTop="50dp"
        android:id="@+id/tv_scanresult_title"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result Scan : " />

    <TextView
        android:layout_below="@id/tv_scanresult_title"
        android:id="@+id/tv_scanresult"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:textColor="#ff1493"
        android:layout_height="wrap_content"
        android:text="_" />

</RelativeLayout>

你能给我解决办法吗? 我想在片段中进行条形码。

【问题讨论】:

    标签: java android xml zxing barcode-scanner


    【解决方案1】:

    通过使用ZXing Android Embedded,我已经实现了您正在寻找的相同效果/UI。实现起来非常简单 - 它还包括一个手电筒功能。

    【讨论】:

      【解决方案2】:

      第 1 步:

      将这个库添加到 Gradle 的依赖中

      implementation 'com.google.zxing:core:3.2.1'
      implementation 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
      

      第 2 步:

      BarcodeActivity.java

          public class BarcodeActivity extends AppCompatActivity {
      
      
             private EditText editTextProductId;
             private Button buttonGenerate, buttonScan;
             private ImageView imageViewResult;
      
             @Override
             protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_barcode);
                initView();
             }
      
             private void initView() {
                 editTextProductId = findViewById(R.id.editTextProductId);
                 imageViewResult = findViewById(R.id.imageViewResult);
                 buttonGenerate = findViewById(R.id.buttonGenerate);
      
                 buttonGenerate.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View view) {
                         buttonGenerate_onClick(view);
                     }
                 });
                 buttonScan = findViewById(R.id.buttonScan);
                 buttonScan.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View view) {
                         buttonScan_onClick(view);
                     }
                 });
             }
      
             private void buttonGenerate_onClick(View view) {
                 try {
                     String productId = editTextProductId.getText().toString();
                     Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
                     hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
                     Writer codeWriter;
                     codeWriter = new Code128Writer();
                     BitMatrix byteMatrix = codeWriter.encode(productId, BarcodeFormat.CODE_128,400, 200, hintMap);
                     int width = byteMatrix.getWidth();
                     int height = byteMatrix.getHeight();
                     Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                     for (int i = 0; i < width; i++) {
                         for (int j = 0; j < height; j++) {
                             bitmap.setPixel(i, j, byteMatrix.get(i, j) ? Color.BLACK : Color.WHITE);
                         }
                     }
                     imageViewResult.setImageBitmap(bitmap);
                 } catch (Exception e) {
                     Toast.makeText(getApplicationContext(), e.getMessage(), 
                     Toast.LENGTH_LONG).show();
                 }
             }
      
             private void buttonScan_onClick(View view) {
                 IntentIntegrator intentIntegrator = new IntentIntegrator(this);
         intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
                 intentIntegrator.setCameraId(0);
                 intentIntegrator.initiateScan();
             }
      
             @Override
             protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                 IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
                 if (intentResult != null) {
                     String productId = intentResult.getContents();
                     Toast.makeText(getApplicationContext(), productId, Toast.LENGTH_LONG).show();
                 }
             }
      
          }
      

      第 3 步:

      activity_barcode.xml

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="#ffffff"
          android:orientation="vertical"
          tools:ignore="HardcodedText">
      
      <EditText
          android:id="@+id/editTextProductId"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:ems="10"
          android:hint="Product Id"
          android:inputType="textPersonName" />
      
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal">
      
          <Button
              android:id="@+id/buttonGenerate"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:text="Generate Barcode" />
      
          <Button
              android:id="@+id/buttonScan"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:text="Scan Barcode" />
      </LinearLayout>
      
      <ImageView
          android:id="@+id/imageViewResult"
          android:layout_width="match_parent"
          android:layout_height="335dp" />
      
      
      </LinearLayout>
      

      【讨论】:

        【解决方案3】:

        请在 MainActivity 中添加此代码

        将这个库添加到 Gradle 的依赖中

            compile 'com.journeyapps:zxing-android-embedded:3.3.0@aar'
        compile 'me.dm7.barcodescanner:zxing:1.9'
        

        添加jar zbar.jar

        public class MainActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler {
        
        ZXingScannerView mScannerView;
        
        @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                QCscanner = (Button) findViewById(R.id.QCscanner);
        
        
        
        mScannerView = new ZXingScannerView(this);
            QCscanner.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
                        /*Intent intent = new Intent("com.google.zxing.client.android.SCAN");
                        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
                        startActivityForResult(intent, 0);*/
                        mScannerView = new ZXingScannerView(MainActivity.this);   // Programmatically initialize the scanner view<br />
                        setContentView(mScannerView);
                        mScannerView.setResultHandler(MainActivity.this); // Register ourselves as a handler for scan results.<br />
                        mScannerView.startCamera();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
        

        }

         @Override
        public void handleResult(Result result) {
            Log.e("", result.getText()); // Prints scan results<br />
            Log.e("", result.getBarcodeFormat().toString());
        
            Toast.makeText(MainActivity.this, "" + result.getText() + "\n" + result.getBarcodeFormat().toString(), Toast.LENGTH_SHORT).show();
        
        }
        

        }

        【讨论】:

        • 这是我的代码,条码已经在运行,但我不想全屏扫描条码,我只想扫描半屏条码
        • 使用 FrameLayout 贴花高度和宽度并在布局中调用您的条形码 xml
        【解决方案4】:

        ZXING 库允许您启动一个意图(活动)来扫描条形码。如果你想改变,你必须在 ZXING lib 的 CaptureActivity 中进行改变。

        此外,现在由于 Google 在其播放服务中包含扫描功能,您可以使用 Vision api 在片段中进行扫描,而无需集成任何第三方库。 https://github.com/googlesamples/android-vision/tree/master/visionSamples

        【讨论】:

          【解决方案5】:

          请使用 https://github.com/journeyapps/zxing-android-embedded

          只需添加扫描仪视图并删除扫描填充: 应用程序:zxing_framing_rect_width="200dp" 应用程序:zxing_framing_rect_height="200dp" 属性。

          <com.journeyapps.barcodescanner.DecoratedBarcodeView
              android:id="@+id/zxing_barcode_scanner"
              android:layout_width="200dp"
              android:layout_height="200dp"
              android:layout_centerHorizontal="true"
              android:layout_marginTop="36dp"
              app:zxing_framing_rect_width="200dp"
              app:zxing_framing_rect_height="200dp"
              app:zxing_preview_scaling_strategy="fitXY"
              app:zxing_use_texture_view="false"
              />
          

          【讨论】:

            【解决方案6】:

            试试这个。 (它非常简化的例子):

            第一步。在 build.gradle(module app) 中添加依赖:

            从4.x版本开始,默认只支持Android SDK 24+,需要androidx。

            implementation 'com.journeyapps:zxing-android-embedded:4.2.0'
            implementation 'androidx.appcompat:appcompat:1.0.2'
            

            对于

            implementation 'com.google.zxing:core:3.3.0'
            

            第二步。将 DecoratedBarcodeView 视图粘贴到您的布局中(本例中为 activity_main.xml):

            <?xml version="1.0" encoding="utf-8"?>
            <androidx.constraintlayout.widget.ConstraintLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">
            
            
                <com.journeyapps.barcodescanner.DecoratedBarcodeView
                    android:id="@+id/barcode_scanner"
                    android:layout_width="match_parent"
                    android:layout_height="200dp"
                    android:layout_alignParentTop="true"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintVertical_bias="0.0">
                </com.journeyapps.barcodescanner.DecoratedBarcodeView>
            
                <TextView
                    android:id="@+id/resultTextView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="TextView"
                    android:textSize="24dp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/barcode_scanner" />
                </androidx.constraintlayout.widget.ConstraintLayout>
            

            第三步。将此代码添加到 MainActivity:

            class MainActivity : AppCompatActivity() {
            private lateinit var binding: ActivityMainBinding
            
            override fun onCreate(savedInstanceState: Bundle?) {
                super.onCreate(savedInstanceState)
            
                binding = ActivityMainBinding.inflate(layoutInflater)
                setContentView(binding.root)
            
                val formats: Collection<BarcodeFormat> = Arrays.asList(BarcodeFormat.QR_CODE, BarcodeFormat.CODE_39)
                binding.barcodeScanner.decoderFactory = DefaultDecoderFactory(formats)
                binding.barcodeScanner.initializeFromIntent(Intent())
                binding.barcodeScanner.decodeContinuous(object : BarcodeCallback {
                    override fun barcodeResult(result: BarcodeResult?) {
                        binding.resultTextView.text = result?.result?.text
                    }
                })
            }
            
            override fun onResume() {
                super.onResume()
                binding.barcodeScanner.resume()
            }
            
            override fun onPause() {
                super.onPause()
                binding.barcodeScanner.pause()
            }
            }
            

            重要!实现 onResume/onPause 方法来激活 DecoratedBarcodeView 视图。并且不要忘记为您的应用授予相机权限!

            在这个例子中,我使用这个库: https://github.com/journeyapps/zxing-android-embedded

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-12-03
              • 1970-01-01
              • 2015-09-30
              • 1970-01-01
              • 2016-01-09
              • 2012-05-21
              • 2014-12-11
              • 1970-01-01
              相关资源
              最近更新 更多