您的位置:首页 > 移动开发 > Android开发

Android_生成二维码并分享

2017-03-21 11:26 260 查看

生成二维码:

使用google官方的Zxing库,调用
createQRCode
方法,返回一个bitmap对象

//size给固定的值,避免使用iamgeview.getWidth,导致二维码模糊
Bitmap bitmap = EncodingHandler.createQRCode("some scan code", width);


把这个bitmap对象显示在ImageView上

mImageView.setImageBitmap(bitmap);


这样就生成了一个二维码



那么要分享二维码,这个二维码肯定是张图片,如何把这个bitmap对象保存起来呢,封装一个saveImageToGallery方法

/**
* 将二维码图片保存到文件夹
*
* @param context
* @param bmp
*/
public static void saveImageToGallery(Context context, Bitmap bmp) {
// 首先保存图片
String externalStorageState = Environment.getExternalStorageState();
//判断sd卡是否挂载
if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) {
/*外部存储可用,则保存到外部存储*/
//创建一个文件夹
File appDir = new File(Environment.getExternalStorageDirectory(), "syy");
//如果文件夹不存在
if (!appDir.exists()) {
//则创建这个文件夹
appDir.mkdir();
}
//将bitmap保存
save(context, bmp, appDir);
} else {
//外部不可用,将图片保存到内部存储中,获取内部存储文件目录
File filesDir = context.getFilesDir();
//保存
save(context, bmp, filesDir);
}
}


save方法

private static void save(Context context, Bitmap bmp, File appDir) {
//命名文件名称
String fileName = System.currentTimeMillis() + ".jpg";
//创建图片文件,传入文件夹和文件名
File imagePath = new File(appDir, fileName);
try {
//创建文件输出流,传入图片文件,用于输入bitmap
FileOutputStream fos = new FileOutputStream(imagePath);
//将bitmap压缩成png,并保存到相应的文件夹中
bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
//冲刷流
fos.flush();
//关闭流
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 其次把文件插入到系统图库
try {
MediaStore.Images.Media.insertImage(context.getContentResolver(),
imagePath.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 最后通知图库更新
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + imagePath.getAbsolutePath())));
}


当然,不要忘记加权限

//写外部存储

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

//读外部存储
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//写内部存储
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE"/>
//读内部存储
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"/>


这个时候二维码就已经保存到我们的文件夹下了

分享二维码

分享二维码,首先得把之前生成并报存的二维码获取出来,获取出来以后,调用系统分享进行分享

//获取外部存储
File externalStorageDirectory = Environment.getExternalStorageDirectory();
//判断sd卡是否挂载
if (externalStorageDirectory.equals(Environment.MEDIA_MOUNTED)) {
//如果有sd卡,则获取存放图片的文件夹路径
String imageDirPath = Environment.getExternalStorageDirectory().toString() + File.separator
+ "syy";
Log.d(TAG, imageDirPath);
//
File imgFile = new File(imageDirPath);
//获取并分享二维码
getQrAndShare(imgFile);
} else {
//如果没有sd卡,则获取内部存储路径
File filesDir = mContext.getFilesDir();
File imgFile = new File(filesDir.getAbsolutePath());
getQrAndShare(imgFile);
}


getQrAndShare方法

private void getQrAndShare(File imgFile) {
//获取到文件夹中所有的文件
File[] files = imgFile.listFiles();
//如果文件夹下没有文件,则提示去生成
if (files.length == 0) {
Toast.makeText(mContext, "请先在侧边栏二维码处生成二维码", Toast.LENGTH_SHORT).show();
} else {
//创建一个存放图片路径的集合
List<String> imagePathList = new ArrayList<>();
// 将所有的文件存入ArrayList中
for (int i = 0; i < files.length; i++) {
File file = files[i];
imagePathList.add(file.getPath());
}
//获取图片路径,获取的永远是最后一张二维码
int size = imagePathList.size();
Log.d(TAG, "size:" + size);
if (size != 0) {
//获取最后一张图片的路径
mPath = imagePathList.get(size - 1);
Log.d(TAG, "path:" + mPath);
//转化为uri
Uri imageUri = Uri.fromFile(new File(mPath));
Log.d("share", "uri:" + imageUri);
//创建Intent设置Action为ACTION_SEND,传入uri,设置type为image/*,开启Intent
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "分享到"));
} else {
//由文件得到uri
Toast.makeText(mContext, "请先在侧边栏二维码处生成二维码", Toast.LENGTH_SHORT).show();
}
}

}


这样会弹出系统的分享界面,然后进行分享就ok了

补充:

在生成二维码的时候,出现了一个bug,生成出来的二维码显示在Imageview上是正常的,但是保存到文件夹下就成了黑乎乎的一张黑图,经过搜索和询问,找到了解决方案,这是createQRCode的实现细节

public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException {
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix matrix = new MultiFormatWriter().encode(str,
BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);
int width = matrix.getWidth();
int height = matrix.getHeight();
int[] pixels = new int[width * height];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (matrix.get(x, y)) {
pixels[y * width + x] = BLACK;
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}


注意到里面有一个
pixels[y * width + x] = BLACK;
这就导致二维码以外的区域是黑色去填充,但是二维码也是黑色的,所以整张图就成了黑色

所以把在以上代码中加上
pixels[y * width + x] = WHITE;
就ok了



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 二维码