2013-05-16 154 views

回答

1

Android清單:

<uses-sdk android:minSdkVersion="15" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.Holo.Light"> 
    <activity 
     android:name=".GenerateQRCodeActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Android的佈局 - main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" android:layout_height="fill_parent" 
android:orientation="vertical"> 
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:text="Input some text here ..." 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 
<EditText android:id="@+id/qrInput" android:layout_width="match_parent" 
    android:layout_height="wrap_content" android:ems="10"> 

    <requestFocus /> 
</EditText> 
<Button android:id="@+id/button1" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:text="Generate QR Code" /> 
<ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

</LinearLayout> 

Android的活動 - GenerateQRCodeActivity.java

package com.as400samplecode; 

import com.google.zxing.BarcodeFormat; 
import com.google.zxing.WriterException; 


import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Display; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.WindowManager; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 

public class GenerateQRCodeActivity extends Activity implements OnClickListener{ 

private String LOG_TAG = "GenerateQRCode"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    Button button1 = (Button) findViewById(R.id.button1); 
    button1.setOnClickListener(this); 

} 

public void onClick(View v) { 

    switch (v.getId()) { 
    case R.id.button1: 
    EditText qrInput = (EditText) findViewById(R.id.qrInput); 
    String qrInputText = qrInput.getText().toString(); 
    Log.v(LOG_TAG, qrInputText); 

    //Find screen size 
    WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE); 
    Display display = manager.getDefaultDisplay(); 
    Point point = new Point(); 
    display.getSize(point); 
    int width = point.x; 
    int height = point.y; 
    int smallerDimension = width < height ? width : height; 
    smallerDimension = smallerDimension * 3/4; 

    //Encode with a QR Code image 
    QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrInputText, 
      null, 
      Contents.Type.TEXT, 
      BarcodeFormat.QR_CODE.toString(), 
      smallerDimension); 
    try { 
    Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); 
    ImageView myImage = (ImageView) findViewById(R.id.imageView1); 
    myImage.setImageBitmap(bitmap); 

    } catch (WriterException e) { 
    e.printStackTrace(); 
    } 


    break; 

    // More buttons go here (if any) ... 

    } 
} 

} 

來源爲QRCodeEncoder.java

package com.as400samplecode; 

import android.provider.ContactsContract; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.telephony.PhoneNumberUtils; 

import java.util.Collection; 
import java.util.EnumMap; 
import java.util.HashSet; 
import java.util.Map; 

import com.google.zxing.BarcodeFormat; 
import com.google.zxing.EncodeHintType; 
import com.google.zxing.MultiFormatWriter; 
import com.google.zxing.WriterException; 
import com.google.zxing.common.BitMatrix; 

public final class QRCodeEncoder { 
    private static final int WHITE = 0xFFFFFFFF; 
    private static final int BLACK = 0xFF000000; 

    private int dimension = Integer.MIN_VALUE; 
    private String contents = null; 
    private String displayContents = null; 
    private String title = null; 
    private BarcodeFormat format = null; 
    private boolean encoded = false; 

