Android开发中的二维码
2017-05-06 13:35
155 查看
1. 二维码的制作
关于二维码的制作,推荐草料二维码:http://cli.im/2. 二维码的组成
二维码是由黑白小点和左上左下右上三个正方形组成。黑白小点:黑点代表二进制里面的1,白点代表而进行里面的0。
正方形:限定了二维码的范围,扫描的时候必须把三个正方形放在扫描区域内。
二维码越密集,表示信息量越大,二维码越稀疏,表示信息量较少。
注意:二维码允许20%左右的区域被遮挡,此时根据算法依然可以扫描出正确内容。
3. 利用二维码第三方库ZXING进行Android开发
3.1 第三方jar包下载地址:
链接:http://pan.baidu.com/s/1c1WKN5m 密码:qjil
3.2 进行开发
3.2.1(以下步骤顺序不要变,否则可能会出错)1. 创建一个名为QR_code的项目,修改MainActivity和activity_main.xml:
MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button bt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initClick(); } private void initClick() { bt.setOnClickListener(this); } private void initView() { bt = (Button) findViewById(R.id.bt_scan); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.bt_scan: break; } } }
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.fkq.qr_code.MainActivity"> <Button android:id="@+id/bt_scan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="Scan" android:textSize="30sp" /> </RelativeLayout>
说明:创建一个Button的点击事件。
2. File-New-Import-Module,导入ZXINGCODELIBS项目。
3. 修改ZXINGCODELIBS项目的bulid.gradle,以下地方形式代码如下:
修改之后的apply: apply plugin: 'com.android.library'
删除了一行信息并且把依赖库的最低兼容版本和目标SDK版本修改为和主项目一致: defaultConfig { minSdkVersion 16 targetSdkVersion 25 }
数字部分和主项目一致 compileSdkVersion 25 buildToolsVersion "25.0.1"
4. 添加依赖库(File-Project Structure-Dependencies)
5. 修改主项目配置文件(如果不报manifest错误就忽视这一步骤):
manifest根标签内添加:
xmlns:tools="http://schemas.android.com/tools"
application标签上添加:
tools:replace="Android:icon, android:theme"
我的项目配置文件如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.fkq.qr_code"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" tools:replace="Android:icon, android:theme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
6. 同步Sync。
7. 删除依赖库ZXINGCODELIBS配置文件下的表示主程序的代码:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
8. 这个时候修改MainActivity和CaptureActivity里面的代码,添加按钮点击事件,跳转到CaptureActivity,也就是摄像头的页面,并且返回数据给页面,并对返回回来的数据做处理,并加入了运行时权限,测试手机为vivo x9i ,好像运行时权限不是特别管用,真机不像模拟器一样对运行时权限敏感,可能是私人定制的问题,大家如果对这部分有想法可以留言给我
MainActivity:
/** * 处理点击事件 * * @param view */ @Override public void onClick(View view) { switch (view.getId()) { case R.id.bt_scan: // 跳转页面需要返回一个结果 Intent intent = new Intent(this, CaptureActivity.class); startActivityForResult(intent, 1); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { //获取解析的数据 text = data.getStringExtra("text"); Log.e(TAG, "text:" + text); handleResult(text); } }
CaptureActivity:
public void handleDecode(Result rawResult, Bitmap barcode) { inactivityTimer.onActivity(); // ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler( // this, rawResult); boolean fromLiveScan = barcode != null; if (fromLiveScan) { // Then not from history, so beep/vibrate and we have an image to // draw on beepManager.playBeepSoundAndVibrate(); // drawResultPoints(barcode, rawResult); viewfinderView.drawResultBitmap(barcode); } String text = rawResult.getText(); Log.d(TAG, "result:::" + text); //讲扫描的结果返回给入口Activity Intent data = new Intent(); data.putExtra("text",text); setResult(RESULT_OK,data); finish(); }
handleResult()方法:
/** * 处理扫描结果 */ private void handleResult(String text) { //网址:http://或者是https:// //电话:tel:110 //信息:smsto:12589654123 //邮件:mailto:xx@163.com //应用市场:market:// //普通字符串: if (TextUtils.isEmpty(text)) { return; } if (text.startsWith("http://") || text.startsWith("https://")) { jumpToweb(); } else if (text.startsWith("tel:")) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1); } else { jumpTocall(); } } else if (text.startsWith("smsto:")) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 2); } else { jumpTosms(); } } else if (text.startsWith("mailto:")) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 3); } else { jumpTomail(); } } else if (text.startsWith("market://")) { jumpTomarket(); } else { //用弹窗展示信息,如果信息扫描不符合以上规范 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("扫描结果:");//标题 builder.setMessage(text);//内容 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { Toast.makeText(getApplicationContext(), "确定", Toast.LENGTH_SHORT).show(); } }); builder.show(); } } /** * 跳转到应用市场 */ private void jumpTomarket() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(text)); startActivity(intent); } /** * 发邮件(同样是SENDTO) */ private void jumpTomail() { try { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse(text)); startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } } /** * 跳转到发信息 */ private void jumpTosms() { try { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse(text)); startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } } /** * 跳转到打电话 */ private void jumpTocall() { try { Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse(text)); startActivity(intent); } catch (SecurityException e) { e.printStackTrace(); } } /** * 跳转浏览器记载网页 */ private void jumpToweb() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(text)); startActivity(intent); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { jumpTocall(); } else { Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show(); } break; case 2: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { jumpTosms(); } else { Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show(); } break; case 3: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { jumpTomail(); } else { Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show(); } break; default: } }
相关文章推荐
- android 二维码zxing开发之编译jar文件
- Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)
- Android 开发中使用到二维码生成和解析
- Android开发扫描和生成二维码功能
- android二维码开发的实用案例
- android开发(17) 扫描二维码 - 调用第三方APK来实现二维码扫描,参考自 开源项目zxing
- Android开发——通过扫描二维码,打开或者下载Android应用
- Android平台下利用zxing实现二维码开发
- Android平台下利用zxing实现二维码开发
- Android开发——通过扫描二维码,打开或者下载Android应用
- Android开发——通过扫描二维码,打开或者下载Android应用
- Android平台下利用zxing实现二维码开发
- Android开发之将字符串转化为二维码
- android开发 横向扫描二维码zxing
- Android平台下利用zxing实现二维码开发
- Android平台下利用zxing实现二维码开发
- Android平台下利用zxing实现二维码开发
- android 二维码开发,Camera竖屏问题
- Android开发_ZXing库二维码应用
- Android zxing二维码开发 横屏转竖屏