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

来源:互联网 发布:c语言公开课 编辑:程序博客网 时间:2024/06/05 00:10

    二维码生成扫描仪应用程序详解。作品已上线地址为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”));        }}    }}
最终效果如图:



0 5
原创粉丝点击