Skip to content

Commit

Permalink
添加二维码分享功能
Browse files Browse the repository at this point in the history
  • Loading branch information
liyiwei committed Aug 29, 2018
1 parent a052663 commit c1b895f
Show file tree
Hide file tree
Showing 5 changed files with 299 additions and 16 deletions.
17 changes: 10 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ android {
storePassword 'helper'
}
}
compileSdkVersion 28
compileSdkVersion 27
defaultConfig {
applicationId "group.tonight.vipvideohelper"
minSdkVersion 15
targetSdkVersion 28
targetSdkVersion 27
versionCode 1
versionName "1.0.9"
versionName "1.1.0"
}
buildTypes {
release {
Expand All @@ -37,17 +37,20 @@ android {

dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
implementation 'com.android.support:design:28.0.0-rc01'
implementation 'com.android.support:design:27.1.1'
//the core iconcis library (without any widgets)
// implementation "com.mikepenz:iconics-core:3.1.0-rc01"
// implementation "androidx.appcompat:appcompat:${versions.androidXVersion}"
// implementation 'com.mikepenz:google-material-typeface:3.0.1.2.original@aar'

implementation 'org.jsoup:jsoup:1.11.3'

implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.yanzhenjie:permission:2.0.0-rc5'
// implementation 'com.github.bumptech.glide:glide:4.8.0'
implementation 'com.google.zxing:core:3.3.3'
// implementation 'com.google.zxing:android-core:3.3.0'
// implementation 'com.google.zxing:android-integration:3.3.0'
// implementation 'com.google.zxing:javase:3.3.3'
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

Expand All @@ -19,22 +22,40 @@

import java.util.List;

import group.tonight.vipvideohelper.other.Consts;
import group.tonight.vipvideohelper.DownLoadService;
import group.tonight.vipvideohelper.R;
import group.tonight.vipvideohelper.VersionUpdateBean;
import group.tonight.vipvideohelper.VersionUpdater;
import group.tonight.vipvideohelper.other.Consts;
import group.tonight.vipvideohelper.other.QRCode;

public class SettingActivity extends BaseBackActivity {

private TextView mVersionTextView;
private ImageView mShareAppImageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);

mVersionTextView = (TextView) findViewById(R.id.version);
mShareAppImageView = (ImageView) findViewById(R.id.share_app);

VersionUpdater versionUpdater = new VersionUpdater();
versionUpdater.observe(this, new Observer<VersionUpdateBean.AssetsBean>() {
@Override
public void onChanged(@Nullable VersionUpdateBean.AssetsBean assetsBean) {
if (assetsBean == null) {
return;
}
String mBrowser_download_url = assetsBean.getBrowser_download_url();

Bitmap bitmap = QRCode.createQRCodeWithLogo(mBrowser_download_url, 500, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
mShareAppImageView.setImageBitmap(bitmap);
}
});

mVersionTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Expand All @@ -46,7 +67,7 @@ public void onChanged(@Nullable final VersionUpdateBean.AssetsBean assetsBean) {
return;
}
final String content_type = assetsBean.getContent_type();
final String browser_download_url = assetsBean.getBrowser_download_url();

final int id = assetsBean.getId();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(SettingActivity.this);
int lastVersionId = preferences.getInt(Consts.KEY_LAST_VERSION_ID, 0);
Expand Down
145 changes: 145 additions & 0 deletions app/src/main/java/group/tonight/vipvideohelper/other/QRCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
package group.tonight.vipvideohelper.other;

import android.graphics.Bitmap;
import android.graphics.Matrix;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.util.Hashtable;

/**
* 当前类注释:生成二维码的工具类
* 作者:jinwenfeng on 16/2/18 13:50
* 邮箱:[email protected]
* QQ: 823546371
* 公司:南京穆尊信息科技有限公司
* © 2016 jinwenfeng
* ©版权所有,未经允许不得传播
*/
public class QRCode {
private static int IMAGE_HALFWIDTH = 50;//宽度值,影响中间图片大小
/**
* 生成二维码,默认大小为500*500
*
* @param text 需要生成二维码的文字、网址等
* @return bitmap
*/
public static Bitmap createQRCode(String text) {
return createQRCode(text, 500);
}

/**
* 生成二维码
*
* @param text 需要生成二维码的文字、网址等
* @param size 需要生成二维码的大小()
* @return bitmap
*/
public static Bitmap createQRCode(String text, int size) {
try {
Hashtable<EncodeHintType, String> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrix = new QRCodeWriter().encode(text,
BarcodeFormat.QR_CODE, size, size, hints);
int[] pixels = new int[size * size];
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * size + x] = 0xff000000;
} else {
pixels[y * size + x] = 0xffffffff;
}

}
}
Bitmap bitmap = Bitmap.createBitmap(size, size,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
return null;
}
}

/**
* 生成带logo的二维码,默认二维码的大小为500,logo为二维码的1/5
*
* @param text 需要生成二维码的文字、网址等
* @param mBitmap logo文件
* @return bitmap
*/
public static Bitmap createQRCodeWithLogo(String text, Bitmap mBitmap) {
return createQRCodeWithLogo(text,500,mBitmap);
}

/**
* 生成带logo的二维码,logo默认为二维码的1/5
*
* @param text 需要生成二维码的文字、网址等
* @param size 需要生成二维码的大小()
* @param mBitmap logo文件
* @return bitmap
*/
public static Bitmap createQRCodeWithLogo(String text, int size, Bitmap mBitmap) {
try {
IMAGE_HALFWIDTH = size/10;
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
/*
* 设置容错级别,默认为ErrorCorrectionLevel.L
* 因为中间加入logo所以建议你把容错级别调至H,否则可能会出现识别不了
*/
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
BitMatrix bitMatrix = new QRCodeWriter().encode(text,
BarcodeFormat.QR_CODE, size, size, hints);

int width = bitMatrix.getWidth();//矩阵高度
int height = bitMatrix.getHeight();//矩阵宽度
int halfW = width / 2;
int halfH = height / 2;

Matrix m = new Matrix();
float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth();
float sy = (float) 2 * IMAGE_HALFWIDTH
/ mBitmap.getHeight();
m.setScale(sx, sy);
//设置缩放信息
//将logo图片按martix设置的信息缩放
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0,
mBitmap.getWidth(), mBitmap.getHeight(), m, false);

int[] pixels = new int[size * size];
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++) {
if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH
&& y > halfH - IMAGE_HALFWIDTH
&& y < halfH + IMAGE_HALFWIDTH) {
//该位置用于存放图片信息
//记录图片每个像素信息
pixels[y * width + x] = mBitmap.getPixel(x - halfW
+ IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);
} else {
if (bitMatrix.get(x, y)) {
pixels[y * size + x] = 0xff000000;
} else {
pixels[y * size + x] = 0xffffffff;
}
}
}
}
Bitmap bitmap = Bitmap.createBitmap(size, size,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, size, 0, 0, size, size);
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
return null;
}
}
}
107 changes: 107 additions & 0 deletions app/src/main/java/group/tonight/vipvideohelper/other/QRCodeUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package group.tonight.vipvideohelper.other;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.annotation.ColorInt;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import java.util.Hashtable;

