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 Zxing生成二维码经典案例分享
- Android生成二维码--保存和分享二维码图片
- Android平台利用ZXING生成二维码图片
- android 生成二维码图片
- 一个简单的Android生成二维码Demo。
- Android应用--QR的生成(二维码)
- Android应用--QR的生成(二维码)
- 使用zxing生成QRCode二维码,在Android的webview中调用条形码扫描
- android 二维码生成
- 使用zxing生成QRCode二维码,在Android的webview中调用条形码扫描(转)
- Android平台利用ZXING生成二维码图片
- Android应用--QR的生成(二维码)
- [转]android中生成和使用jar 分享
- Android Market 链接的生成与分享
- Android之二维码的生成与解析
- android二维码的生成和解码
- 生成各种各样的随机数,android分享
- Android平台利用ZXING生成二维码图片
- Android应用--QR的生成(二维码)
- Android应用--QR的生成(二维码)