月下載量上千次Android實現(xiàn)二維碼生成器app源碼分享
在360上面上線了一個月,下載量上千余次。這里把代碼都分享出來,供大家學(xué)習(xí)哈!還包括教大家如何接入廣告,賺點小錢花花,喜歡的幫忙頂一個,大神見了勿噴,小學(xué)僧剛學(xué)Android沒多久。首先介紹這款應(yīng)用:APP是一款二維碼生成器,雖然如何制作二維碼教程網(wǎng)上有很多,我這里再嘮叨一下并把我的所有功能模塊代碼都分享出來。
在這里我們需要一個輔助類RGBLuminanceSource,這個類Google也提供了,我們直接粘貼過去就可以使用了
package com.njupt.liyao;
import com.google.zxing.LuminanceSource;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import java.io.FileNotFoundException;
public final class RGBLuminanceSource extends LuminanceSource {
private final byte[] luminances;
public RGBLuminanceSource(String path) throws FileNotFoundException {
this(loadBitmap(path));
}
public RGBLuminanceSource(Bitmap bitmap) {
super(bitmap.getWidth(), bitmap.getHeight());
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
// In order to measure pure decoding speed, we convert the entire image
// to a greyscale array
// up front, which is the same as the Y channel of the
// YUVLuminanceSource in the real app.
luminances = new byte[width * height];
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
int pixel = pixels[offset + x];
int r = (pixel >> 16) & 0xff;
int g = (pixel >> 8) & 0xff;
int b = pixel & 0xff;
if (r == g && g == b) {
// Image is already greyscale, so pick any channel.
luminances[offset + x] = (byte) r;
} else {
// Calculate luminance cheaply, favoring green.
luminances[offset + x] = (byte) ((r + g + g + b) >> 2);
}
}
}
}
@Override
public byte[] getRow(int y, byte[] row) {
if (y < 0 || y >= getHeight()) {
throw new IllegalArgumentException(
"Requested row is outside the image:"+ y);
}
int width = getWidth();
if (row == null || row.length < width) {
row = new byte[width];
}
System.arraycopy(luminances, y * width, row, 0, width);
return row;
}
// Since this class does not support cropping, the underlying byte array
// already contains
// exactly what the caller is asking for, so give it to them without a copy.
@Override
public byte[] getMatrix() {
return luminances;
}
private static Bitmap loadBitmap(String path) throws FileNotFoundException {
Bitmap bitmap = BitmapFactory.decodeFile(path);
if (bitmap == null) {
throw new FileNotFoundException("Couldn't open"+ path);
}
return bitmap;
}
}
public Bitmap getTwoDimensionPicture(String text,int width,int height) throws WriterException{
if(text.equals(""))
{
text="";
}
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
BitMatrix bitMatrix = new QRCodeWriter().encode(text,
BarcodeFormat.QR_CODE, width, height, hints);
int []pixels = new int[width*height];
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
if (bitMatrix.get(x, y))
{
pixels[y * width + x] = BLACK;
}
else
{
pixels[y * width + x] = WHITE;
}
}
}
Bitmap bitmap=Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0,width, 0, 0, width, height);
return bitmap;
}
public void createDirctoryToSaveImage(){
String dirPath=Environment.getExternalStorageDirectory()+File.separator+"TowDimensionCode";
File dirFile=new File(dirPath);
if(!dirFile.exists()){
dirFile.mkdir();
}
}
public void writeBitMapToSDCard(Bitmap bitmap) throws IOException{
String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";
String filePath=Environment.getExternalStorageDirectory()+File.separator+"TowDimensionCode"
+File.separator+fname;
File file=new File(filePath);
FileOutputStream fileOutputStream=new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
//把圖片加入到系統(tǒng)圖庫里面
MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(),
file.getAbsolutePath(), fname, null);
//uri得到的是文件的絕對路徑
getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse("file://"+file.getAbsolutePath())));
edtText.setText(file.getAbsolutePath());
Toast.makeText(this,"生成成功", Toast.LENGTH_LONG).show();
}
//打開相冊
private void setImage() {
//使用intent調(diào)用系統(tǒng)提供的相冊功能,使用startActivityForResult是為了獲取用戶選擇的圖片
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
getAlbum.setType(IMAGE_TYPE);
startActivityForResult(getAlbum, IMAGE_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (resultCode != RESULT_OK) { //此處的 RESULT_OK 是系統(tǒng)自定義得一個常量
Log.e("TAG->onresult","ActivityResult resultCode error");
return;
}
Bitmap bm = null;
//外界的程序訪問ContentProvider所提供數(shù)據(jù) 可以通過ContentResolver接口
ContentResolver resolver = getContentResolver();
//此處的用于判斷接收的Activity是不是你想要的那個
if (requestCode == IMAGE_CODE) {
try {
Uri originalUri = data.getData(); //獲得圖片的uri
bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);
//顯得到bitmap圖片
imgView.setImageBitmap(bm);
//這里開始的第二部分,獲取圖片的路徑:
String[] proj = {MediaColumns.DATA};
//好像是android多媒體數(shù)據(jù)庫的封裝接口,具體的看Android文檔
Cursor cursor = managedQuery(originalUri, proj, null, null, null);
//按我個人理解 這個是獲得用戶選擇的圖片的索引值
int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
//將光標(biāo)移至開頭 ,這個很重要,不小心很容易引起越界
cursor.moveToFirst();
//最后根據(jù)索引值獲取圖片路徑
String path = cursor.getString(column_index);
edtText.setText(path);
btnOpen.setText(R.string.recognitionTwoCode);
}catch (IOException e) {
Log.e("TAG-->Error",e.toString());
}
}
}
/**
* 解析二維碼圖片里的內(nèi)容
* @param filePath 二維碼圖片的位置
* @throws IOException
* @throws NotFoundException
*/
private String readImage(ImageView imageView) {
String content = null;
Map<DecodeHintType, String> hints = new HashMap<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET,"utf-8");
// 獲得待解析的圖片
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
RGBLuminanceSource source = new RGBLuminanceSource(bitmap);
BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
QRCodeReader reader = new QRCodeReader();
try {
Result result = reader.decode(bitmap1, hints);
// 得到解析后的文字
content = result.getText();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
//ad布局部分 private RelativeLayout adContainer = null; private IMvBannerAd bannerad = null; final String adSpaceid ="這是你申請的廣告ID號"; adContainer=(RelativeLayout)findViewById(R.id.adcontent); bannerad = Mvad.showBanner(adContainer, this, adSpaceid, false); bannerad.showAds(this);
月下載量上千次Android實現(xiàn)二維碼生成器app源碼大家不要錯過呀!
相關(guān)文章
Android使用gallery和imageSwitch制作可左右循環(huán)滑動的圖片瀏覽器
本文主要介紹了android使用gallery和imageSwitch制作可左右循環(huán)滑動的圖片瀏覽器的示例代碼。具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
Android開發(fā)教程之Fragment定義、創(chuàng)建與使用方法詳解【包含Activity通訊,事務(wù)執(zhí)行等】
這篇文章主要介紹了Android開發(fā)教程之Fragment定義、創(chuàng)建與使用方法,詳細(xì)介紹了Fragment的概念、功能、定義、創(chuàng)建及使用方法,包括Fragment與Activity通訊,Fragment事務(wù)執(zhí)行及Fragment應(yīng)用示例等,需要的朋友可以參考下2017-11-11

