【问题标题】:Android, How to read QR code in my application?Android,如何在我的应用程序中读取二维码?
【发布时间】:2012-02-08 12:06:03
【问题描述】:

在我的应用程序中,我需要阅读二维码。我在网上搜索并找到了 Zing 代码,但是很多开发人员在使用它时遇到了问题,而且它似乎有问题!

如果我假设我的客户在他们的设备上安装了二维码阅读器,我如何使用这些应用程序并通过隐式意图调用它们?

如果用户没有任何二维码阅读器,应用程序会发生什么?如果它崩溃了,我可以要求用户下载例如 QrDroid,然后使用它吗?

【问题讨论】:

    标签: android android-intent qr-code implicit


    【解决方案1】:
    try {
    
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); // "PRODUCT_MODE for bar codes
    
        startActivityForResult(intent, 0);
    
    } catch (Exception e) {
    
        Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
        Intent marketIntent = new Intent(Intent.ACTION_VIEW,marketUri);
        startActivity(marketIntent);
    
    }
    

    onActivityResult():

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {           
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
    
            if (resultCode == RESULT_OK) {
                String contents = data.getStringExtra("SCAN_RESULT");
            }
            if(resultCode == RESULT_CANCELED){
                //handle cancel
            }
        }
    }
    

    【讨论】:

    • 小错字:您在“已取消”中添加了一个额外的 L
    • @SeshuVinay 但为此我们需要在手机中安装 BARCODE SCANNER 应用程序
    • @SeshuVinay 你能告诉我扫描后如何存储数据吗?
    【解决方案2】:

    Zxing 是执行二维码扫描和生成的优秀库。 以下实现使用Zxing库扫描二维码图片别忘了在build.gradle中添加以下依赖

    implementation 'me.dm7.barcodescanner:zxing:1.9'
    

    代码扫描器活动:

        public class QrCodeScanner extends AppCompatActivity implements ZXingScannerView.ResultHandler {
            private ZXingScannerView mScannerView;
    
            @Override
            public void onCreate(Bundle state) {
                super.onCreate(state);
                // Programmatically initialize the scanner view
                mScannerView = new ZXingScannerView(this);
                // Set the scanner view as the content view
                setContentView(mScannerView);
            }
    
            @Override
            public void onResume() {
                super.onResume();
                // Register ourselves as a handler for scan results.
                mScannerView.setResultHandler(this);
                // Start camera on resume
                mScannerView.startCamera();
            }
    
            @Override
            public void onPause() {
                super.onPause();
                // Stop camera on pause
                mScannerView.stopCamera();
            }
    
            @Override
            public void handleResult(Result rawResult) {
                // Do something with the result here
                // Prints scan results
                Logger.verbose("result", rawResult.getText());
                // Prints the scan format (qrcode, pdf417 etc.)
                Logger.verbose("result", rawResult.getBarcodeFormat().toString());
                //If you would like to resume scanning, call this method below:
                //mScannerView.resumeCameraPreview(this);
                Intent intent = new Intent();
                intent.putExtra(AppConstants.KEY_QR_CODE, rawResult.getText());
                setResult(RESULT_OK, intent);
                finish();
            }
        }
    

    【讨论】:

    • 此代码在应用程序中,这应该是公认的答案
    • 如果出现白屏,请尝试 AndroidManifest.xml 的 部分中的“”,如在github.com/dm77/barcodescanner.
    • 只是一个信息更新。也请关注库版本号的更新。
    • AppConstants.KEY_QR_CODE - “AppConstants”未解决
    • @AndrewSnejovski AppConstants.KEY_QR_CODE 只是在常量文件中维护的常量。你可以定义你自己的。它用作将结果数据发送回调用活动的键。根据该键在 onActivityResult 中获取所需的数据。
    【解决方案3】:

    如果用户没有任何二维码阅读器,应用程序会发生什么?如果它崩溃了,我可以要求用户下载例如 QrDroid,然后使用它吗?

    有趣的是,谷歌现在引入了Mobile Vision APIs,它们被集成在游戏服务本身中。

    在你的 Gradle 文件中添加:

    compile 'com.google.android.gms:play-services-vision:11.4.0'
    

    取自QR code tutorial

    2020 年更新:

    现在二维码扫描也是 ML Kit 的一部分,所以你可以将模型捆绑到应用程序中,并通过集成以下 gradle 依赖项来使用它:

    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:barcode-scanning:16.0.3'
    }
    

    或者您可以使用以下 gradle 依赖项从 Google Play Services 动态下载模型:

    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:16.1.2'
    }
    

    取自this link

    【讨论】:

    • 这需要在目标设备上安装谷歌服务,并非所有手机都有。
    • @LeonardoAcevedo Google play 服务的采用率非常高,即 90% 以上,而且这个功能发布已经有一段时间了。所以现在应该不成问题了。
    • 我怀疑 Play 服务的采用能否在中国禁止使用的情况下获得如此多的采用,但无论如何它不是 Android 的一个组成部分,不应被视为这样
    【解决方案4】:

    在 android studio 中,您可以使用以下流程创建和读取二维码 &image 看起来像 bellw

    1. 创建一个android studio空项目
    2. 在 app.gradle 中添加库

      compile 'com.google.zxing:core:3.2.1'
      compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
      
    3. 在activity.main xml中使用波纹管..

       <?xml version="1.0" encoding="utf-8"?>
       <LinearLayout 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"
       tools:context="com.example.enamul.qrcode.MainActivity">
      
      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical">
      
      
      <EditText
          android:id="@+id/editText"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:gravity="center"
          android:hint="Enter Text Here" />
      
      <Button
          android:id="@+id/button"
          android:layout_width="fill_parent"
          android:layout_height="50dp"
          android:layout_below="@+id/editText"
          android:text="Click Here TO generate qr code"
          android:textAllCaps="false"
          android:textSize="16sp" />
      
      
      <Button
          android:id="@+id/btnScan"
          android:layout_width="fill_parent"
          android:layout_height="50dp"
          android:layout_below="@+id/editText"
          android:text="Scan Your QR Code"
          android:textAllCaps="false"
          android:textSize="16sp" />
      
      <TextView
          android:id="@+id/tv_qr_readTxt"
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />
      
      
      <ImageView
          android:id="@+id/imageView"
          android:layout_width="match_parent"
          android:layout_height="200dp"
          android:layout_below="@+id/button"
          android:src="@android:drawable/ic_dialog_email" />
      
      
      </LinearLayout>
      
      </LinearLayout>
      
    4. 在 MainActivity 你可以使用下面的代码

      public class MainActivity extends AppCompatActivity {
        ImageView imageView;
        Button button;
        Button btnScan;
        EditText editText;
        String EditTextValue ;
        Thread thread ;
        public final static int QRcodeWidth = 350 ;
        Bitmap bitmap ;
      
        TextView tv_qr_readTxt;
      
       @Override
       protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
          imageView = (ImageView)findViewById(R.id.imageView);
          editText = (EditText)findViewById(R.id.editText);
          button = (Button)findViewById(R.id.button);
          btnScan = (Button)findViewById(R.id.btnScan);
           tv_qr_readTxt = (TextView) findViewById(R.id.tv_qr_readTxt);
      
      button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
      
      
      
              if(!editText.getText().toString().isEmpty()){
                  EditTextValue = editText.getText().toString();
      
                  try {
                      bitmap = TextToImageEncode(EditTextValue);
      
                      imageView.setImageBitmap(bitmap);
      
                  } catch (WriterException e) {
                      e.printStackTrace();
                  }
              }
              else{
                  editText.requestFocus();
                  Toast.makeText(MainActivity.this, "Please Enter Your Scanned Test" , Toast.LENGTH_LONG).show();
              }
      
            }
        });
      
      
      btnScan.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
      
              IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
              integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
              integrator.setPrompt("Scan");
              integrator.setCameraId(0);
              integrator.setBeepEnabled(false);
              integrator.setBarcodeImageEnabled(false);
              integrator.initiateScan();
      
           }
         });
          }
      
      
       Bitmap TextToImageEncode(String Value) throws WriterException {
         BitMatrix bitMatrix;
          try {
          bitMatrix = new MultiFormatWriter().encode(
                  Value,
                  BarcodeFormat.DATA_MATRIX.QR_CODE,
                  QRcodeWidth, QRcodeWidth, null
          );
      
          } catch (IllegalArgumentException Illegalargumentexception) {
      
           return null;
         }
        int bitMatrixWidth = bitMatrix.getWidth();
      
        int bitMatrixHeight = bitMatrix.getHeight();
      
        int[] pixels = new int[bitMatrixWidth * bitMatrixHeight];
      
        for (int y = 0; y < bitMatrixHeight; y++) {
            int offset = y * bitMatrixWidth;
      
           for (int x = 0; x < bitMatrixWidth; x++) {
      
               pixels[offset + x] = bitMatrix.get(x, y) ?
                      getResources().getColor(R.color.QRCodeBlackColor):getResources().getColor(R.color.QRCodeWhiteColor);
            }
          }
          Bitmap bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444);
      
         bitmap.setPixels(pixels, 0, 350, 0, 0, bitMatrixWidth, bitMatrixHeight);
         return bitmap;
      }
      
      
      
      
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
          if(result.getContents() == null) {
              Log.e("Scan*******", "Cancelled scan");
      
           } else {
              Log.e("Scan", "Scanned");
      
              tv_qr_readTxt.setText(result.getContents());
              Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
           }
        } else {
            // This is important, otherwise the result will not be passed to the fragment
          super.onActivityResult(requestCode, resultCode, data);
           }
         }
       }
      
    5. 您可以从 GitHub 下载完整的源代码。 GitHub链接是:https://github.com/enamul95/QRCode

    【讨论】:

    • 谢谢!我必须安装 SDK 26 来构建您的项目。效果很好。还将库的版本更新为“com.google.zxing:core:3.3.3”和“com.journeyapps:zxing-android-embedded:3.6.0@aar”。如果你有很多肯定的答案,你的评分怎么可能是 1?
    • 扫描后返回首页。我在片段中使用此代码!
    【解决方案5】:

    我创建了一个简单的示例教程。您可以阅读并在您的应用程序中使用。

    http://ribinsandroidhelper.blogspot.in/2013/03/qr-code-reading-on-your-application.html

    通过此链接,您可以下载 qrcode 库项目并导入您的工作区并将库添加到您的项目中

    并将此代码复制到您的活动中

     Intent intent = new Intent("com.google.zxing.client.android.SCAN");
     startActivityForResult(intent, 0);
    
     public void onActivityResult(int requestCode, int resultCode, Intent intent) {
         if (requestCode == 0) {
             if (resultCode == RESULT_OK) {
                 String contents = intent.getStringExtra("SCAN_RESULT");
                 String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
                 Toast.makeText(this, contents,Toast.LENGTH_LONG).show();
                 // Handle successful scan
             } else if (resultCode == RESULT_CANCELED) {
                 //Handle cancel
             }
         }
    }
    

    【讨论】:

    • 嗨,你能扩展你的答案吗?如果链接断开,仅链接附近的答案将无用。
    • 您好,我的答案已编辑,您可以查看此内容,您应该查看答案中的 url 链接
    • 它说该文件已弃用
    【解决方案6】:

    使用像 ZXing 这样的 QR 库...我有很好的经验,QrDroid 的 bug 更多。如果您必须依赖外部阅读器,请使用像 Google Goggles 这样的标准阅读器!

    【讨论】:

      【解决方案7】:

      简易二维码库

      一个简单的 Android 简易二维码库。使用起来非常简单,按照以下步骤使用这个库。

      对于 Gradle:

      第 1 步。将其添加到存储库末尾的根 build.gradle 中:

      allprojects {
          repositories {
              ...
              maven { url 'https://jitpack.io' }
          }
      }
      

      第二步,添加依赖:

      dependencies {
              compile 'com.github.mrasif:easyqrlibrary:v1.0.0'
      }
      

      对于 Maven:

      步骤 1. 将 JitPack 存储库添加到您的构建文件:

      <repositories>
          <repository>
              <id>jitpack.io</id>
              <url>https://jitpack.io</url>
          </repository>
      </repositories>
      

      第二步,添加依赖:

      <dependency>
          <groupId>com.github.mrasif</groupId>
          <artifactId>easyqrlibrary</artifactId>
          <version>v1.0.0</version>
      </dependency>
      

      对于 SBT:

      步骤 1. 将 JitPack 存储库添加到您的 build.sbt 文件中:

      resolvers += "jitpack" at "https://jitpack.io"
      

      第二步,添加依赖:

      libraryDependencies += "com.github.mrasif" % "easyqrlibrary" % "v1.0.0"
      

      对于莱宁根:

      第 1 步。将其添加到存储库末尾的 project.clj 中:

      :repositories [["jitpack" "https://jitpack.io"]]
      

      第二步,添加依赖:

      :dependencies [[com.github.mrasif/easyqrlibrary "v1.0.0"]]
      

      在你的布局 xml 文件中添加这个:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout 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"
          android:padding="20dp"
          tools:context=".MainActivity"
          android:orientation="vertical">
      
          <TextView
              android:id="@+id/tvData"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:gravity="center"
              android:text="No QR Data"/>
          <Button
              android:id="@+id/btnQRScan"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="QR Scan"/>
      
      </LinearLayout>
      

      将此添加到您的活动 java 文件中:

      public class MainActivity extends AppCompatActivity implements View.OnClickListener{
      
          TextView tvData;
          Button btnQRScan;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              tvData=findViewById(R.id.tvData);
              btnQRScan=findViewById(R.id.btnQRScan);
      
              btnQRScan.setOnClickListener(this);
          }
      
          @Override
          public void onClick(View view){
              switch (view.getId()){
                  case R.id.btnQRScan: {
                      Intent intent=new Intent(MainActivity.this, QRScanner.class);
                      startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);
                  } break;
              }
          }
      
          @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              switch (requestCode){
                  case EasyQR.QR_SCANNER_REQUEST: {
                      if (resultCode==RESULT_OK){
                          tvData.setText(data.getStringExtra(EasyQR.DATA));
                      }
                  } break;
              }
          }
      }
      

      对于自定义扫描仪屏幕,只需在启动扫描仪活动时添加这些行。

      Intent intent=new Intent(MainActivity.this, QRScanner.class);
      intent.putExtra(EasyQR.IS_TOOLBAR_SHOW,true);
      intent.putExtra(EasyQR.TOOLBAR_DRAWABLE_ID,R.drawable.ic_audiotrack_dark);
      intent.putExtra(EasyQR.TOOLBAR_TEXT,"My QR");
      intent.putExtra(EasyQR.TOOLBAR_BACKGROUND_COLOR,"#0588EE");
      intent.putExtra(EasyQR.TOOLBAR_TEXT_COLOR,"#FFFFFF");
      intent.putExtra(EasyQR.BACKGROUND_COLOR,"#000000");
      intent.putExtra(EasyQR.CAMERA_MARGIN_LEFT,50);
      intent.putExtra(EasyQR.CAMERA_MARGIN_TOP,50);
      intent.putExtra(EasyQR.CAMERA_MARGIN_RIGHT,50);
      intent.putExtra(EasyQR.CAMERA_MARGIN_BOTTOM,50);
      startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);
      

      你已经完成了。 参考。链接:https://mrasif.github.io/easyqrlibrary

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多