2012-01-12 70 views
36

在我的应用程序需要读取QR码。我搜索网,发现诚码但很多开发商使用它有问题,这似乎是越野车!的Android,如何读取QR码在我的应用程序?

如果我认为我的客户已经在他们的设备上安装QR码阅读器,我该如何使用这些应用程序,并通过隐含的意图给他们打电话?

,如果用户没有任何QR码阅读器,会发生什么应用?如果它崩溃,我可以请求用户下载例如QrDroid,然后使用它?

回答

55
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 
     } 
    } 
} 
+0

这段代码扫描条形码或QR码..? – 2012-11-20 11:12:16

+0

是的。它使用斑马线的条码扫描应用程序做 – 2012-11-20 11:29:12

+0

小错字:你添加一个额外的L到“取消” – 2013-12-14 10:59:36

2

使用像ZXing一样的QR库...我对它有很好的体验,QrDroid非常笨重。如果你必须依靠外部阅读器,依靠像Google Goggles这样的标准阅读器!

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 
     } 
    } 
} 
+0

嗨,您可以扩展您的答案吗?如果链接被破坏,接近链接的答案是无用的。 – orique 2013-07-16 07:29:59

+0

您好我的回答是编辑你可以通过这一点,你应该看看在回答 – 2013-07-16 08:37:57

+0

URL链接它说该文件已被弃用 – Eenvincible 2014-08-18 00:05:54

14

如果用户没有任何qr阅读器,那么应​​用程序会发生什么?如果它崩溃,我可以请求用户下载例如QrDroid,然后使用它?

有趣的是,谷歌现在推出了Mobile Vision APIs,它们都集成在游戏服务本身。

在您的摇篮文件只需添加:

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

从这个QR code tutorial服用。

+0

这需要安装在目标设备,不是所有的手机都在谷歌服务。 – 2017-04-17 10:46:45

9

Zxing是一个优秀的库,用于执行Qr代码扫描和生成。 下实现使用斑马线库扫描QR码图像不要忘记添加以下依赖于的build.gradle

compile '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(); 
    } 
} 
+1

这个代码是在应用程序中,这应该接受的答案 – matheszabi 2016-11-04 07:39:16

+1

我得到了在启动时QRCODE活动 – kemdo 2017-03-13 09:04:19

+0

如果你得到一个白色的屏幕,尝试白屏“<使用许可权的android:NAME =” android.permission.CAMERA” /> “位于AndroidManifest.xml的部分,如https://github.com/dm77/barcodescanner所述。 – jorgen 2017-07-29 20:07:15

0

在Android Studio中,您可以使用波纹管工艺打造&读取QR码 &图像看起来像bellw enter image description here

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

    compile 'com.google.zxing:core:3.2.1' 
    compile 'com.journeyapps:zxing-android-embedded:[email protected]' 
    
  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

相关问题