二维码已经成为我们日常生活中的一个不可获取的产物,火车票上,景区门票,超市付款等等都会有二维码的身影。
本文将实现由URL转换成二维码的过程。
先看一下示例图
从示例图中我们可以清晰地看到,URL被转换成了二维码。
下面跟随我来一起实现这个功能。
导入Google提供的开源库
compile 'com.Google.zxing:core:3.3.0'
来讲解一下核心的部分:二维码转换
①生成二维码Bitmap
public static boolean createQRImage(String content,int wIDthPix,int heightPix,Bitmap logoBm,String filePath) { try { if (content == null || "".equals(content)) { return false; } //配置参数 Map<EncodeHintType,Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHaraCTER_SET,"utf-8"); //容错级别 hints.put(EncodeHintType.ERROR_CORRECTION,ErrorCorrectionLevel.H); //设置空白边距的宽度 hints.put(EncodeHintType.margin,2); //default is 4 // 图像数据转换,使用了矩阵转换 BitMatrix bitMatrix = new QRCodeWriter().encode(content,barcodeFormat.QR_CODE,wIDthPix,heightPix,hints); int[] pixels = new int[wIDthPix * heightPix]; // 下面这里按照二维码的算法,逐个生成二维码的图片, // 两个for循环是图片横列扫描的结果 for (int y = 0; y < heightPix; y++) { for (int x = 0; x < wIDthPix; x++) { if (bitMatrix.get(x,y)) { pixels[y * wIDthPix + x] = 0xff000000; } else { pixels[y * wIDthPix + x] = 0xffffffff; } } } // 生成二维码图片的格式,使用ARGB_8888 Bitmap bitmap = Bitmap.createBitmap(wIDthPix,Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels,heightPix); if (logoBm != null) { bitmap = addlogo(bitmap,logoBm); } //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大! return bitmap != null && bitmap.compress(Bitmap.CompressFormat.JPEG,100,new fileOutputStream(filePath)); } catch (WriterException | IOException e) { e.printstacktrace(); } return false; }
②在二维码中间添加logo图案
private static Bitmap addlogo(Bitmap src,Bitmap logo) { if (src == null) { return null; } if (logo == null) { return src; } //获取图片的宽高 int srcWIDth = src.getWIDth(); int srcHeight = src.getHeight(); int logoWIDth = logo.getWIDth(); int logoHeight = logo.getHeight(); if (srcWIDth == 0 || srcHeight == 0) { return null; } if (logoWIDth == 0 || logoHeight == 0) { return src; } //logo大小为二维码整体大小的1/5 float scaleFactor = srcWIDth * 1.0f / 5 / logoWIDth; Bitmap bitmap = Bitmap.createBitmap(srcWIDth,srcHeight,Bitmap.Config.ARGB_8888); try { Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(src,null); canvas.scale(scaleFactor,scaleFactor,srcWIDth / 2,srcHeight / 2); canvas.drawBitmap(logo,(srcWIDth - logoWIDth) / 2,(srcHeight - logoHeight) / 2,null); canvas.save(Canvas.ALL_SAVE_FLAG); canvas.restore(); } catch (Exception e) { bitmap = null; e.getStackTrace(); } return bitmap; }
③创建二维码文件存储目录
private static String getfileRoot(Context context) { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { file external = context.getExternalfilesDir(null); if (external != null) { return external.getabsolutePath(); } } return context.getfilesDir().getabsolutePath(); }
④创建数据库工具类来存储临时数据
public class SPUtil { private static final String CONfig = "config"; /** * 获取SharedPreferences实例对象 * * @param filename */ private static SharedPreferences getSharedPreference(String filename) { return QRCodeApplication.getInstance().getSharedPreferences(filename,Context.MODE_PRIVATE); } /** * 保存一个String类型的值! */ public static voID putString(String key,String value) { SharedPreferences.Editor editor = getSharedPreference(CONfig).edit(); editor.putString(key,value).apply(); } /** * 获取String的value */ public static String getString(String key,String defValue) { SharedPreferences sharedPreference = getSharedPreference(CONfig); return sharedPreference.getString(key,defValue); }}
⑤展示二维码
public static voID showThreadImage(final Activity mContext,final String text,final ImageVIEw imageVIEw,final int centerPhoto) { String preContent = SPUtil.getString("share_code_content",""); if (text.equals(preContent)) { String prefilePath = SPUtil.getString("share_code_filePath",""); imageVIEw.setimageBitmap(BitmapFactory.decodefile(prefilePath)); } else { SPUtil.putString("share_code_content",text); final String filePath = getfileRoot(mContext) + file.separator + "qr_" + System.currentTimeMillis() + ".jpg"; SPUtil.putString("share_code_filePath",filePath); //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中 new Thread(new Runnable() { @OverrIDe public voID run() { boolean success = QRCodeUtil.createQRImage(text,800,BitmapFactory.decodeResource(mContext.getResources(),centerPhoto),filePath); if (success) { mContext.runOnUiThread(new Runnable() { @OverrIDe public voID run() { imageVIEw.setimageBitmap(BitmapFactory.decodefile(filePath)); } }); } } }).start(); } }
构造一个输入页面的类,使用Bundle通过<key,value>传值(后期会改为MVVM-DataBinding形式)
public class ContentActivity extends AppCompatActivity implements VIEw.OnClickListener { private EditText etUrl; private button btnConvert; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_content); initVIEw(); } private voID initVIEw() { etUrl = (EditText) findVIEwByID(R.ID.et_url); btnConvert = (button) findVIEwByID(R.ID.btn_convert); btnConvert.setonClickListener(this); } @OverrIDe public voID onClick(VIEw v) { switch (v.getID()) { case R.ID.btn_convert: String str_url = "https://" + etUrl.getText().toString(); Bundle bundle = new Bundle(); bundle.putString("url",str_url); // 当输入框为空时,提示用户 if (str_url.equals("https://")) { Toast.makeText(getApplicationContext(),"输入框不能为空",Toast.LENGTH_SHORT).show(); } else { Intent intent = new Intent(ContentActivity.this,MainActivity.class); intent.putExtras(bundle); startActivity(intent); } break; default: break; } }}
将二维码图片展示在页面上(后期会改为MVVM-DataBinding形式)
public class MainActivity extends AppCompatActivity { private ImageVIEw iv;// private String url = "http://weibo.com/cnwutianhao"; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); String str_url = getIntent().getExtras().getString("url"); iv = (ImageVIEw) findVIEwByID(R.ID.iv_qrcode); QRCodeUtil.showThreadImage(this,str_url,iv,R.mipmap.ic_launcher); }}
布局文件
①输入页面(后期会改为DataBinding形式)
<?xml version="1.0" enCoding="utf-8"?><relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" androID:padding="10dp"> <EditText androID:ID="@+ID/et_url" androID:layout_wIDth="match_parent" androID:layout_height="50dp" androID:layout_margintop="100dp" androID:hint="请输入网址" androID:inputType="textUri" /> <button androID:ID="@+ID/btn_convert" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_alignParentBottom="true" androID:layout_centerHorizontal="true" androID:layout_marginBottom="20dp" androID:text="转换成二维码" /></relativeLayout>
②二维码展示页面
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" tools:context="com.tnNowu.androID.qrcode.MainActivity"> <ImageVIEw androID:ID="@+ID/iv_qrcode" androID:layout_wIDth="220dp" androID:layout_height="220dp" androID:layout_centerInParent="true" androID:layout_margintop="40dp" androID:background="#FFFFFF" /></relativeLayout>
源代码已上传至Github,https://github.com/cnwutianhao/QRCode
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android如何实现URL转换成二维码全部内容,希望文章能够帮你解决Android如何实现URL转换成二维码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)