2012-01-12 101 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

相關問題