关于二维码和动态权限申请的一些功能实现

来源:互联网 发布:les聊天软件 编辑:程序博客网 时间:2024/05/19 03:42

1.首先导入依赖zxinglibrary     然后再Moudle依赖一下

   考虑到安卓6.0的权限申请,使用到一个第三方的动态权限申请.

   网址:https://github.com/yanzhenjie/AndPermission/blob/master/README-CN.md

 

   导入依赖:

compile 'com.yanzhenjie:permission:1.1.0'
  

2.在需要使用相机,打电话的地方加入代码申请权限

// ActivityAndPermission.with(this)        .requestCode(100)        .permission(Permission.CAMERA)        .start();3.跳转Activity,实现扫一扫功能.
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);startActivity(intent);



/************************二维码的生成功能**************************/

如果上一个扫一扫你导入了Moudle ,那就不用在导入依赖啥了

1>.首先写一个工具类,可以生成各种二维码

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;        }    }    /**     * bitmap的颜色代替黑色的二维码     *     * @param text     * @param size     * @param mBitmap     * @return     */    public static Bitmap createQRCodeWithLogo2(String text, int size, Bitmap mBitmap) {        try {            IMAGE_HALFWIDTH = size / 10;            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);            BitMatrix bitMatrix = new QRCodeWriter().encode(text,                    BarcodeFormat.QR_CODE, size, size, hints);            //logo图片按martix设置的信息缩放            mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false);            int[] pixels = new int[size * size];            int color = 0xffffffff;            for (int y = 0; y < size; y++) {                for (int x = 0; x < size; x++) {                    if (bitMatrix.get(x, y)) {                        pixels[y * size + x] = mBitmap.getPixel(x, y);                    } else {                        pixels[y * size + x] = color;                    }                }            }            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;        }    }    /**     * bitmap作为底色     *     * @param text     * @param size     * @param mBitmap     * @return     */    public static Bitmap createQRCodeWithLogo3(String text, int size, Bitmap mBitmap) {        try {            IMAGE_HALFWIDTH = size / 10;            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);            BitMatrix bitMatrix = new QRCodeWriter().encode(text,                    BarcodeFormat.QR_CODE, size, size, hints);            //logo图片按martix设置的信息缩放            mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false);            int[] pixels = new int[size * size];            int color = 0xfff92736;            for (int y = 0; y < size; y++) {                for (int x = 0; x < size; x++) {                    if (bitMatrix.get(x, y)) {                        pixels[y * size + x] = color;                    } else {                        pixels[y * size + x] = mBitmap.getPixel(x, y) & 0x66ffffff;                    }                }            }            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;        }    }    /**     * 比方法2的颜色黑一些     *     * @param text     * @param size     * @param mBitmap     * @return     */    public static Bitmap createQRCodeWithLogo4(String text, int size, Bitmap mBitmap) {        try {            IMAGE_HALFWIDTH = size / 10;            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);            BitMatrix bitMatrix = new QRCodeWriter().encode(text,                    BarcodeFormat.QR_CODE, size, size, hints);            //logo图片按martix设置的信息缩放            mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false);            int[] pixels = new int[size * size];            boolean flag = true;            for (int y = 0; y < size; y++) {                for (int x = 0; x < size; x++) {                    if (bitMatrix.get(x, y)) {                        if (flag) {                            flag = false;                            pixels[y * size + x] = 0xff000000;                        } else {                            pixels[y * size + x] = mBitmap.getPixel(x, y);                            flag = true;                        }                    } 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的二维码     * @param text     * @param size     * @param mBitmap     * @return     */    public static Bitmap createQRCodeWithLogo5(String text, int size, Bitmap mBitmap) {        try {            IMAGE_HALFWIDTH = size / 10;            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);            BitMatrix bitMatrix = new QRCodeWriter().encode(text,                    BarcodeFormat.QR_CODE, size, size, hints);            //logo图片按martix设置的信息缩放            mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false);            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] = 0xff37b19e;                        } 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的二维码     * @param text     * @param size     * @param mBitmap     * @return     */    public static Bitmap createQRCodeWithLogo6(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);            //logo图片按martix设置的信息缩放            mBitmap = Bitmap.createScaledBitmap(mBitmap, size, size, false);            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] = 0xff111111;                            if(x<115&&(y<115||y>=size-115)||(y<115&&x>=size-115)){                                pixels[y * size + x] = 0xfff92736;                            }                        } 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;        }    }}

2.在点击事件里生成二维码,其实就是为ImageView设置BitMap

例如:

mImage.setImageBitmap(QRCode.createQRCodeWithLogo5(pathXiGua,500,drawableToBitmap(getResources().getDrawable(R.mipmap.ic_launcher))));
第一个参数是一个网址,随意写了

第二个是生成图片的尺寸  ,特别修改可以看工具类里的设定

第三个参数是本地图片的BitMap 作为本二维码的Logo,这里是自定义的一个获取本地图片BitMap的方法.

public static Bitmap drawableToBitmap(Drawable drawable) {    if (drawable instanceof BitmapDrawable) {        return ((BitmapDrawable) drawable).getBitmap();    }    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);    Canvas canvas = new Canvas(bitmap);    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());    drawable.draw(canvas);    return bitmap;}





原创粉丝点击