前言
现在无论什么APP都会有一个扫一扫的功能,网络上的各个软件的扫码功能也都大同小异,当然你想要自定义属于自己APP的扫码界面及功能的话,还是要花一番功夫的,不过做Demo,用第三方的就可以了。
正文
效果图
① 创建Android项目
创建好了。
②配置HMS SDK的maven仓库地址
打开工程目录下的build.gradle文件
a. 在allprojects ->repositories里面配置仓地址
allprojects { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } }
b. 在buildscript->repositories里面配置HMS SDK的maven仓地址
buildscript { repositories { google() jcenter() maven {url 'https://developer.huawei.com/repo/'} } }
c.在buildscript ->dependencies里面增加配置。
buildscript{ dependencies { classpath 'com.huawei.agconnect:agcp:1.2.1.301' } }
增加后如下图,只改动增加的,其他不动。
③ 添加编译依赖
打开应用级的build.gradle文件
引用SDK,Scan Kit提供两种SDK,您可以根据需求选择合适的SDK,
implementation 'com.huawei.hms:scan:1.1.3.301'//对SDK大小敏感的开发者 implementation 'com.huawei.hms:scanplus:1.1.3.301'//对SDK大小不敏感且希望所有机型均具备最佳体验的开发者
怎么看都是这个带了plus的牛逼一些,是因为scan对于非华为手机使用普通识别模型,而scanplus对非华为手机使用增强识别模型,虽然你感觉不到,不过就用plus了。
dependencies{ implementation 'com.huawei.hms:scanplus:1.1.3.301' }
在文件头添加配置
apply plugin: 'com.huawei.agconnect'
重新打开修改完的build.gradle文件,右上方出现“Sync Now”链接。点击“Sync Now”等待同步完成。如果出现错误,请检查网络连接是否正常,以及检查gradle文件是否正确。
④ 配置AndroidManifest.xml
打开AndroidManifest.xml文件
申请静态权限
<!--相机权限--> <uses-permission android:name="android.permission.CAMERA" /> <!--读文件权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!--使用特性--> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
在application标签内添加对扫码页面的声明
<activity android:name="com.huawei.hms.hmsscankit.ScanKitActivity" />
⑤ 实现功能
a. 修改activity_main.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/btn_scan" android:layout_width="match_parent" android:layout_height="60dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:text="扫一扫" /> </LinearLayout>
b. 添加标识和动态权限申请
public static final int CAMERA_REQ_CODE = 111; public static final int DECODE = 1; private static final int REQUEST_CODE_SCAN_ONE = 0X01;
在启动扫码Activity的地方添加动态权限申请
//权限请求 public void loadScanKitBtnClick(View view) { requestPermission(CAMERA_REQ_CODE, DECODE); } //编辑请求权限 private void requestPermission(int requestCode, int mode) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, requestCode); }
c. 在权限申请返回中启动扫码界面
//权限申请返回 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (permissions == null || grantResults == null) { return; } if (grantResults.length < 2 || grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) { return; } if (requestCode == CAMERA_REQ_CODE) { //启动扫描Acticity ScanUtil.startScan(this, REQUEST_CODE_SCAN_ONE, new HmsScanAnalyzerOptions.Creator().create()); } }
d. 在Activity回调中获取扫描码的结果
//Activity回调 @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 obj = data.getParcelableExtra(ScanUtil.RESULT); if (obj != null) { Toast.makeText(this,obj.originalValue,Toast.LENGTH_SHORT).show(); } } }
e. 修改activity_main.xml
android:onClick="loadScanKitBtnClick"
⑥ 运行起来
当然还有很多效果,你要自己去发掘