/**
* Bitmap qrCodeBitmap = QRCodeUtil.createQRCodeBitmap("https://www.baidu.com", 480, 480);
*
* @ClassName: QRCodeUtil
* @Description: 二维码工具类
* @Author Wangnan
* @Date 2017/2/8
*/

public class QRCodeUtil {

/**
* 创建二维码位图
*
* @param content 字符串内容(支持中文)
* @param width 位图宽度(单位:px)
* @param height 位图高度(单位:px)
* @return
*/
@Nullable
public static Bitmap createQRCodeBitmap(String content, int width, int height) {
return createQRCodeBitmap(content, width, height, "UTF-8", "H", "2", Color.BLACK, Color.WHITE);
}

/**
* 创建二维码位图 (支持自定义配置和自定义样式)
*
* @param content 字符串内容
* @param width 位图宽度,要求>=0(单位:px)
* @param height 位图高度,要求>=0(单位:px)
* @param character_set 字符集/字符转码格式 (支持格式:{@link CharacterSetECI })。传null时,zxing源码默认使用 "ISO-8859-1"
* @param error_correction 容错级别 (支持级别:{@link ErrorCorrectionLevel })。传null时,zxing源码默认使用 "L"
* @param margin 空白边距 (可修改,要求:整型且>=0), 传null时,zxing源码默认使用"4"。
* @param color_black 黑色色块的自定义颜色值
* @param color_white 白色色块的自定义颜色值
* @return
*/
@Nullable
public static Bitmap createQRCodeBitmap(String content, int width, int height,
@Nullable String character_set, @Nullable String error_correction, @Nullable String margin,
@ColorInt int color_black, @ColorInt int color_white) {

/** 1.参数合法性判断 */
if (TextUtils.isEmpty(content)) { // 字符串内容判空
return null;
}

if (width < 0 || height < 0) { // 宽和高都需要>=0
return null;
}

try {
/** 2.设置二维码相关配置,生成BitMatrix(位矩阵)对象 */
Hashtable<EncodeHintType, String> hints = new Hashtable<>();

if (!TextUtils.isEmpty(character_set)) {
hints.put(EncodeHintType.CHARACTER_SET, character_set); // 字符转码格式设置
}

if (!TextUtils.isEmpty(error_correction)) {
hints.put(EncodeHintType.ERROR_CORRECTION, error_correction); // 容错级别设置
}

if (!TextUtils.isEmpty(margin)) {
hints.put(EncodeHintType.MARGIN, margin); // 空白边距设置
}
BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);

/** 3.创建像素数组,并根据BitMatrix(位矩阵)对象为数组元素赋颜色值 */
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] = color_black; // 黑色色块像素设置
} else {
pixels[y * width + x] = color_white; // 白色色块像素设置
}
}
}

/** 4.创建Bitmap对象,根据像素数组设置Bitmap每个像素点的颜色值,之后返回Bitmap对象 */
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
}

return null;
}
}
Loading

0 comments on commit c1b895f

Please sign in to comment.