既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
💖💖步骤3:项目MSC能力导入
完成了工程项目的搭建后,我们需要在项目工程中集成开放平台的MSC能力,具体步骤如下:
首先,将MSC能力包文件mscability-release.aar文件拷贝到项目工程的/app/libs目录下;
然后,解压从讯飞开放平台下载的人脸识别SDK能力包,在libs目录下找到Msc.jar文件,拷贝到项目工程目录/app/libs目录下;接着,将SDK能力包libs目录下的所有armeabi目录拷贝到工程目录/app/src/main/jniLibs下(若没有这个目录,自己创建)。整体目录结构如下:
完成SDK的集成后,我们需要再编译配置文件中进行能力包的导入配置,打开app目录下的build.gradle文件,添加下图中红框位置中代码
完整的build.gradle文件如下所示:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.starway.starrobot"
minSdkVersion 18
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
//只需要兼容armeabi-v7a
abiFilters "armeabi-v7a"
}
}
signingConfigs {
debug {
storeFile file("platform.jks")
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
release {
storeFile file("platform.jks")
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['\*.jar', '\*.aar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
💖💖步骤4:功能代码开发
💥💥首先,在我们的应用工程新建我们自定义的Application(MyApp.java),在MyApp.java文件的onCreate中进行开放平台MSC能力的注册,只有完成了能力的注册后,才能使用人脸识别的能力接口。
private void init() {
StarMscAbility.getInstance().initWithAppid(getApplicationContext(), APPID);
//日志初始化
StarLogAbility.getInstance().initAbility(this);
//基础能力初始化
StarCommonAbility.getInstance().initAbility(this,
RobotType.TYPE_TEACHING, new StarCommonAbility.onResultCallback() {
@Override
public void onResult(boolean isSuccess, String hardCode) {
if (isSuccess) {
//硬件和业务状态初始化
switch (hardCode) {
case PartCode.HARDWARE_PARTCODE.CODE_EMOJI:
//设置初始表情
EmojiHelper.doEmojiBase();
break;
case PartCode.HARDWARE_PARTCODE.CODE_GPIO:
//默认加载的时候,将拾音方向设置为默认正前方的0度。
GPIOHelper.getInstance().setMainMic(0);
break;
case PartCode.HARDWARE_PARTCODE.CODE_CENTER_LIGHT:
//关闭腹部灯带
CenterLightHelper.takeCenterLightOff();
break;
default:
break;
}
}
}
});
}
💥💥界面控件初始化(部分)
private void initView() {
//组ID显示text
mTxtGroupid = findViewById(R.id.groupid);
//人脸标识显示text
mEdtAuthid = findViewById(R.id.online_authid);
//界面按钮点击处理
findViewById(R.id.group_create).setOnClickListener(this);
findViewById(R.id.group_delete).setOnClickListener(this);
findViewById(R.id.online_register).setOnClickListener(this);
findViewById(R.id.take_pic).setOnClickListener(this);
findViewById(R.id.recognition_face).setOnClickListener(this);
//提前创建一个组进行组的设置
mTxtGroupid.setText("\*\*\*\*\*\*");
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.group_create: //创建组
createGroup();
break;
case R.id.group_delete: //删除组
deleteGroup(mGroupId);
break;
case R.id.online_register: //在线注册人脸信息
registerFace();
break;
case R.id.take_pic: //拍摄照片
Intent mIntent = new Intent(MainActivity.this, CameraActivity.class);
startActivityForResult(mIntent, 1000);
break;
case R.id.recognition_face: //识别照片中的人脸信息
recognitionFace();
break;
}
}
/\*\*
\* 创建组
\*/
private void createGroup() {
// 创建人脸组
faceGroupHelper.createGroup(new StarMscAbility.onResultCallback() {
@Override
public void onResult(boolean flag, String result) {
Log.d("MainActivity", "result = " + flag + " groupId = " + result);
if (flag) {
mGroupId = result;
mTxtGroupid.setText(result);
showToast("创建组成功:" + result + "-请牢记你的GroupId!!!");
} else {
showToast("创建组失败:" + result);
}
}
});
}
/\*\*
\* 删除组
\*/
private void deleteGroup(String groupid) {
if (mGroupId.equals("")) {
showToast("Please Create GroupId Frist");
return;
}
faceGroupHelper.deleteGroup(groupid, new StarMscAbility.onResultCallback() {
@Override
public void onResult(boolean flag, String result) {
if (flag) {
mTxtGroupid.setText("");
showToast("删除组成功");
} else {
showToast("删除组失败" + result);
}
}
});
}
/\*\*
\* 人脸注册
\*/
private void registerFace() {
if (mGroupId.equals("")) {
showToast("Please Create GroupId Frist");
return;
}
if (mImage == null) {
showToast("请拍照");
}
if (null == mEdtAuthid.getText() || mEdtAuthid.getText().toString().equals("")) {
showToast("请输入userId");
}
userId = mEdtAuthid.getText().toString();
faceRegisterHelper = new FaceRegisterHelper(this);
faceRegisterHelper.startRegister(userId, mImage,
new StarMscAbility.onResultCallback() {
@Override
public void onResult(boolean flag, String result) {
if (flag) {
showToast("人脸模型注册成功:" + mEdtAuthid.getText());
//注册成功后加组
faceGroupHelper.addFace(userId, mGroupId, new StarMscAbility.onResultCallback() {
@Override
public void onResult(boolean flag, String result) {
Log.d("MainActivity", "result = " + result);
if (flag) {
showToast("人脸注册加组成功:" + result);
} else {
showToast("人脸注册加组失败:" + result);
}
}
});
} else {
showToast("注册模型注册失败:" + result);
}
}
});
}
/\*\*
\* 人脸识别
\*/
private void recognitionFace() {
if (mGroupId.equals("")) {
showToast("Please Create GroupId First");
return;
}
if (mImage == null) {
showToast("请拍照");
}
faceVerifyHelper.setFaceVerifyResultCallback(new StarMscAbility.onResultCallback() {
@Override
public void onResult(boolean flag, String result) {
//返回参数flag为人脸识别结果
//当flag为true时,result为空,表示图片中检测到了人脸,但没有匹配到人脸库中的人脸信息,当msg不为空时,msg的值表示匹配到的人脸结果(注册时提交的人脸标识)
//当flag为false时,result的值表示人脸识别失败的信息(包括图片中没有检测到人脸)
if (flag) {
if ("".equals(result)) {
showToast("该人脸还未注册!");
} else {
showToast("识别成功,欢迎您:" + result);
}
} else {
showToast("没有匹配到人脸");
}
}
});
faceVerifyHelper.sendGroupVerify(mGroupId,mImage);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if (resultCode != RESULT_OK) {
return;
}
String fileSrc = null;
if (requestCode == 1000) {
fileSrc = data.getStringExtra("bitmap");
if (null != fileSrc) {
// mPath = fileSrc;
// 获取图片的宽和高
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
// 压缩图片
options.inSampleSize = Math.max(1, (int) Math.ceil(Math.max(
(double) options.outWidth / 512f,
(double) options.outHeight / 512f)));
mImage = BitmapFactory.decodeFile(fileSrc, options);
// 若mImageBitmap为空则图片信息不能正常获取
if (null == mImage) {
showToast("图片信息无法正常获取!");
return;
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//可根据流量及网络状况对图片进行压缩
mImage.compress(Bitmap.CompressFormat.JPEG, 80, baos);
// mImageData = baos.toByteArray();
((ImageView) findViewById(R.id.online_img)).setImageBitmap(mImage);
}
}
}
/\*\*


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
}
}
}
/\*\*
[外链图片转存中...(img-5GOpF6KB-1715824700354)]
[外链图片转存中...(img-Z5sjOPqA-1715824700354)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**