package Ġcom . d aking x . dk recorder . fragment Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . media . Media Recorder Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os .* Ċ import Ġandroid . text . format . DateFormat Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . annotation . String Res Ċ import Ġcom . d aking x . dk recorder . R Ċ import Ġcom . d aking x . dk recorder . ext . check App Permission Ċ import Ġcom . d aking x . dk recorder . ext . filePath 2 Uri Ċ import Ġcom . d aking x . dk recorder . ext . generate TempFile Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ Ċ interface ĠRec order Listener Ġ{ ĊĠĠĠ Ġfun Ġon Record Finished ( uri : ĠUri ) ĊĊĠĠĠ Ġfun Ġon Play Finished () ĊĊĠĠĠ Ġfun Ġon Record Deleted ( uri : ĠUri ) Ċ } Ċ Ċ open Ġclass ĠRec order Fragment Ġ: ĠBase Fragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠREQUIRED _ PERMISSION S Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . RECORD _ AUDIO , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( file Provider Authority : ĠString , Ġmax Duration : ĠInt Ġ= ĠDEFAULT _ DURATION ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRec order Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( ARG _ FILE _ PROVIDER _ AUTH , Ġfile Provider Authority ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( ARG _ MAX _ DURATION , Ġmax Duration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ FILE _ PROVIDER _ AUTH Ġ= Ġ" arg _ file _ provider _ auth " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ MAX _ DURATION Ġ= Ġ" arg _ max _ duration " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ DURATION Ġ= Ġ 3 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġfile Provider Authority : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġmax Duration : ĠInt Ġ= ĠDEFAULT _ DURATION ĊĊĠĠĠ Ġprivate Ġvar Ġmedia Recorder : ĠMedia Recorder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmedia Player : ĠMedia Player ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġaudio File : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġrecorder Listener : ĠRec order Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Record Finished ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrecorder Listener ?. on Record Finished ( uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġon Play Finished () Ġ{ ĊĠĠĠĠĠĠĠ Ġrecorder Listener ?. on Play Finished () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrestore State ( bundle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġbundle ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( ARG _ FILE _ PROVIDER _ AUTH )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Provider Authority Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Duration Ġ= Ġget Int ( ARG _ MAX _ DURATION , ĠDEFAULT _ DURATION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore State ( bundle : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbundle . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . putString ( ARG _ FILE _ PROVIDER _ AUTH , Ġfile Provider Authority ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . put Int ( ARG _ MAX _ DURATION , Ġmax Duration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( recorder Listener Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder Listener Ġ= Ġcontext Ġas ? ĠRec order Listener ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġrecorder Listener Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġrelease Recorder () ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Recording (): ĠBoolean Ġ= Ġaudio File Ġ!= Ġnull ĊĊĠĠĠ Ġfun Ġcan Play (): ĠBoolean Ġ= Ġaudio Uri Ġ!= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Recorder () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Recorder Ġ= ĠMedia Recorder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éº ¦ åħĭ é£İ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Source ( Media Recorder . Audio Source . MIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è¾ĵåĩº æĸĩä»¶çļĦ æł¼å¼ı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Output Format ( Media Recorder . Output Format . M PEG _ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éŁ³ é¢ĳ æĸĩä»¶çļĦ ç¼ĸçłģ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Encoder ( Media Recorder . Audio Encoder . AAC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æľĢå¤§ æĹ¶ éķ¿ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Max Duration ( max Duration Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ çĽĳåĲ¬ åĻ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Info Listener Ġ{ Ġmr , Ġwhat , Ġextra Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( what Ġ== ĠMedia Recorder . MEDIA _ REC ORDER _ INFO _ MAX _ DURATION _ RE ACHED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Record () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Recorder () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Recorder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmedia Recorder Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player Ġ= ĠMedia Player (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Completion Listener Ġ{ Ġon Play Finished () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Player () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmedia Player Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Record (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġaudio Uri ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Uri Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecorder Listener ?. on Record Deleted ( uri ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Record ( error Tip : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! check Required Permissions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Tip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast Error ( R . string . tip _ l ack _ required _ permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġrequire Context (). generate TempFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" audio _${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate Format . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" yyyy MM dd _ HH mm ss ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ", Ġ" m 4 a " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Tip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast Error ( R . string . tip _ gen _ tmp _ file _ fail ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio File Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġaudio Uri Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġrelease Recorder () ĊĠĠĠĠĠĠĠ Ġcreate Recorder () ĊĊĠĠĠĠĠĠĠ Ġmedia Recorder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOutput File ( file . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . N ) ĊĠĠĠ Ġfun Ġpause Record () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Recorder ?. pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . N ) ĊĠĠĠ Ġfun Ġresume Record () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Recorder ?. resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Record (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġaudio File ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( file Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio File Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Uri Ġ= Ġrequire Context (). filePath 2 Uri ( file Provider Authority , Ġfile . absolute Path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Recorder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Uri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Record Finished ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Play (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġaudio Uri ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Player () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set DataSource ( require Context (), Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpause Play () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Play () Ġ{ ĊĠĠĠĠĠĠĠ Ġmedia Player ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Play () Ġ{ ĊĠĠĠĠĠĠĠ Ġrelease Player () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Required Permissions (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcontext ?. check App Permission (* REQUIRED _ PERMISSION S . to Typed Array ()) Ġ?: Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġtoast Error (@ String Res Ġstring Res Id : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ ĠToast . makeText ( require Context (), ĠgetString ( string Res Id ), ĠToast . LENGTH _ SHORT ). show () Ċ } Ċ