    public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) { 
     this.dimension = dimension; 
     encoded = encodeContents(data, bundle, type, format); 
    } 

    public String getContents() { 
     return contents; 
    } 

    public String getDisplayContents() { 
     return displayContents; 
    } 

    public String getTitle() { 
     return title; 
    } 

    private boolean encodeContents(String data, Bundle bundle, String type, String formatString) { 
     // Default to QR_CODE if no format given. 
     format = null; 
     if (formatString != null) { 
      try { 
       format = BarcodeFormat.valueOf(formatString); 
      } catch (IllegalArgumentException iae) { 
       // Ignore it then 
      } 
     } 
     if (format == null || format == BarcodeFormat.QR_CODE) { 
      this.format = BarcodeFormat.QR_CODE; 
      encodeQRCodeContents(data, bundle, type); 
     } else if (data != null && data.length() > 0) { 
      contents = data; 
      displayContents = data; 
      title = "Text"; 
     } 
     return contents != null && contents.length() > 0; 
    } 

    private void encodeQRCodeContents(String data, Bundle bundle, String type) { 
     if (type.equals(Contents.Type.TEXT)) { 
      if (data != null && data.length() > 0) { 
       contents = data; 
       displayContents = data; 
       title = "Text"; 
      } 
     } else if (type.equals(Contents.Type.EMAIL)) { 
      data = trim(data); 
      if (data != null) { 
       contents = "mailto:" + data; 
       displayContents = data; 
       title = "E-Mail"; 
      } 
     } else if (type.equals(Contents.Type.PHONE)) { 
      data = trim(data); 
      if (data != null) { 
       contents = "tel:" + data; 
       displayContents = PhoneNumberUtils.formatNumber(data); 
       title = "Phone"; 
      } 
     } else if (type.equals(Contents.Type.SMS)) { 
      data = trim(data); 
      if (data != null) { 
       contents = "sms:" + data; 
       displayContents = PhoneNumberUtils.formatNumber(data); 
       title = "SMS"; 
      } 
     } else if (type.equals(Contents.Type.CONTACT)) { 
      if (bundle != null) { 
       StringBuilder newContents = new StringBuilder(100); 
       StringBuilder newDisplayContents = new StringBuilder(100); 

       newContents.append("MECARD:"); 

       String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME)); 
       if (name != null) { 
        newContents.append("N:").append(escapeMECARD(name)).append(';'); 
        newDisplayContents.append(name); 
       } 

       String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL)); 
       if (address != null) { 
        newContents.append("ADR:").append(escapeMECARD(address)).append(';'); 
        newDisplayContents.append('\n').append(address); 
       } 

       Collection<String> uniquePhones = new HashSet<String>(Contents.PHONE_KEYS.length); 
       for (int x = 0; x < Contents.PHONE_KEYS.length; x++) { 
        String phone = trim(bundle.getString(Contents.PHONE_KEYS[x])); 
        if (phone != null) { 
         uniquePhones.add(phone); 
        } 
       } 
       for (String phone : uniquePhones) { 
        newContents.append("TEL:").append(escapeMECARD(phone)).append(';'); 
        newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone)); 
       } 

       Collection<String> uniqueEmails = new HashSet<String>(Contents.EMAIL_KEYS.length); 
       for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) { 
        String email = trim(bundle.getString(Contents.EMAIL_KEYS[x])); 
        if (email != null) { 
         uniqueEmails.add(email); 
        } 
       } 
       for (String email : uniqueEmails) { 
        newContents.append("EMAIL:").append(escapeMECARD(email)).append(';'); 
        newDisplayContents.append('\n').append(email); 
       } 

       String url = trim(bundle.getString(Contents.URL_KEY)); 
       if (url != null) { 
        // escapeMECARD(url) -> wrong escape e.g. http\://zxing.google.com 
        newContents.append("URL:").append(url).append(';'); 
        newDisplayContents.append('\n').append(url); 
       } 

       String note = trim(bundle.getString(Contents.NOTE_KEY)); 
       if (note != null) { 
        newContents.append("NOTE:").append(escapeMECARD(note)).append(';'); 
        newDisplayContents.append('\n').append(note); 
       } 

       // Make sure we've encoded at least one field. 
       if (newDisplayContents.length() > 0) { 
        newContents.append(';'); 
        contents = newContents.toString(); 
        displayContents = newDisplayContents.toString(); 
        title = "Contact"; 
       } else { 
        contents = null; 
        displayContents = null; 
       } 

      } 
     } else if (type.equals(Contents.Type.LOCATION)) { 
      if (bundle != null) { 
       // These must use Bundle.getFloat(), not getDouble(), it's part of the API. 
       float latitude = bundle.getFloat("LAT", Float.MAX_VALUE); 
       float longitude = bundle.getFloat("LONG", Float.MAX_VALUE); 
       if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) { 
        contents = "geo:" + latitude + ',' + longitude; 
        displayContents = latitude + "," + longitude; 
        title = "Location"; 
       } 
      } 
     } 
    } 

    public Bitmap encodeAsBitmap() throws WriterException { 
     if (!encoded) return null; 

     Map<EncodeHintType, Object> hints = null; 
     String encoding = guessAppropriateEncoding(contents); 
     if (encoding != null) { 
      hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class); 
      hints.put(EncodeHintType.CHARACTER_SET, encoding); 
     } 
     MultiFormatWriter writer = new MultiFormatWriter(); 
     BitMatrix result = writer.encode(contents, format, dimension, dimension, hints); 
     int width = result.getWidth(); 
     int height = result.getHeight(); 
     int[] pixels = new int[width * height]; 
     // All are 0, or black, by default 
     for (int y = 0; y < height; y++) { 
      int offset = y * width; 
      for (int x = 0; x < width; x++) { 
       pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; 
      } 
     } 

     Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 
     return bitmap; 
    } 

    private static String guessAppropriateEncoding(CharSequence contents) { 
     // Very crude at the moment 
     for (int i = 0; i < contents.length(); i++) { 
      if (contents.charAt(i) > 0xFF) { return "UTF-8"; } 
     } 
     return null; 
    } 

    private static String trim(String s) { 
     if (s == null) { return null; } 
     String result = s.trim(); 
     return result.length() == 0 ? null : result; 
    } 

    private static String escapeMECARD(String input) { 
     if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; } 
     int length = input.length(); 
     StringBuilder result = new StringBuilder(length); 
     for (int i = 0; i < length; i++) { 
      char c = input.charAt(i); 
      if (c == ':' || c == ';') { 
       result.append('\\'); 
      } 
      result.append(c); 
     } 
     return result.toString(); 
    } 
} 

