別再問WiFi密碼了,HMS Core統一掃碼服務讓手機一鍵聯網


現代生活離不開網絡。在餐廳、商場等公共場所,手機連接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/consumer/cn/doc/development/HMSCore-Guides/service-introduction-0000001050041994?ha_source=hms1

華為開發者聯盟官網
獲取開發指導文檔
參與開發者討論請到Reddit社區
下載demo和示例代碼請到Github
解決集成問題請到Stack Overflow


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM