華為開發(fā)者論壇爆火文章:超簡單集成HMS ML Kit 實現(xiàn)parental control

前言


各位應(yīng)用程序開發(fā)者有沒有在后臺收到過家長們的反饋产艾? 希望能夠提供一個開關(guān)疤剑,采取一些措施保護小孩的眼睛,因為現(xiàn)在小孩子的近視率越來越高闷堡,和他們長時間近距離盯著屏幕有很大的關(guān)系隘膘。最近有一個海外的客戶通過集成了ML kit 實現(xiàn)了防范小朋友眼睛離屏幕過近,或者玩游戲時間過長的父母類控制類功能杠览。

場景


父母需要這個功能防止小朋友眼睛距離屏幕過近弯菊,或者小朋友看屏幕時間過長。

開發(fā)前準(zhǔn)備


在項目級gradle里添加華為maven倉

打開AndroidStudio項目級build.gradle文件

增量添加如下maven地址:

buildscript {
    {        
       maven {url 'http://developer.huawei.com/repo/'}
   }    
}
allprojects {
   repositories {      
       maven { url 'http://developer.huawei.com/repo/'}
   }
}
復(fù)制代碼

在應(yīng)用級的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'
}
復(fù)制代碼

在AndroidManifest.xml文件里面申請相機踱阿、訪問網(wǎng)絡(luò)和存儲權(quán)限

<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" />
復(fù)制代碼

動態(tài)權(quán)限申請

動態(tài)權(quán)限申請
if (!(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)) {
   requestCameraPermission();
}
復(fù)制代碼

代碼開發(fā)關(guān)鍵步驟


創(chuàng)建人體臉部分析器管钳。

MLFaceAnalyzer analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer();
復(fù)制代碼

創(chuàng)建LensEngine實例用于視頻流的人臉檢測,該類由ML Kit SDK提供软舌,用于捕捉相機動態(tài)視頻流并傳入分析器才漆。

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

開發(fā)者創(chuàng)建識別結(jié)果處理類“FaceAnalyzerTransactor”,該類實現(xiàn)MLAnalyzer.Result接口葫隙,使用此類中的transactResult方法獲取人臉呈現(xiàn)在屏幕上的檢測結(jié)果栽烂,并根據(jù)手機屏幕的寬高比例與呈現(xiàn)在屏幕上臉部的寬高比例進行對比躏仇,如果呈現(xiàn)在屏幕前的人臉?biāo)急嚷蔬^大恋脚,則鎖屏

public class FaceAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLFace> {
   @Override
   public void transactResult(MLAnalyzer.Result<MLFace> results) {
       SparseArray<MLFace> items = results.getAnalyseList();
       // 開發(fā)者根據(jù)需要處理識別結(jié)果腺办,需要注意,這里只對檢測結(jié)果進行處理糟描。
       // 不可調(diào)用ML kit提供的其他檢測相關(guān)接口怀喉。

       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() {
                       // 緩慢靠近時提示躬拢,當(dāng)下距離屏幕前的距離
                   }
               });
           }

       }
   }

   @Override
   public void destroy() {
       // 檢測結(jié)束回調(diào)方法,用于釋放資源等见间。
       release();
   }
}
復(fù)制代碼

設(shè)置識別結(jié)果處理器聊闯,實現(xiàn)分析器與結(jié)果處理器的綁定

analyzer.setTransactor(new FaceAnalyzerTransactor());
復(fù)制代碼

調(diào)用run方法,啟動相機米诉,讀取視頻流菱蔬,進行識別。

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

try {
   lensEngine.run(mSurfaceView.getHolder());
} catch (IOException e) {
   // 異常處理
   lensEngine.release();
   lensEngine = null;
}
復(fù)制代碼

檢測完成史侣,停止分析器拴泌,釋放檢測資源

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/' }
   }
}

復(fù)制代碼

Demo


有用的話,點個贊吧?( ′???` )比心
點關(guān)注惊橱,收貨Android開發(fā)干貨~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚪腐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子税朴,更是在濱河造成了極大的恐慌回季,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉房,死亡現(xiàn)場離奇詭異茧跋,居然都是意外死亡,警方通過查閱死者的電腦和手機卓囚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門瘾杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哪亿,你說我怎么就攤上這事粥烁。” “怎么了蝇棉?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵讨阻,是天一觀的道長。 經(jīng)常有香客問我篡殷,道長钝吮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮奇瘦,結(jié)果婚禮上棘催,老公的妹妹穿的比我還像新娘。我一直安慰自己耳标,他們只是感情好醇坝,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著次坡,像睡著了一般呼猪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砸琅,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天宋距,我揣著相機與錄音,去河邊找鬼症脂。 笑死乡革,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摊腋。 我是一名探鬼主播沸版,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兴蒸!你這毒婦竟也來了视粮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤橙凳,失蹤者是張志新(化名)和其女友劉穎蕾殴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛啸,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡钓觉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坚踩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荡灾。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞬铸,靈堂內(nèi)的尸體忽然破棺而出批幌,到底是詐尸還是另有隱情,我是刑警寧澤嗓节,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布荧缘,位于F島的核電站,受9級特大地震影響拦宣,放射性物質(zhì)發(fā)生泄漏截粗。R本人自食惡果不足惜信姓,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绸罗。 院中可真熱鬧财破,春花似錦、人聲如沸从诲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽系洛。三九已至,卻和暖如春略步,著一層夾襖步出監(jiān)牢的瞬間描扯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工趟薄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绽诚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓杭煎,卻偏偏與公主長得像恩够,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子羡铲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348