Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 月下載量上千次Android實現二維碼生成器app源碼分享

月下載量上千次Android實現二維碼生成器app源碼分享

編輯:關於Android編程

在360上面上線了一個月,下載量上千余次。這裡把代碼都分享出來,供大家學習哈!還包括教大家如何接入廣告,賺點小錢花花,喜歡的幫忙頂一個,大神見了勿噴,小學僧剛學Android沒多久。首先介紹這款應用:APP是一款二維碼生成器,雖然如何制作二維碼教程網上有很多,我這裡再唠叨一下並把我的所有功能模塊代碼都分享出來。

在這裡我們需要一個輔助類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();
//把圖片加入到系統圖庫裡面
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調用系統提供的相冊功能,使用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 是系統自定義得一個常量
 Log.e("TAG->onresult","ActivityResult resultCode error");
return;
}
 Bitmap bm = null;
 //外界的程序訪問ContentProvider所提供數據 可以通過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多媒體數據庫的封裝接口,具體的看Android文檔
 Cursor cursor = managedQuery(originalUri, proj, null, null, null); 
 //按我個人理解 這個是獲得用戶選擇的圖片的索引值
 int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
 //將光標移至開頭 ,這個很重要,不小心很容易引起越界
cursor.moveToFirst();
//最後根據索引值獲取圖片路徑
 String path = cursor.getString(column_index);
edtText.setText(path);
btnOpen.setText(R.string.recognitionTwoCode);
 }catch (IOException e) {
Log.e("TAG-->Error",e.toString());
}
}
}

/**
 * 解析二維碼圖片裡的內容
 * @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實現二維碼生成器app源碼大家不要錯過呀!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved