自定义FaceView中,由于旋转了270度,所以需要face矩形框上下值进行交换,不然人脸识别总是左右或者上下不能追踪。每隔4秒发送一次矩形框的值,在MainActivity.java的handler中收到这个消息并进行是否居中的判断。 case MessageConst.CLIENT_ACTION_UPDATA_FACEDECTION_DATA: if(mIsRecording) break; RectF rect = (RectF) msg.obj; mLeft = rect.left; mRight = rect.right; mTop = rect.top; mBottom = rect.bottom;//保存上下左右的矩形框值 float centerx = mLeft +(mRight - mLeft)/2;//获取矩形框横向中心点位置 float centery = mTop + (mBottom-mTop)/2;//获取矩形框纵向中心点位置 String promptString = ""; if(centerx100) promptString = "位置偏左,"; else if((centerx > mScreenCenterx)&& (Math.abs(centerx -mScreenCenterx)>100)) promptString = "位置偏右,"; if((centery < mScreenCentery)&&( Math.abs(mScreenCentery-centery) >200)) { if("".equals(promptString)) promptString = "位置偏上"; else promptString += "并且偏上"; } else if((centery > mScreenCentery)&& (Math.abs(centery -mScreenCenterx)>200)) { if("".equals(promptString)) promptString = "位置偏下"; else promptString += "并且偏下"; } if("".equals(promptString)) { promptString = "位置已经居中,可以拍照了"; mIsCenter = true; } else { mIsCenter = false; } ITtsListener ttsListener = new ITtsListener() { @Override public void onPlayEnd() { if(mIsCenter) { if(mOlamiVoiceRecognizer != null) mOlamiVoiceRecognizer.start(); } } @Override public void onPlayFlagEnd(String arg0) { } @Override public void onTTSPower(long arg0) { } }; TtsPlayer.playText(MainActivity.this, promptString, ttsListener,Tts.TTS_SYSTEM_PRIORITY); break; 可以获得屏幕的中心点和人脸识别的矩形框的中心点,对比横向和纵向的中心点大小和绝对值差,当横向的值差100像素以上就认为横向不居中,并且根据大小分居左和居右,纵向大小差值在200像素以上认为纵向不居中,并且根据大小分偏上和偏下,这个100,200像素值用户可以自己调节到合适的值。 调用TtsPlayer.playText提示,当播报结束后回调到onPlayEnd(),如果居中那么已经提示用户可以拍照了,此时启动录音程序,用户不用点击button也不用唤醒,只许说拍照或者茄子就可以拍照了。 6.源码下载链接https://pan.baidu.com/s/1qXITWs8 7.相关链接语音在线听书: 语音记账demo: olami开放平台语法编写简介: (责任编辑:本港台直播) |