package Ġcom . github . her ok otlin . voice input Ċ Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . media . Media Recorder Ċ import Ġandroid . util . Log Ċ import Ġcom . github . her ok otlin . permission . Permission Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ internal Ġclass ĠVoice Manager Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOG _ TAG Ġ= Ġ" Voice Input " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¿ĿåŃĺ å½ķ éŁ³ æĸĩä»¶çļĦ çĽ®å½ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfile Dir Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĸĩä»¶ æī©å±ķ åĲį ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfile Ext name Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éŁ³ é¢ĳ æł¼å¼ı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaudio Format Ġ= ĠMedia Recorder . Output Format . M PEG _ 4 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éŁ³ é¢ĳ ç¼ĸçłģ åĻ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaudio Encoder Ġ= ĠMedia Recorder . Audio Encoder . HE _ AAC ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĮ å£° éģĵ è¿ĺæĺ¯ åįķ å£° éģĵ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaudio NumberOf Channels Ġ= Ġ 2 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çłģ çİĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaudio Bit Rate Ġ= Ġ 3 2 0 0 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩĩ æł· çİĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaudio Sample Rate Ġ= Ġ 4 4 1 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæĶ¯æĮģ çļĦ æľĢ çŁŃ å½ķ éŁ³ æĹ¶ éķ¿ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaudio Min Duration Ġ= Ġ 1 0 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæĶ¯æĮģ çļĦ æľĢ éķ¿ å½ķ éŁ³ æĹ¶ éķ¿ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġaudio Max Duration Ġ= Ġ 6 0 Ġ* Ġ 1 0 0 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ æŃ£åľ¨ å½ķ éŁ³ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Recording Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæĺ¯åĲ¦ æŃ£åľ¨ æĴŃæĶ¾ å½ķ éŁ³ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġis Playing Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵåīį æŃ£åľ¨ å½ķ éŁ³ çļĦæĸĩä»¶ è·¯å¾Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar ĠfilePath Ġ= Ġ"" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å½ķ éŁ³ æĸĩä»¶çļĦ æĹ¶ éķ¿ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġfile Duration Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġ å¤ĸéĥ¨ å®ŀ æĹ¶ è¯»åıĸ çļĦ å½ķ éŁ³ æĹ¶ éķ¿ ĊĠĠĠ Ġval Ġduration : ĠLong ĊĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġduration Ġ= Ġnow Ġ- Ġrecord StartTime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duration Ġ> Ġaudio Max Duration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġaudio Max Duration . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Record () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġduration ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ å¤ĸéĥ¨ å®ŀ æĹ¶ è¯»åıĸ çļĦ æĴŃæĶ¾ è¿Ľ åº¦ ĊĠĠĠ Ġval Ġprogress : ĠLong ĊĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( player Ġ!= Ġnull ) Ġplayer !!. current Position . to Long () Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpermission Ġ= ĠPermission ( 1 9 9 0 5 , ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġandroid . Manifest . permission . RECORD _ AUDIO , ĊĠĠĠĠĠĠĠ Ġandroid . Manifest . permission . WRITE _ EXTERNAL _ STORAGE ĊĠĠĠ Ġ)) ĊĊĠĠĠ Ġvar Ġon Record Duration LessThan Min Duration : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġon Finish Record : Ġ(( success : ĠBoolean ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġon Finish Play : Ġ(( success : ĠBoolean ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġrecorder : ĠMedia Recorder ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġplayer : ĠMedia Player ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġrecord StartTime : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġstart Record () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! permission . check External Storage Writable ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠfilePath Ġ= Ġget FilePath ( file Dir , Ġfile Ext name ) ĊĊĠĠĠĠĠĠĠ Ġfile Duration Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġrecorder Ġ= ĠMedia Recorder () ĊĊĠĠĠĠĠĠĠ Ġrecorder . set Audio Source ( Media Recorder . Audio Source . MIC ) ĊĊĠĠĠĠĠĠĠ Ġrecorder . setOutput Format ( audio Format ) ĊĠĠĠĠĠĠĠ Ġrecorder . set Audio Encoder ( audio Encoder ) ĊĠĠĠĠĠĠĠ Ġrecorder . set Audio Channels ( audio NumberOf Channels ) ĊĠĠĠĠĠĠĠ Ġrecorder . set Audio Encoding Bit Rate ( audio Bit Rate ) ĊĠĠĠĠĠĠĠ Ġrecorder . set Audio Sampling Rate ( audio Sample Rate ) ĊĊĠĠĠĠĠĠĠ Ġrecorder . setOutput File ( filePath ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Success Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" IOException Ġstarting ĠMedia Recorder : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" RuntimeException Ġstarting ĠMedia Recorder : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Recording Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord StartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . recorder Ġ= Ġrecorder ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Record () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrecorder Ġ= Ġthis . recorder ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Recording Ġ|| Ġrecorder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Success Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġno Ġvalid Ġaudio / video Ġdata Ġhas Ġbeen Ġreceived Ġwhen Ġstop () Ġis Ġcalled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ¯ Ķ å¦Ĥ çĤ¹åĩ» å®Į å¼Ģå§ĭ ï¼Į ç«ĭ åį³ çĤ¹ ç»ĵæĿŁ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" RuntimeException Ġstop ing ĠMedia Recorder : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrecorder . reset () ĊĠĠĠĠĠĠĠ Ġrecorder . release () ĊĊĠĠĠĠĠĠĠ Ġ// Ġrecorder Ġ æĹłæ³ķ è¯»åıĸ åĪ° çľŁ å®ŀ æĹ¶ éķ¿ ĊĠĠĠĠĠĠĠ Ġ// Ġ åĽłæŃ¤ æİ¥ ä¸ĭ æĿ¥ å¿ħé¡» åĢ Ł åĬ© ĠMedia Player ĊĠĠĠĠĠĠĠ Ġif Ġ( is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set DataSource ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Duration Ġ= Ġplayer . duration ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . reset () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . release () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission . on Permissions Not Granted ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Success Ġ&& Ġfile Duration Ġ< Ġaudio Min Duration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Record Duration LessThan Min Duration ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete File () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . recorder Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġis Recording Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġon Finish Record ?. invoke ( is Success ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Play () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Success Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĠMedia Player () ĊĊĠĠĠĠĠĠĠ Ġplayer . setOn Completion Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Play () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set DataSource ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" IOException Ġstarting ĠMedia Player : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . player Ġ= Ġplayer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Play () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= Ġthis . player ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Playing Ġ|| Ġplayer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġplayer . stop () ĊĠĠĠĠĠĠĠ Ġplayer . reset () ĊĠĠĠĠĠĠĠ Ġplayer . release () ĊĊĠĠĠĠĠĠĠ Ġthis . player Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġis Playing Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġon Finish Play ?. invoke ( true ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete File () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( filePath . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠfilePath Ġ= Ġ"" ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget FilePath ( dirname : ĠString , Ġext name : ĠString ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç¡® ä¿Ŀ çĽ®å½ķ åŃĺåľ¨ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( dirname ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ æĹ¶éĹ´ æł¼å¼ı çļĦæĸĩä»¶ åĲį ĊĠĠĠĠĠĠĠ Ġval Ġformat er Ġ= ĠSimpleDateFormat (" yyyy _ MM _ dd _ HH _ mm _ ss ", ĠLocale . US ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġ"${ format er . format ( Date ()) }$ ext name " ĊĊĠĠĠĠĠĠĠ Ġif Ġ( dirname . endsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdirname Ġ+ Ġfilename ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ dirname /$ filename " ĊĊĠĠĠ Ġ} Ċ Ċ }