在360上面上线了一个月,下载量上千余次。这里把代码都分享出来,供大家学习哈!还包括教大家如何接入广告,赚点小钱花花,喜欢的帮忙顶一个,大神见了勿喷,小学僧刚学Android没多久。

首先介绍这款应用:APP是一款二维码生成器,虽然如何制作二维码教程网上有很多,我这里再唠叨一下并把我的所有功能模块代码都分享出来。

既然是二维码生成器那么我们如何制作二维码呢?

这里主要用到了Google的Zxing开源包,可以到网上下载,也可以到我的csdn上面去下载http://download.csdn.net/detail/u014132820/8223437

在这里我们需要一个辅助类RGBLuminanceSource,这个类Google也提供了,我们直接粘贴过去就可以使用了

下面是我的代码组织结构:

package com.njupt.liyao;

import com.google.zxing.LuminanceSource; 

import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import java.io.FileNotFoundException; /**
* This class is used to help decode images from files which arrive as RGB data
* from Android bitmaps. It does not support cropping or rotation.
*
* @author dswitkin@google.com (Daniel Switkin)
*/
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;
} }

  

下面这段代码可以利用Zxing包将文本信息比如网址,文章生成一张照片,我这里返回一个Bitmap对象,因为后面还要将其写入SD卡里面和显示在ImageView上面。

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

  

通过上面这段代码其实我们已经得到了存储文本信息的二维码图片了,下面我们在二维码写到SD卡里面并且添加到系统相册里面方便用户调用(因为如果你只是写入到SD卡里面是不能再系统相册里面及时看到的)

在App启动之前我们应该在SD卡里面创建一个文件夹保存这些二维码:

	public void createDirctoryToSaveImage(){
String dirPath=Environment.getExternalStorageDirectory()+File.separator+"TowDimensionCode";
File dirFile=new File(dirPath);
if(!dirFile.exists()){
dirFile.mkdir();
}
}

接下来是把图片写入到SD卡已及如何加入到系统图库里面(如何把图片添加到系统相册的几种方法可以看我的这篇博客:http://www.cnblogs.com/BasilLee/p/4082450.html ):

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

到了这一步我们已经完成了二维码的生成已经保存,下面就是我们怎么点击Button打开系统图库要用户来选择他所需解析的二维码了:

点击按钮打开系统相册我主要是通过以下两个方法来实现的:

//打开相册
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;
}

这个函数返回一个String类型也就是二维码里面所含的文本信息了。

现在功能基本上已经完成了,现在可能大家会想着如何接入广告赚点小钱了,毕竟程序猿没妹子喜欢只能努力赚钱了,嘿嘿!下面我来介绍360的广告平台的接入,其实代码很简单就几行,但是呢,首先你得下载360的SDK还有创建广告位,这里就以我的代码里面为例了!

首先是360的SDK,就是MV_adsdk_v0.1.6.jar包

导入进去以后呢加入这几行代码就OK了:

  //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);

这里面RelativeLayout容器是你想要广告显示的位置,记得上线时候把Mvad.showBanner最后置为false这样才能显示商业广告这样才能有收入啊,嘿嘿!

说了这么多,那到底是个什么效果呢?下面拿出你的手机扫一扫下面的二维吧下载试试吧~~~~~~大家下载后帮忙给个好评哈~~~程序猿何苦难为程序猿呢是吧~~嘿嘿

http://zhushou.360.cn/detail/index/soft_id/2212352 (微信扫描不能下载直接到360官网链接去下吧)

如果你和我一样是学生党还在考四六级那么我还有一款小app大家也可以下载使用,相信对大家四六级考试还是有帮助的:

http://zhushou.360.cn/detail/index/soft_id/2300203 (微信扫描不能下载直接到360官网链接去下吧)

