古代生存离不开网络。在餐厅、商场等公共场所,手机连贯 WiFi 始终是高频应用场景。尽管公共场所的收费 WiFi 越来越多,但网络连接过程却很麻烦。有的须要关上网页注册或点击广告链接能力上网,还有的要求下载特定 App 能力连贯。
那么有没有什么更不便的联网形式呢?“扫码联网”提出了解决方案,商家能够在店搁置蕴含 WiFi 信息的二维码。用户关上手机相机扫码即可连贯 WiFi,还反对将二维码分享给身边好友,使入网更快、更直观,并且无需放心隐衷泄露、被推送无用信息等问题。
成果展现
实现原理
通过 HMS Core 对立扫码服务的码生成和扫码能力,轻松实现扫码连 WiFi 这一场景。
开发实战
一、构建扫码性能
开发筹备
1.1 配置华为 Maven 仓地址
在我的项目中“buildscript > repositories”中配置 HMS Core SDK 的 Maven 仓地址。在“allprojects > repositories”中配置 HMS Core SDK 的 Maven 仓地址。
buildscript {
repositories {google()
jcenter()
// 配置 HMS Core SDK 的 Maven 仓地址。maven {url 'https://developer.huawei.com/repo/'}
}
}
allprojects {
repositories {google()
jcenter()
// 配置 HMS Core SDK 的 Maven 仓地址。maven {url 'https://developer.huawei.com/repo/'}
}
}
Gradle 7.0 版本后,“allprojects > repositories”配置已迁徙到我的项目级“settings.gradle”文件中。“settings.gradle”文件配置示例如下:dependencyResolutionManagement {
...
repositories {google()
jcenter()
maven {url 'https://developer.huawei.com/repo/'}
}
}
1.2 增加编译依赖
地位利用 build.gradle
dependencies{
//Scan SDK
implementation 'com.huawei.hms:scan:2.3.0.300'
}
1.3 代码混同
在利用级根目录下关上混同配置文件“proguard-rules.pro”,退出排除 HMS Core SDK 的混同配置脚本。
-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.huawei.hianalytics.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;}
1.4 Manifest.xml 增加权限
<!-- 相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 文件读取权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
1.5 申请动静权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, requestCode);
1.6 申请权限后果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (permissions == null || grantResults == null) {return;}
// 申请权限胜利或已有权限
if (requestCode == CAMERA_REQ_CODE) {
// Default View Mode 形式扫码接口
// 参数阐明:// activity 申请扫码的 activity
// requestCode 扫码申请的申请码,用于鉴定 activity 返回时是否从扫码界面返回。// option 扫码格局选项,能够置为“null”ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, new HmsScanAnalyzerOptions.Creator().create());
}
}
1.7 回调接口接管扫码后果,相机扫码和导入图片扫码均通过该接口返回。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK || data == null) {return;}
if (requestCode == REQUEST_CODE_SCAN_ONE) {
// 导入图片扫描返回后果
HmsScan hmsScan = data.getParcelableExtra(ScanUtil.RESULT);
if (hmsScan != null) {
// 码值后果 rawResult 自定义 TextView
rawResult.setText(hmsScan.getOriginalValue());
}
}
}
二、构建码生成性能
构建扫码性能同样须要配置 Marven 仓地址,增加编译依赖和配置混同脚本,参考上方 1.1,1.2 和 1.3
2.1 Manifest.xml 增加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.2 申请动静权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},requestCode);
2.3 申请权限后果
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {if (permissions == null || grantResults == null) {return;}
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && requestCode == GENERATE_CODE) {Intent intent = new Intent(this, GenerateCodeActivity.class);
this.startActivity(intent);
}
}
2.4 生成二维码
public void generateCodeBtnClick(View v) {
try {HmsBuildBitmapOption options = new HmsBuildBitmapOption.Creator()
.setBitmapMargin(margin)
.setBitmapColor(color)
.setBitmapBackgroundColor(background)
.create();
resultImage = ScanUtil.buildBitmap(content, type, width, height, options);
barcodeImage.setImageBitmap(resultImage);
} catch (WriterException e) {Toast.makeText(this, "Parameter Error!", Toast.LENGTH_SHORT).show();}
}
2.5 保留二维码
public void saveCodeBtnClick(View v) {if (resultImage == null) {Toast.makeText(GenerateCodeActivity.this, "Please generate barcode first!", Toast.LENGTH_LONG).show();
return;
}
try {String fileName = System.currentTimeMillis() + ".jpg";
String storePath = Environment.getExternalStorageDirectory().getAbsolutePath();
File appDir = new File(storePath);
if (!appDir.exists()) {appDir.mkdir();
}
File file = new File(appDir, fileName);
FileOutputStream fileOutputStream = new FileOutputStream(file);
boolean isSuccess = resultImage.compress(Bitmap.CompressFormat.JPEG, 70, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
Uri uri = Uri.fromFile(file);
GenerateCodeActivity.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
if (isSuccess) {Toast.makeText(GenerateCodeActivity.this, "Barcode has been saved locally", Toast.LENGTH_LONG).show();} else {Toast.makeText(GenerateCodeActivity.this, "Barcode save failed", Toast.LENGTH_SHORT).show();}
} catch (Exception e) {Toast.makeText(GenerateCodeActivity.this, "Unkown Error", Toast.LENGTH_SHORT).show();}
}
欲了解更多 HMS Core 对立扫码服务详情,请参阅:
https://developer.huawei.com/…
华为开发者联盟官网
获取开发领导文档
参加开发者探讨请到 Reddit 社区
下载 demo 和示例代码请到 Github
解决集成问题请到 Stack Overflow