二维码生成扫描仪应用程序详解。作品已上线地址为http://android.myapp.com/myapp/detail.htm?apkName=cn.erweima.creat。可以下载玩玩看下效果。
采用系统原生功能进行分享。
首先集成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”));
}}
}}
最终效果如图: