二维码已经出现在我们周围不少地方了,一般都是用手机软件扫码二维码,那么我们如何去给手机应用增加一个扫码二维码的功能呢?
网上有很多zxing包的使用方法,但是多数都不够详细。现在我从一个新手角度去做,如何把zxing包应用到项目中。
建议先建一个测试工程,里面只放一个按钮(或者加一个显示扫码结果的框,这里我们只用土司的方法显示),加上事件响应。
这是模拟器上的界面,点击Button就可以打开相机扫码
模拟器调用的是 电脑的前置,所以成了这样,在手机上是竖屏的.
下面我们看看代码部分吧
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//扫码的按钮
public void btn1(View v) {
//声明一个活动跳转器,设置mainAcitivy与CaptureActivity之间跳转
Intent intent = new Intent(this, CaptureActivity.class);
startActivityForResult(intent,
CaptureActivity.CaptureActivity_Scan_requestCode);
}
//获得结果的按钮
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//用土司显示,msg在CaptureActivity中可以找到
//如果有其他活动,通过requestCode去区分
Toast.makeText(this, data.getStringExtra("msg"), 1).show();
}
}
这里很简单,但是扫码二维码还需要手机提供权限所以我们要在AndroidManifest.xml中注册活动和申请权限
申请如下权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
注册活动:
<activity
android:name="com.libs.zxing.CaptureActivity"
android:clearTaskOnLaunch="true"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
android:stateNotNeeded="true"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" >
<intent-filter>
<action android:name="com.google.zxing.client.android.SCAN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- Allow web apps to launch Barcode Scanner by linking to http://zxing.appspot.com/scan. -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="zxing.appspot.com"
android:path="/scan"
android:scheme="http" />
</intent-filter>
<!-- We also support a Google Product Search URL. -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="www.google.com"
android:path="/m/products/scan"
android:scheme="http" />
</intent-filter>
<!-- And the UK version. -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="www.google.co.uk"
android:path="/m/products/scan"
android:scheme="http" />
</intent-filter>
<!-- Support zxing://scan/?... like iPhone app -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="scan"
android:path="/"
android:scheme="zxing" />
</intent-filter>
</activity>
最后只剩下导包了。因为本身包比较大,而我们应用又用不着这么多的功能,所以我们就以外部工程依赖的方法来使用zxing包。
下载我提供的压缩包,然后解压出来,导入到JDT工程中
既然说是新手,那教一下如何导入工程吧
File -> Import ->选中Gengral下的 ->next ->新界面的Browse ->然后找到刚刚解压的文件夹确定就可以了
资源管理器就有这个工程了
接下来我们用测试项目(我的项目名叫xx)
对着项目名右键->Propertirs ->选择Android,在Lirbrary右边点Add,选中工程ZXingCodeLibs就可以了。
然后你的测试项目就可以运行了,如果出现提示错误记得考虑导包。
还有就是如果进了相加你却按返回不扫码的会应用会闪退,这是因为你没有处理活动无结果
在刚才的java代码里有提到requestCode,它用来区分活动结果属于哪一个所以,我们在onActivityResult方法中加入这个判断就可以了。实际上它对活动结果无结果是不处理
if (requestCode == CaptureActivity.CaptureActivity_Scan_requestCode) {
if (resultCode == CaptureActivity.CaptureActivity_Scan_resultCode) {
String str = data.getStringExtra("msg");
//这里填入你对扫码结果str的处理
}
}