2013-11-03 36 views
1

我正在嘗試創建一個QR碼轉換器的文本。將文本轉換爲QR碼時出錯

我使用了http://code.google.com/p/zxing/downloads/list的core2.2.jar和Integrating the ZXing library directly into my Android application中的代碼。

我Main.Activity是如下所示

包com.example.qr_androidone;

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

import android.os.Bundle; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.view.Menu; 
import android.widget.ImageView; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //super.onCreate(savedInstanceState); 
     //setContentView(R.layout.activity_main); 
     ImageView imageView = (ImageView) findViewById(R.id.qrCode); 

     String qrData = "Data I want to encode in QR code"; 
     int qrCodeDimention = 500; 

     QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null, 
       Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimention); 

     try { 
      Bitmap bitmap = qrCodeEncoder.encodeAsBitmap(); 
      imageView.setImageBitmap(bitmap); 
     } catch (WriterException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

我用 「Contents.java」 和 「QRCodeEncoder.java」,如圖鏈路Integrating the ZXing library directly into my Android application。我改變了「activity_main.xml中」也,如上面的鏈接

有編制沒有錯誤,但有錯誤時,應用程序運行

Could not find class 'com.google.zxing.EncodeHintType', referenced from method com.example.qr_androidone.QRCodeEncoder.encodeAsBitmap

Could not find class 'com.google.zxing.MultiFormatWriter', referenced from method com.example.qr_androidone.QRCodeEncoder.encodeAsBitmap

java.lang.NoClassDefFoundError: com.google.zxing.BarcodeFormat

請幫我解決這個錯誤

回答

1

你需要的類QRCodeEncoder.java的..

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

//  private int dimension = Integer.MAX_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) { 
    //   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) { 
       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; 

     Hashtable<EncodeHintType, String> hints = null; 
     String encoding = guessAppropriateEncoding(contents); 
     if (encoding != null) { 
     hints = new Hashtable<EncodeHintType, String>(); 
     hints.put(EncodeHintType.CHARACTER_SET, encoding); 
     } 
     MultiFormatWriter writer = new MultiFormatWriter(); 
     BitMatrix result =writer.encode(contents, format, 300, 300, 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++) { 

     if(result.get(x, y)) 
     { 
     pixels[offset + x] = BLACK ; 
     } 
     else 
     pixels[offset + x] = 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(); 
    } 

}

,也需要content.java類..

public class Contents { 
private Contents() { 
} 

public static final class Type { 

    public static final String TEXT = "TEXT_TYPE"; 
    public static final String EMAIL = "EMAIL_TYPE"; 
    public static final String PHONE = "PHONE_TYPE"; 
    public static final String SMS = "SMS_TYPE"; 
    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"; 

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 
}; 
} 

還需要core.jar添加文件。 其完美的作品...