月下载量上千次的APP源码分享的更多相关文章

  1. 火热的线上APP的源码分享,开箱即用

    这篇文章是写给iOS的程序员或产品经理的,同样,对于入门学习iOS开发的人,也是一个很好的实战演练,因为这里分享的是一个已经上架的.拿了源码就能正常运行起来的项目. 在介绍这个项目的源码分享之前,小编 ...

  2. 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

    Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化,以支持更多实用的功能. 另外IOS的Hybrid App也完成 ...

  3. APP源码集中打包大放送!十一个千万级别APP源码随意处置!

    小伙伴们还在一个一个苦苦寻找各类APP源码吗?此贴集中打包最常用APP的源码,你想得到的APP,这里都有! 想做商城?这里有天猫! 想做同城服务?这里有大众点评! 想做外卖?这里有饿了么! 想做视频? ...

  4. iOS高仿app源码:纯代码打造高仿优质《内涵段子》

    iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...

  5. android动画源码合集、动态主题框架、社交app源码等

    Android精选源码 仿MIUI果冻视图-BouncingJellyView   一个快速易用的动态主题框架   android动画效果集合源码   android使用Kotlin开发的Dribbb ...

  6. 基于Android开发的天气预报app(源码下载)

    原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...

  7. 如何理解直播APP源码开发中的音视频同步

    视频 直播APP源码的视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程,就像在一个本子的每一页画上画,然后快速翻动的感觉. 但是在实际应用中,并不是每一帧都是完整的画面,因为如果直 ...

  8. 直播APP源码是如何实现音视频同步的

    1.  音视频同步原理 1)时间戳 直播APP源码音视频同步主要用于在音视频流的播放过程中,让同一时刻录制的声音和图像在播放的时候尽可能的在同一个时间输出. 解决直播APP源码音视频同步问题的最佳方案 ...

  9. 直播带货APP源码开发为什么选择云服务器

    云服务器可以为直播带货APP源码提供弹性计算以及更高的运行效率,避免资源浪费,随着直播带货APP源码业务需求的变化,可以实时扩展或缩减计算资源.CVM支持按实际使用的资源计费,可以节约计算成本. 一. ...

随机推荐

  1. leetcode@ [274/275] H-Index & H-Index II (Binary Search & Array)

    https://leetcode.com/problems/h-index/ Given an array of citations (each citation is a non-negative ...

  2. Camtasia Studio的安装步骤

    总的来说: 1.安装 2.安装之后,进行汉化. 破解方法: 1):输入注册码安装 用户名:6-Y 注册码:GCABC-CPCCE-BPMMB-XAJXP-S8F6R 2):软件汉化 安装完成后使用汉化 ...

  3. Hadoop MapReduce概念学习系列之JobTracker、ResourceManager、Task Tracker、NodeManager(二十一)

    Tracker是跟踪者,跟踪器.JobTracker是项目经理.在hadoop2*的0.23版本之后,改叫RM了.ResourceManager.TaskTracker是小组长.它手下,还有具体搬砖的 ...

  4. ASP.NET MVC中防止跨站请求攻击(CSRF)

    转载   http://kevintsengtw.blogspot.co.nz/2013/01/aspnet-mvc-validateantiforgerytoken.html 在 ASP.NET M ...

  5. Altium Designer快捷键 【worldsing笔记】

    Shift + R 切换三种布线模式 (忽略, 避开或推挤) Shift + E 触发电气格点开/关 Shift + B 建立查询 Shift + PgUp 放大到最小的递增 Shift + PgDn ...

  6. 高性能javascript

    高性能javascript开发 标签(空格分隔): javascript DOM访问与修改 访问DOM元素是具有代价的,修改元素代价较为昂贵,会导致浏览器重新计算页面的几何变化. 尽量减少DOM访问, ...

  7. C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类

    类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { ...

  8. (JAVA版)冒泡排序

    核心代码: public void bubbleSort(){ ;i<length-;i++){ ;j<length-i-;j++){ ]) swap(j,j+); } } } publi ...

  9. 《JavaScript高级程序设计》 读书笔记(一)

    标签的位置 按照传统的做法,所有<script>元素都应该放在页面的<head>元素中,例如: <!DOCTYPE html> <html> <h ...

  10. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...