前言
各位應(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ā)干貨~~