來源爲Contents.java

package com.as400samplecode; 

import android.provider.ContactsContract; 

public final class Contents { 
    private Contents() { 
    } 

    public static final class Type { 

    // Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string 
    // must include "http://" or "https://". 
     public static final String TEXT = "TEXT_TYPE"; 

     // An email type. Use Intent.putExtra(DATA, string) where string is the email address. 
     public static final String EMAIL = "EMAIL_TYPE"; 

     // Use Intent.putExtra(DATA, string) where string is the phone number to call. 
     public static final String PHONE = "PHONE_TYPE"; 

     // An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS. 
     public static final String SMS = "SMS_TYPE"; 


    // A contact. Send a request to encode it as follows: 
    // <p/> 
    // import android.provider.Contacts; 
    // <p/> 
    // Intent intent = new Intent(Intents.Encode.ACTION); intent.putExtra(Intents.Encode.TYPE, 
    // CONTACT); Bundle bundle = new Bundle(); bundle.putString(Contacts.Intents.Insert.NAME, 
    // "Jenny"); bundle.putString(Contacts.Intents.Insert.PHONE, "8675309"); 
    // bundle.putString(Contacts.Intents.Insert.EMAIL, "[email protected]"); 
    // bundle.putString(Contacts.Intents.Insert.POSTAL, "123 Fake St. San Francisco, CA 94102"); 
    // intent.putExtra(Intents.Encode.DATA, bundle); 

     public static final String CONTACT = "CONTACT_TYPE"; 




     public static final String LOCATION = "LOCATION_TYPE"; 

     private Type() { 
     } 
    } 

    public static final String URL_KEY = "URL_KEY"; 

    public static final String NOTE_KEY = "NOTE_KEY"; 

    // When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple 
    // phone numbers and addresses. 
    public static final String[] PHONE_KEYS = { 
      ContactsContract.Intents.Insert.PHONE, ContactsContract.Intents.Insert.SECONDARY_PHONE, 
      ContactsContract.Intents.Insert.TERTIARY_PHONE 
    }; 

    public static final String[] PHONE_TYPE_KEYS = { 
      ContactsContract.Intents.Insert.PHONE_TYPE, 
      ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE, 
      ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE 
    }; 

    public static final String[] EMAIL_KEYS = { 
      ContactsContract.Intents.Insert.EMAIL, ContactsContract.Intents.Insert.SECONDARY_EMAIL, 
      ContactsContract.Intents.Insert.TERTIARY_EMAIL 
    }; 

    public static final String[] EMAIL_TYPE_KEYS = { 
      ContactsContract.Intents.Insert.EMAIL_TYPE, 
      ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE, 
      ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE 
    }; 
} 
+0

儘管如此,我有要顯示的QR碼的圖像,同時掃描(掃描過程完成之後的時間掃描QR的圖像將顯示在imageview的 – selvam

+0

我也有同樣的問題的問題..而掃描的手段....二維碼圖像將捕獲並立即顯示圖像視圖plz幫助中的圖像..在此先感謝 – AndroidRaji

1

這裏是你的答案您正在尋找5月是。

試試看本教程。您將在您的應用中的圖像視圖中獲得QR-CODE/BAR-CODE。 http://www.mysamplecode.com/2012/09/android-generate-qr-code-using-zxing.html

讓您的條形碼中的ImageView後,你可以將這個作爲一個位圖作爲

ImageView v1 = (ImageView)findViewById(R.id.mImage); 
v1.setDrawingCacheEnabled(true); 
Bitmap bm = v1.getDrawingCache(); 

現在你有你的位圖,你現在可以用它玩。

希望這可以幫助你。

也看到我的問題我也問過同樣的How to store the Generated QR-Code as an image in SDCard (ZXing library)

0

掃描後,你有一定的效果,從相機。此代碼是用於顯示ImageView

bitmap = encodeAsBitmap(qrInput.getText().toString(), BarcodeFormat.CODE_128, 600, 300); 
        final ImageView myImage = (ImageView) findViewById(R.id.imageView1); 
        myImage.setImageBitmap(bitmap); 

替換qrInput與你的結果,並BarcodeFormat.QR_CODE.TEXT你的QR碼

格式,並添加此對編碼圖像的代碼。

Bitmap encodeAsBitmap(String contents, BarcodeFormat format, int img_width, int img_height) throws WriterException { 
    String contentsToEncode = contents; 
    if (contentsToEncode == null) { 
     return null; 
    } 
    Map<EncodeHintType, Object> hints = null; 
    String encoding = guessAppropriateEncoding(contentsToEncode); 
    if (encoding != null) { 
     hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class); 
     hints.put(EncodeHintType.CHARACTER_SET, encoding); 

    } 
    MultiFormatWriter writer = new MultiFormatWriter(); 
    BitMatrix result; 
    try { 
     result = writer.encode(contentsToEncode, format, img_width, img_height, hints); 
    } catch (IllegalArgumentException iae) { 
     // Unsupported format 
     Log.d("XXX4", "Unsupported format -" + iae); 
     Toast.makeText(this, iae.getLocalizedMessage(), Toast.LENGTH_LONG).show(); 
     return null; 
    } catch (Exception e) { 
     Toast.makeText(this, "Sorry - Try Changing Content", Toast.LENGTH_LONG).show(); 
     return null; 
    } 

    int width = result.getWidth(); 
    int height = result.getHeight(); 
    int[] pixels = new int[width * height]; 


    for (int y = 0; y < height; y++) { 
     int offset = y * width; 
     for (int x = 0; x < width; x++) { 
      pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; 
     } 
    } 

    int img_widths = 400; 
    int img_heights = 400; 

    Bitmap bitmap = Bitmap.createBitmap(width, height, 
      Bitmap.Config.ARGB_8888); 
    bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 

    if (format == BarcodeFormat.DATA_MATRIX) { 
     bitmap = drawScaledBitmap(bitmap, img_widths, img_heights); 
    } 
    return bitmap; 

} 

public Bitmap drawScaledBitmap(Bitmap bitmap, int img_widths, int img_heights) { 
    final int bmWidth = bitmap.getWidth(); 
    final int bmHeight = bitmap.getHeight(); 
    final int wScalingFactor = img_widths/bmWidth; 
    final int hScalingFactor = img_heights/bmHeight; 
    final int scalingFactor = Math.min(wScalingFactor, hScalingFactor); 
    return scalingFactor > 1 ? Bitmap.createScaledBitmap(bitmap, bmWidth * scalingFactor, bmHeight * scalingFactor, false) : bitmap; 
} 

private static String guessAppropriateEncoding(CharSequence contents) { 
    // Very crude at the moment 
    for (int i = 0; i < contents.length(); i++) { 
     if (contents.charAt(i) > 0xFF) { 
      return "UTF-8"; 
     } 
    } 
    return null; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 

     case android.R.id.home: 
      onBackPressed(); 
      return true; 
    } 

    return super.onOptionsItemSelected(item); 
}