生成二维码、识别二维码

public class MainActivity  extends AppCompatActivity  implements View.OnClickListener{
    private Button  btn_create, btn_scanner;
    private ImageView  imageView;
    private EditText  et;
    private String  time;
    private File  file null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout. activity_main);
        btn_create = (Button) findViewById(R.id. btn_create);
        btn_scanner = (Button) findViewById(R.id. btn_scanner);
        imageView = (ImageView) findViewById(R.id. image);
        et = (EditText) findViewById(R.id. editText);



        btn_create.setOnClickListener( this);
        btn_scanner.setOnClickListener( this);
        imageView.setOnLongClickListener( new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                saveCurrentImage();
                return true;
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id. btn_create:
                String msg =  et.getText().toString();
                if(TextUtils. isEmpty(msg)){
                    Toast. makeText(MainActivity. this"请输入信息", Toast. LENGTH_LONG).show();
                    return;
                }
                //生成二维码图片,第一个参数是二维码的内容,第二个参数是正方形图片的边长,单位是像素
                Bitmap bitmap =  null;
                try {
                    bitmap = BitmapUtil. createQRCode(msg,  400);
                }  catch (WriterException e) {
                    //  TODO Auto-generated catch block
                    e.printStackTrace();
                }
                imageView.setImageBitmap(bitmap);
                break;

            case R.id. btn_scanner:
                /* Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                startActivity(intent);*/
                break;

            default:
                break;
        }
    }

    //这种方法状态栏是空白,显示不了状态栏的信息
    private void saveCurrentImage()
    {
        //获取当前屏幕的大小
        int width = getWindow().getDecorView().getRootView().getWidth();
        int height = getWindow().getDecorView().getRootView().getHeight();
        //生成相同大小的图片
        Bitmap temBitmap = Bitmap. createBitmap( width, height, Bitmap.Config. ARGB_8888 );
        //找到当前页面的根布局
        View view =  getWindow().getDecorView().getRootView();
        //设置缓存
        view.setDrawingCacheEnabled( true);
        view.buildDrawingCache();
        //从缓存中获取当前屏幕的图片,创建一个DrawingCache的拷贝,因为DrawingCache得到的位图在禁用后会被回收
        temBitmap = view.getDrawingCache();
        SimpleDateFormat df =  new SimpleDateFormat( "yyyymmddhhmmss");
        time = df.format( new Date());
        if(Environment. MEDIA_MOUNTED.equals(Environment. getExternalStorageState())){
            file new File(Environment. getExternalStorageDirectory().getAbsolutePath() +  "/screen", time ".png");
            if(! file.exists()){
                file.getParentFile().mkdirs();
                try {
                    file.createNewFile();
                }  catch (IOException e) {
                    //  TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            FileOutputStream fos =  null;
            try {
                fos =  new FileOutputStream( file);
                temBitmap.compress(Bitmap.CompressFormat. PNG100, fos);
                fos.flush();
                fos.close();
            }  catch (FileNotFoundException e) {
                e.printStackTrace();
            }  catch (IOException e) {
                //  TODO Auto-generated catch block
                e.printStackTrace();
            }
            new Thread( new Runnable() {
                @Override
                public void run() {
                    String path = Environment. getExternalStorageDirectory().getAbsolutePath() +  "/screen/" time ".png";
                    final Result result = parseQRcodeBitmap(path);
                    file.delete();
                    runOnUiThread( new Runnable() {
                        public void run() {
                            // Toast.makeText(MainActivity.this, result.toString(), Toast.LENGTH_LONG).show();
                            Intent intent =  new Intent();
                            intent.setAction( "android.intent.action.VIEW");
                            Uri content_url = Uri. parse( result.toString());
                            intent.setData(content_url);
                            startActivity(intent);
                        }
                    });
                }
            }).start();
            //禁用DrawingCahce否则会影响性能 ,而且不禁止会导致每次截图到保存的是第一次截图缓存的位图
            view.setDrawingCacheEnabled( false);
        }
    }

    //解析二维码图片,返回结果封装在Result对象中
    private Result  parseQRcodeBitmap(String bitmapPath){
        //解析转换类型UTF-8
        Hashtable<DecodeHintType, String> hints =  new Hashtable<DecodeHintType, String>();
        hints.put(DecodeHintType. CHARACTER_SET"utf-8");
        //获取到待解析的图片
        BitmapFactory.Options options =  new BitmapFactory.Options();
        //如果我们把inJustDecodeBounds设为true,那么BitmapFactory.decodeFile(String path, Options opt)
        //并不会真的返回一个Bitmap给你,它仅仅会把它的宽,高取回来给你
        options. inJustDecodeBounds true;
        //此时的bitmap是null,这段代码之后,options.outWidth 和 options.outHeight就是我们想要的宽和高了
        Bitmap bitmap = BitmapFactory. decodeFile(bitmapPath,options);
        //我们现在想取出来的图片的边长(二维码图片是正方形的)设置为400像素
        //以上这种做法,虽然把bitmap限定到了我们要的大小,但是并没有节约内存,如果要节约内存,我们还需要使用inSimpleSize这个属性
        options. inSampleSize = options. outHeight 400;
        if(options. inSampleSize <=  0){
            options. inSampleSize 1//防止其值小于或等于0
        }
        /**
         * 辅助节约内存设置
         *
         * options.inPreferredConfig = Bitmap.Config.ARGB_4444;    // 默认是Bitmap.Config.ARGB_8888
         * options.inPurgeable = true;
         * options.inInputShareable = true;
         */
        options. inJustDecodeBounds false;
        bitmap = BitmapFactory. decodeFile(bitmapPath, options);
        //新建一个RGBLuminanceSource对象,将bitmap图片传给此对象
        RGBLuminanceSource rgbLuminanceSource =  new RGBLuminanceSource(bitmap);
        //将图片转换成二进制图片
        BinaryBitmap binaryBitmap =  new BinaryBitmap( new HybridBinarizer(rgbLuminanceSource));
        //初始化解析对象
        QRCodeReader reader =  new QRCodeReader();
        //开始解析
        Result result =  null;
        try {
            result = reader.decode(binaryBitmap, hints);
        }  catch (Exception e) {
            //  TODO: handle exception
        }
        return result;
    }
}




public class BitmapUtil {
    /**
     * 生成一个二维码图像
     *
     *  @param  url
      *            传入的字符串,通常是一个URL
     *  @param  QR_WIDTH
      *            宽度(像素值px)
     *  @param  QR_HEIGHT
      *            高度(像素值px)
     *  @return
      */
    public static final Bitmap create2DCoderBitmap(String url,  int QR_WIDTH,
                                                    int QR_HEIGHT) {
        try {
            // 判断URL合法性
            if (url ==  null ||  "".equals(url) || url.length() <  1) {
                return null;
            }
            Hashtable<EncodeHintType, String> hints =  new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType. CHARACTER_SET"UTF-8");
            // 图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix =  new QRCodeWriter().encode(url,
                    BarcodeFormat. QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
            int[] pixels =  new int[QR_WIDTH * QR_HEIGHT];
            // 下面这里按照二维码的算法,逐个生成二维码的图片,
            // 两个for循环是图片横列扫描的结果
            for ( int y =  0; y < QR_HEIGHT; y++) {
                for ( int x =  0; x < QR_WIDTH; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * QR_WIDTH + x] =  0xff000000;
                    }  else {
                        pixels[y * QR_WIDTH + x] =  0xffffffff;
                    }
                }
            }
            // 生成二维码图片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap. createBitmap(QR_WIDTH, QR_HEIGHT,
                    Bitmap.Config. ARGB_8888);
            bitmap.setPixels(pixels,  0, QR_WIDTH,  00, QR_WIDTH, QR_HEIGHT);
            // 显示到一个ImageView上面
            // sweepIV.setImageBitmap(bitmap);
            return bitmap;
        }  catch (WriterException e) {
            Log. i( "log""生成二维码错误" + e.getMessage());
            return null;
        }
    }

    private static final int  BLACK 0xff000000;

    /**
     * 生成一个二维码图像
     *
     *  @param  url
      *            传入的字符串,通常是一个URL
     *  @param  widthAndHeight
      *           图像的宽高
     *  @return
      */
    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");
        try {
            str =  new String(str.getBytes( "UTF-8"),  "ISO-8859-1");
        }  catch (UnsupportedEncodingException e) {
            //  TODO Auto-generated catch block
            e.printStackTrace();
        }
        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,  00, width, height);
        return bitmap;
    }
}





public class RGBLuminanceSource  extends LuminanceSource {

    private byte bitmapPixels[];

    protected RGBLuminanceSource(Bitmap bitmap) {
        super(bitmap.getWidth(), bitmap.getHeight());

        // 首先,要取得该图片的像素数组内容
        int[] data = new int[bitmap.getWidth() * bitmap.getHeight()];
        this.bitmapPixels new byte[bitmap.getWidth() * bitmap.getHeight()];
        bitmap.getPixels(data, 0, getWidth(), 00, getWidth(), getHeight());

        // 将int数组转换为byte数组,也就是取像素值中蓝色值部分作为辨析内容
        for (int i = 0; i < data.length; i++) {
            this.bitmapPixels[i] = (byte) data[i];
        }
    }

    @Override
    public byte[] getMatrix() {
        // 返回我们生成好的像素数据
        return bitmapPixels;
    }

    @Override
    public byte[] getRow(int y, byte[] row) {
        // 这里要得到指定行的像素数据
        System.arraycopy(bitmapPixels, y * getWidth(), row, 0, getWidth());
        return row;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值