現代生活離不開網路。在餐廳、商場等公共場所,手機連線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統一掃碼服務詳情,請參閱:
華為開發者聯盟官網
獲取開發指導文件
參與開發者討論請到Reddit社群
下載demo和示例程式碼請到Github
解決整合問題請到Stack Overflow