古代生存离不开网络。在餐厅、商场等公共场所,手机连贯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