Android的通用模块、二维码模块
hy.common.android引入aar的方法
<activity android:name="com.google.zxing.client.android.CaptureActivity" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:theme="@style/CaptureTheme" android:windowSoftInputMode="stateAlwaysHidden"> <intent-filter> <action android:name="com.google.zxing.client.android.SCAN"/> <category android:name="android.intent.category.DEFAULT"/> <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:scheme="http" android:host="zxing.appspot.com" android:path="/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:scheme="http" android:host="www.google.com" android:path="/m/products/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:scheme="http" android:host="www.google.co.uk" android:path="/m/products/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:scheme="zxing" android:host="scan" android:path="/"/>
/** 二维码标记 */ private static final int $Result_Scan = 17081; Intent v_CaptureIntent = new Intent(MainActivity.this ,CaptureActivity.class); // 设置二维码编码。可选的,当不设置时,默认为ISO-8859-1 v_CaptureIntent.putExtra(Intents.Scan.CHARACTER_SET ,"GBK"); // 设置标题文字 v_CaptureIntent.putExtra(CaptureActivity.$Title ,"二维码"); startActivityForResult(v_CaptureIntent ,$Result_Scan);
@Override protected void onActivityResult(int i_RequestCode, int i_ResultCode, Intent i_Data) { // 扫描二维码回传 if ( i_RequestCode == $Result_Scan ) { if ( i_ResultCode == RESULT_OK && i_Data != null ) { // 码信息 String v_Content = i_Data.getStringExtra( CaptureActivity.$Decode_Content_Key); // 码类型(ture:二维码 false:条形码) boolean v_QRCodeType = i_Data.getBooleanExtra(CaptureActivity.$Decode_QRCodeType ,true); ... } } }
<string name="title_qrcode">改标题
/** 二维码的识别编码 */ private static final String $2DCharEncoding = "GBK"; /** 二维码识别后的转码的字符集 */ private static final String [] $2DCharEncodingTos = {"UTF-8" ,$2DCharEncoding ,"ISO-8859-1" ,"GB2312" ,"GB18030" ,"Big5" ,"ASCII" ,"UTF-16" ,"UTF-32" ,"Shift-JIS"}; /** * 简单判定文本是否为乱码 * * @param i_Text * @return */ private boolean isToCharEncodingError(String i_Text) { return StringHelp.isContains(i_Text ,"??" ,"�" ,"㼿" ,"ä" ,"�" ,"å" ,"§" ,"Ð" ,"¾",""); } // 转换编码,防止如中石油发票上二维码的乱码 String v_2DCE = ""; for (int i=0; i<$2DCharEncodingTos.length; i++) { v_2DCE = StringHelp.toCharEncoding(v_Content ,$2DCharEncoding ,$2DCharEncodingTos); if ( !isToCharEncodingError(v_2DCE) ) { break; } } if ( isToCharEncodingError(v_2DCE) ) { // 可能原本就是默认的编码,此判定必须放在最后 v_2DCE = v_Content; }
// true为竖屏; false为横屏 HYControl.$Direction = true;
v_Content = v_Content.trim(); if ( v_Content.toLowerCase().startsWith("http") ) { v_Content = v_Content.substring(0 ,5).toLowerCase() + v_Content.substring(5); }
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
public class MainActivity implements EasyPermissions.PermissionCallbacks { @AfterPermissionGranted($Permission_QRCode) private void permissionQRCode() { String [] perms = {Manifest.permission.CAMERA ,Manifest.permission.VIBRATE ,Manifest.permission.READ_EXTERNAL_STORAGE ,Manifest.permission.WRITE_EXTERNAL_STORAGE ,Manifest.permission.READ_PHONE_STATE}; if (!EasyPermissions.hasPermissions(this, perms)) { EasyPermissions.requestPermissions(this, "扫描二维码需要打开相机的权限", $Permission_QRCode, perms); } } @Override public void onPermissionsGranted(int requestCode, List perms) { // 获取成功的权限列表 } @Override public void onPermissionsDenied(int requestCode, List perms) { // 获取失败的权限列表 } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // EasyPermissions handles the request result. EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } }
以Android Studio为例
1. 将hy.common.android.aar拷贝到工程的lib目录中。2. 在build.gradle添加repositories节点 android { ... repositories { flatDir { dirs 'libs' } } } dependencies { ... }3. 在build.gradle中的节点添加编译的aar包 dependencies { # Grandle 4.0以上的版本用如下引用 implementation(name: 'hy.common.android', ext: 'aar') implementation(name: 'google.zxing.android', ext: 'aar') # 也可以用之前的老版本的写法,不过Android Studio会有提示 compile(name: 'hy.common.android', ext: 'aar') compile(name: 'google.zxing.android', ext: 'aar') }4. 同步更新配置到工程 [Tools] -> [Android] -> [Sync Project with Gradle Files]通用开发包二维码开发包google.zxing.android.aar下载 基本ZXing V3.3.1
二维码开发包的使用方法- 参见 [url=https://github.com/HY-ZhengWei/hy.common.android#%E5%BC%95%E5%85%A5aar%E7%9A%84%E6%96%B9%E6%B3%95]引入aar的方法
- AndroidManifest.xml 中添加
<activity android:name="com.google.zxing.client.android.CaptureActivity" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:theme="@style/CaptureTheme" android:windowSoftInputMode="stateAlwaysHidden"> <intent-filter> <action android:name="com.google.zxing.client.android.SCAN"/> <category android:name="android.intent.category.DEFAULT"/> <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:scheme="http" android:host="zxing.appspot.com" android:path="/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:scheme="http" android:host="www.google.com" android:path="/m/products/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:scheme="http" android:host="www.google.co.uk" android:path="/m/products/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:scheme="zxing" android:host="scan" android:path="/"/>
- 打开二维码、条形码界面
/** 二维码标记 */ private static final int $Result_Scan = 17081; Intent v_CaptureIntent = new Intent(MainActivity.this ,CaptureActivity.class); // 设置二维码编码。可选的,当不设置时,默认为ISO-8859-1 v_CaptureIntent.putExtra(Intents.Scan.CHARACTER_SET ,"GBK"); // 设置标题文字 v_CaptureIntent.putExtra(CaptureActivity.$Title ,"二维码"); startActivityForResult(v_CaptureIntent ,$Result_Scan);
- 获取二维码、条形码的信息
@Override protected void onActivityResult(int i_RequestCode, int i_ResultCode, Intent i_Data) { // 扫描二维码回传 if ( i_RequestCode == $Result_Scan ) { if ( i_ResultCode == RESULT_OK && i_Data != null ) { // 码信息 String v_Content = i_Data.getStringExtra( CaptureActivity.$Decode_Content_Key); // 码类型(ture:二维码 false:条形码) boolean v_QRCodeType = i_Data.getBooleanExtra(CaptureActivity.$Decode_QRCodeType ,true); ... } } }
- (可选)更改界面的上任一文字信息,如改标题 打开values/string_hy.xml中的信息,在新的App应用中,
在values/string.xml覆盖重写即可
<string name="title_qrcode">改标题
- (可选)中文识别
/** 二维码的识别编码 */ private static final String $2DCharEncoding = "GBK"; /** 二维码识别后的转码的字符集 */ private static final String [] $2DCharEncodingTos = {"UTF-8" ,$2DCharEncoding ,"ISO-8859-1" ,"GB2312" ,"GB18030" ,"Big5" ,"ASCII" ,"UTF-16" ,"UTF-32" ,"Shift-JIS"}; /** * 简单判定文本是否为乱码 * * @param i_Text * @return */ private boolean isToCharEncodingError(String i_Text) { return StringHelp.isContains(i_Text ,"??" ,"�" ,"㼿" ,"ä" ,"�" ,"å" ,"§" ,"Ð" ,"¾",""); } // 转换编码,防止如中石油发票上二维码的乱码 String v_2DCE = ""; for (int i=0; i<$2DCharEncodingTos.length; i++) { v_2DCE = StringHelp.toCharEncoding(v_Content ,$2DCharEncoding ,$2DCharEncodingTos); if ( !isToCharEncodingError(v_2DCE) ) { break; } } if ( isToCharEncodingError(v_2DCE) ) { // 可能原本就是默认的编码,此判定必须放在最后 v_2DCE = v_Content; }
- (可选)横屏、竖屏的改变
// true为竖屏; false为横屏 HYControl.$Direction = true;
- 注意:网址http前缀转小写后,才能正确调用系统浏览器打开网址。并且前后不能有空格。
v_Content = v_Content.trim(); if ( v_Content.toLowerCase().startsWith("http") ) { v_Content = v_Content.substring(0 ,5).toLowerCase() + v_Content.substring(5); }
- 固有权限在 AndroidManifest.xml 中配置
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
- 动态权限的申请 用 EasyPermissions 来动态申请
public class MainActivity implements EasyPermissions.PermissionCallbacks { @AfterPermissionGranted($Permission_QRCode) private void permissionQRCode() { String [] perms = {Manifest.permission.CAMERA ,Manifest.permission.VIBRATE ,Manifest.permission.READ_EXTERNAL_STORAGE ,Manifest.permission.WRITE_EXTERNAL_STORAGE ,Manifest.permission.READ_PHONE_STATE}; if (!EasyPermissions.hasPermissions(this, perms)) { EasyPermissions.requestPermissions(this, "扫描二维码需要打开相机的权限", $Permission_QRCode, perms); } } @Override public void onPermissionsGranted(int requestCode, List perms) { // 获取成功的权限列表 } @Override public void onPermissionsDenied(int requestCode, List perms) { // 获取失败的权限列表 } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // EasyPermissions handles the request result. EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } }
- 本模块引用 zxing.jar 包,其源码链接如下
扫描二维码,手机查看
声明:本文来源于互联网,观点仅代表作者本人,不代表欢乐你我,真实性请妥善甄别。