用google zxing生成二维码和扫描二维码

    二维码生成扫描仪应用程序详解。作品已上线地址为http://android.myapp.com/myapp/detail.htm?apkName=cn.erweima.creat。可以下载玩玩看下效果。


    笔者的这个App采用的是zxing生成和扫描。然后支持将生成的二维码分享,比如说是朋友圈,QQ空间等,分享功能不使用集成任何第三方,
采用系统原生功能进行分享。

    首先集成zxing的core-3.0.0.jar文件和源码。源码应该放在包的根节点下。如图:

代码已上传地址为http://download.csdn.net/detail/u013692888/9644278.google.zxing.client.android包名别改变。在AndroidManifest.xml里配置google的活动和必要的权限。

  <uses-permission android:name =“android.permission.WRITE_EXTERNAL_STORAGE”/>
    <uses-permission android:name =“android.permission.MOUNT_UNMOUNT_FILESYSTEMS”> </ uses-permission>
    <uses-permission android:name =“android.permission.INTERNET”> </ uses-permission>
    <uses-permission android:name =“android.permission.VIBRATE”/>
    <uses-permission android:name =“android.permission.FLASHLIGHT”/>
    <uses-permission android:name =“android.permission.CAMERA”/>
    <uses-permission android:name =“android.permission.CAMERA”/>
    <uses-feature android:name =“android.hardware.camera”/>
    <uses-feature android:name =“android.hardware.camera.autofocus”/>
        <! -  Zxing  - >
        <活动
            android:name =“google.zxing.client.android.MipcaActivityCapture”
            android:configChanges =“orientation | keyboardHidden”
            android:screenOrientation =“portrait”
            android:theme =“@ android:style / Theme.Translucent.NoTitleBar”
            android:windowSoftInputMode =“stateAlwaysHidden”>
        </ activity>

生成二维码代码如下:

/ **
     * *生成QRCode(二维码)
     * @throws WriterException
     * /
    public static Bitmap createQRCode(String url)throws WriterException {
        if(url == null || url.equals(“”)){
            return null;
        }}
        Hashtable hints = new Hashtable();
        hints.put(EncodeHintType.CHARACTER_SET,“UTF-8”);
        //生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
        BitMatrix matrix = new MultiFormatWriter()。encode(url,
                BarcodeFormat.QR_CODE,width,width,hints);
        int width = matrix.getWidth();
        int height1 = matrix.getHeight();
        int height = height1;
        //二维矩阵转为一维像素数组,也就是一直横着排了
        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)){
                    像素[y * width + x] = 0xff000000;
                }其他{
                    像素[y * width + x] = 0xffffffff;
                }}
            }}
        }}
        位图位图= Bitmap.createBitmap(width,height,
                Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels,0,width,0,0,width,height);
        返回位图;
    }}
生成后保存二维码到本地以便于分享
/ **
     *保存二维码
     * @throws IOException
     * /
    public void saveMyBitmap()throws IOException {
        String path = Environment.getExternalStorageDirectory()。getPath()+“/ erweima /”;
        文件文件=新文件(路径);
        if(!file.exists()){
            file.mkdir();
        }}
        File f = new File(path +“erweima.png”);
        f.createNewFile();
        FileOutputStream fOut = null;
        尝试{
            fOut = new FileOutputStream(f);
        } catch(FileNotFoundException e){
            e.printStackTrace();
        }}
        mBitmap.compress(Bitmap.CompressFormat.PNG,100,fOut);
        尝试{
            fOut.flush();
        } catch(IOException e){
            e.printStackTrace();
        }}
        尝试{
            fOut.close();
        } catch(IOException e){
            e.printStackTrace();
        }}
    }}

分享是自定义菜单菜单
    <item
        android:id =“@ + id / action_share”
        android:title =“@ string / share”
        app:actionProviderClass =“android.support.v7.widget.ShareActionProvider”
        app:showAsAction =“ifRoom”>
    </ item>
在活动的创建菜单方法设置菜单为自定义的菜单。然后实例化ShareActionProvider对象。
    @覆盖
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater()。inflate(R.menu.menu,menu);
        mShareActionProvider =(ShareActionProvider)MenuItemCompat.getActionProvider(menu
                .findItem(R.id.action_share));
        showShare();
        return true;
    }}
   public void showShare(){
        文件file = new File(Environment.getExternalStorageDirectory()。getPath()+“/ erweima / erweima.png”);
        mIntent = new Intent(Intent.ACTION_SEND);
        mIntent.setType(“image / *”);
        Uri uri = Uri.fromFile(file);
        mIntent.putExtra(Intent.EXTRA_STREAM,uri);
        mIntent.putExtra(Intent.EXTRA_TEXT,“来自二维码的分享”);
        mShareActionProvider.setShareIntent(mIntent);
    }}
分享搞定,关键就是ShareActionProvider这个类的用法,都是调用的Api,不好解释。就放上代码看一下。

然后是扫描代码,扫描代码调用如下。

//调用二维码代码
                Intent openCameraIntent = new Intent(getActivity(),
                        MipcaActivityCapture.class);
                getActivity()。startActivityForResult(openCameraIntent,1212);
通过读MipcaActivityCapture类的onResultHandler方法可以知道返回的是reult,code is 1212.在原活动接收就行了。
private void onResultHandler(String resultString,Bitmap bitmap){
        if(TextUtils.isEmpty(resultString)){
            Toast.makeText(MipcaActivityCapture.this,“Scan failed!”,Toast.LENGTH_SHORT).show();
            返回;
        }}
        Intent resultIntent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putString(“result”,resultString);
        bundle.putParcelable(“bitmap”,bitmap);
        resultIntent.putExtras(bundle);
        this.setResult(1211,resultIntent);
        MipcaActivityCapture.this.finish();
    }}


    @覆盖
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
        super.onActivityResult(requestCode,resultCode,data);
        if(requestCode == 1212 && data!= null){
            mFragmentScan.refreshUi(data.getStringExtra(“result”));
        }}
    }}
最终效果如图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值