超简单集成HMS ML Kit 实现parental control

前言

各位应用程序开发者有没有在后台收到过家长们的反馈? 希望能够提供一个开关,采取一些措施保护小孩的眼睛,因为现在小孩子的近视率越来越高,和他们长时间近距离盯着屏幕有很大的关系。最近有一个海外的客户通过集成了ML kit 实现了防范小朋友眼睛离屏幕过近,或者玩游戏时间过长的父母类控制类功能。

场景

父母需要这个功能防止小朋友眼睛距离屏幕过近,或者小朋友看屏幕时间过长。

开发前准备

在项目级gradle里添加华为maven仓

打开AndroidStudio项目级build.gradle文件

增量添加如下maven地址:

buildscript {
     {        
        maven {url 'http://developer.huawei.com/repo/'}
    }    
}
allprojects {
    repositories {       
        maven { url 'http://developer.huawei.com/repo/'}
    }
}

在应用级的build.gradle里面加上SDK依赖

dependencies {
    implementation 'com.huawei.hms:ml-computer-vision-face:1.0.4.300'
    implementation 'com.huawei.hms:ml-computer-vision-face-shape-point-model:1.0.4.300'
    implementation 'com.huawei.hms:ml-computer-vision-face-emotion-model:1.0.4.300'
    implementation 'com.huawei.hms:ml-computer-vision-face-feature-model:1.0.4.300'
}

在AndroidManifest.xml文件里面申请相机、访问网络和存储权限

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

动态权限申请

动态权限申请
if (!(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {
    requestCameraPermission();
}

代码开发关键步骤

创建人体脸部分析器。

MLFaceAnalyzer analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer();

创建LensEngine实例用于视频流的人脸检测,该类由ML Kit SDK提供,用于捕捉相机动态视频流并传入分析器。

LensEngine mLensEngine = new LensEngine.Creator(getApplicationContext(), analyzer)
        .setLensType(LensEngine.BACK_LENS)
        .applyDisplayDimension(640, 480)
        .applyFps(30.0f)
        .enableAutomaticFocus(true)
        .create();

开发者创建识别结果处理类“FaceAnalyzerTransactor”,该类实现MLAnalyzer.Result<T>接口,使用此类中的transactResult方法获取人脸呈现在屏幕上的检测结果,并根据手机屏幕的宽高比例与呈现在屏幕上脸部的宽高比例进行对比,如果呈现在屏幕前的人脸所占比率过大,则锁屏

public class FaceAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLFace> {
    @Override
    public void transactResult(MLAnalyzer.Result<MLFace> results) {
        SparseArray<MLFace> items = results.getAnalyseList();
        // 开发者根据需要处理识别结果,需要注意,这里只对检测结果进行处理。
        // 不可调用ML kit提供的其他检测相关接口。

        if (items != null) {
            MLFace features = items.get(0);
            if (features == null) return;

            BigDecimal bigPhoneWidth = new BigDecimal(Float.toString(640));
            BigDecimal bigPhoneHeight = new BigDecimal(Float.toString(480));
            float phoneRatio = bigPhoneWidth.multiply(bigPhoneHeight).floatValue();

            BigDecimal bigFaceWidth = new BigDecimal(Float.toString(features.getWidth()));
            BigDecimal bigFaceHeight = new BigDecimal(Float.toString(features.getHeight()));
            float faceRatio = bigFaceWidth.multiply(bigFaceHeight).floatValue();

            BigDecimal bigPhoneRatio = new BigDecimal(Float.toString(phoneRatio));
            BigDecimal bigFaceRatio = new BigDecimal(Float.toString(faceRatio));
            final float ratio = bigPhoneRatio.divide(bigFaceRatio, 2, BigDecimal.ROUND_HALF_EVEN).floatValue();

            BigDecimal bigRatio = new BigDecimal(Float.toString(ratio));
            BigDecimal schedule = new BigDecimal(Float.toString(10));
            float scheduleRatio = bigRatio.multiply(schedule).floatValue();

            final int realRatio = Math.round(scheduleRatio);
            int distance = Integer.parseInt(mDistance);
            if (distance <= 6)
                distance = 6;

            if (distance >= realRatio) {
                // 锁屏提示,距离屏幕过近,屏幕锁屏
            } else {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // 缓慢靠近时提示,当下距离屏幕前的距离
                    }
                });
            }

        }
    }

    @Override
    public void destroy() {
        // 检测结束回调方法,用于释放资源等。
        release();
    }
}

设置识别结果处理器,实现分析器与结果处理器的绑定

analyzer.setTransactor(new FaceAnalyzerTransactor());

调用run方法,启动相机,读取视频流,进行识别。

SurfaceView mSurfaceView = findViewById(R.id.surface_view);

try {
    lensEngine.run(mSurfaceView.getHolder());
} catch (IOException e) {
    // 异常处理
    lensEngine.release();
    lensEngine = null;
}

检测完成,停止分析器,释放检测资源

if (mLensEngine != null) {
    mLensEngine.release();
}
if (analyzer != null) {
    try {
        analyzer.stop();
    } catch (IOException e) {
        // 异常处理
    }
}



maven地址
buildscript {
    repositories {
        maven { url 'https://developer.huawei.com/repo/' }
    }
}
allprojects {
    repositories {
        maven { url 'https://developer.huawei.com/repo/' }
    }
}

Demo

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355