package Ġcom . aren ac ast . medi apro jection . scre enc apt ure Ċ Ċ import Ġandroid . app .* Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . hardware . display . Display Manager Ċ import Ġandroid . hardware . display . Virtual Display Ċ import Ġandroid . media . Media Recorder Ċ import Ġandroid . media . projection . Media Projection Ċ import Ġandroid . media . projection . Media Projection Manager Ċ import Ġandroid . net . Local Server Socket Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Environment Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Parcel FileDescriptor Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . S parseInt Array Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . WindowManager Ċ import Ġcom . aren ac ast . medi apro jection .* Ċ import Ġcom . aren ac ast . medi apro jection . ACTION _ INIT Ċ import Ġcom . aren ac ast . medi apro jection . ACTION _ SELF _ STOP Ċ import Ġcom . aren ac ast . medi apro jection . EXTRA _ RESULT _ CODE Ċ import Ġcom . aren ac ast . medi apro jection . model . Message Route Ċ import Ġcom . ped ro . encoder . video . Video Encoder Ċ import Ġcom . ped ro . rtp library . util . Record Controller Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Socket Ċ Ċ /* Ċ RT MP : ĠReal time ĠMessaging ĠProtocol , Ġport : Ġ 8 0 Ġor Ġ 1 9 3 5 Ċ Ġ*/ Ċ open Ġclass ĠMedia Projection Service Ġ: ĠService () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Media Projection Service " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Projection : ĠMedia Projection ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvirtual Display : ĠVirtual Display ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġp fd : ĠParcel FileDescriptor ĊĊĠĠĠ Ġprivate Ġvar Ġmedia Recorder : ĠMedia Recorder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsocket : ĠSocket ? Ġ= Ġnull ĊĠĠĠ Ġ// private Ġvar Ġlocal Server Socket : ĠLocal Server Socket ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval ĠOR IENT ATIONS Ġ= ĠS parseInt Array (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . append ( Surface . ROT ATION _ 0 , Ġ 9 0 ) ĊĠĠĠĠĠĠĠ Ġthis . append ( Surface . ROT ATION _ 9 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġthis . append ( Surface . ROT ATION _ 1 8 0 , Ġ 2 7 0 ) ĊĠĠĠĠĠĠĠ Ġthis . append ( Surface . ROT ATION _ 2 7 0 , Ġ 1 8 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// private Ġlateinit Ġvar Ġcontext : ĠContext ĊĠĠĠĠĠĠĠ Ġ// private Ġconst Ġval ĠFO REG ROUND _ SERVICE _ ID Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġ// private Ġconst Ġval ĠCHAN NEL _ ID Ġ= Ġ" Media Projection Service " ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Service ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// this . context Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠMedia Projection Service :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ INIT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Stop Service ( context : ĠContext ): ĠIntent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Service ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ SELF _ STOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġpermission Init ( context : ĠContext , ĠresultCode : ĠInt , Ġresult Data : ĠIntent ): ĠIntent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Service ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ RESULT _ CODE , ĠresultCode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ REQUEST _ DATA , Ġresult Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ PERMISSION _ INIT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Start Media Projection ( context : ĠContext , Ġsurface : ĠSurface , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection Name : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdpi : ĠInt ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Service ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ SURFACE , Ġsurface ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ PRO JECTION _ NAME , Ġprojection Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ SIZE _ WIDTH , Ġwidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ SIZE _ HEIGHT , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Stop Media Projection ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Service ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ STOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmedia Projection Manager : ĠMedia Projection Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġget System Service ( Context . MEDIA _ PRO JECTION _ SERVICE ) Ġas ĠMedia Projection Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġ/* ĊĠĠĠ ĠìĦľë¹ĦìĬ¤ ê°Ģ Ġì² ĺ ìĿĮ Ġìĭ¤íĸī ìĭľ ìĹĲëĬĶ ĠonCreate Ġ-> ĠonStart Command ĠìĪ ľ ìľ¼ë¡ľ Ġì²ĺë¦¬ ëĲĺ ê³ł ĊĠĠĠ ĠìĿ´ í ĽĦ ìĹĲ Ġstart Service Ġíĺ¸ì¶ľ ìĭľ ĠonStart Command Ġë§Į Ġìĭ¤íĸī ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate Ġ------------------- ") ĊĠĠĠĠĠĠĠ Ġstart Foreground Service () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Destroy Ġ------------------- ") ĊĠĠĠĠĠĠĠ ĠtearDown Media Projection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠSTART _ STICK Y Ġ: ĠService ê°Ģ Ġê° ķ ìłľ Ġì¢ ħ ë£Į ëĲĺ ìĹĪ ìĿĦ Ġê²½ìļ° Ġìĭľ ìĬ¤ íħľ ìĿ´ Ġëĭ¤ ìĭľ ĠService ë¥¼ Ġìŀ¬ ìĭľ ìŀĳ Ġìĭľ ì¼ ľ Ġì£¼ ì§Ģë§Į Ġintent Ġê°ĴìĿĦ Ġnull ë¡ľ Ġì ´Ī ê¸° íĻĶ Ġìĭľ ì¼ ľ ìĦľ Ġìŀ¬ ìĭľ ìŀĳ Ġíķ©ëĭĪëĭ¤ . ĊĠĠĠ ĠService Ġìĭ¤íĸī ìĭľ Ġstart Service ( Intent Ġservice ) Ġë©Ķ ìĦľ ëĵľë¥¼ Ġíĺ¸ì¶ľ ĠíķĺëĬĶ ëį° ĠonStart Command ( Intent Ġintent , Ġint Ġflags , Ġint Ġstart Id ) ĊĠĠĠ Ġë©Ķ ìĦľ ëĵľ ìĹĲ Ġintent ë¡ľ Ġvalue ë¥¼ ĠëĦ ĺ ê² ¨ Ġì¤ Ħ ĠìĪĺ ĠìŀĪìĬµëĭĪëĭ¤ . Ġê¸° ì ¡´ ìĹĲ Ġintent ìĹĲ Ġvalue ê°Ĵ ìĿ´ ĠìĦ¤ìłķ ìĿ´ ĠëĲĺ ìŀ Īëĭ¤ ê³ł Ġíķĺ ëįĶ ëĿ¼ ëıĦ ĠService Ġìŀ¬ ìĭľ ìŀĳ ìĭľ Ġintent Ġê°Ĵ ìĿ´ Ġnull ë¡ľ Ġì ´Ī ê¸° íĻĶ ĠëĲĺ ìĦľ Ġìŀ¬ ìĭľ ìŀĳ ĠëĲ ©ëĭĪëĭ¤ . ĊĊĠĠĠ ĠSTART _ NOT _ STICK Y Ġ: ĠìĿ´ ĠFlag ë¥¼ Ġë¦¬ íĦ´ íķ´ Ġì£¼ ìĭľ ë©´ , Ġê° ķ ìłľ ë¡ľ Ġì¢ ħ ë£Į ĠëĲľ ĠService ê°Ģ Ġìŀ¬ ìĭľ ìŀĳ Ġíķĺ ì§Ģ ĠìķĬ ìĬµëĭĪëĭ¤ . ĊĠĠĠ Ġìĭľ ìĬ¤ íħľ ìĹĲ ĠìĿĺ íķ´ Ġê° ķ ìłľ Ġì¢ ħ ë£Į ëĲĺ ìĸ´ë ı Ħ Ġê ´ ¸ ì° ® ìĿĢ ĠìŀĳìĹħ ìĿĦ Ġì§Ħ íĸī Ġíķł ĠëķĮ ĠìĤ¬ìļ© íķ´ Ġì£¼ ìĭľ ë©´ ĠëĲ ©ëĭĪëĭ¤ . ĊĊĠĠĠ ĠSTART _ RE DE LI VER _ INT ENT Ġ: ĠSTART _ STICK Y ìĻĢ Ġë§Ī ì° ¬ ê°Ģ ì§Ģ ë¡ľ ĠService ê°Ģ Ġì¢ ħ ë£Į ĠëĲĺ ìĹĪ ìĿĦ Ġê²½ìļ° Ġìĭľ ìĬ¤ íħľ ìĿ´ Ġëĭ¤ ìĭľ ĠService ë¥¼ Ġìŀ¬ ìĭľ ìŀĳ Ġìĭľ ì¼ ľ Ġì£¼ ì§Ģë§Į ĊĠĠĠ Ġintent Ġê°ĴìĿĦ Ġê·¸ ëĮĢ ë¡ľ Ġìľł ì§Ģ Ġìĭľ ì¼ ľ Ġì¤ į ëĭĪëĭ¤ . ĊĠĠĠ Ġstart Service () Ġë©Ķ ìĦľ ëĵľ Ġíĺ¸ì¶ľ ìĭľ ĠIntent Ġvalue ê°Ĵ ìĿĦ ĠìĤ¬ìļ© íķľ Ġê²½ìļ° ëĿ¼ ë©´ Ġíķ´ëĭ¹ ĠFlag ë¥¼ ĠìĤ¬ìļ© íķ´ìĦľ Ġë¦¬ íĦ´ ê°Ĵ ìĿĦ ĠìĦ¤ìłķ íķ´ Ġì£¼ ë©´ ĠëĲ ©ëĭĪëĭ¤ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onStart Command Ġ------------------- ") ĊĠĠĠĠĠĠĠ Ġaction ( intent ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ RE DE LI VER _ INT ENT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( p 0 : ĠIntent ?): ĠI Binder ? Ġ= Ġnull ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Channel Ġ= ĠNotification Channel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ CHANNEL _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Foreground ĠService ĠChannel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Notification Channel ( service Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Foreground Service () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Foreground Service Ġ---------------- ") ĊĊĠĠĠĠĠĠĠ Ġcreate Notification Channel () ĊĠĠĠĠĠĠĠ Ġval Ġnotification Intent Ġ= ĠIntent ( this , ĠMedia Projection Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġnotification Intent , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Builder ( this , ĠNOT IFICATION _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title (" Foreground ĠService ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ baseline _ fiber _ manual _ record _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġstart Foreground ( FO REG ROUND _ SERVICE _ ID , Ġnotification ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġprivate Ġfun Ġaction ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" action Ġ------------------- ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ INIT Ġ-> Ġget Permission ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ PERMISSION _ INIT Ġ-> Ġpermission Init Media Projection ( intent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ RE JECT Ġ-> Ġreject Media Projection () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ START Ġ-> Ġstart Media Projection ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ STOP Ġ-> Ġstop Media Projection () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ SELF _ STOP Ġ-> Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpermission Init Media Projection ( intent : ĠIntent , Ġis Available Media Recorder : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// unregister Receiver () ĊĠĠĠĠĠĠĠ Ġval ĠresultCode Ġ= Ġintent . getInt Extra ( EXTRA _ RESULT _ CODE , ĠActivity . RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġintent . get Parcelable Extra < Intent >( EXTRA _ REQUEST _ DATA ) ĊĠĠĠĠĠĠĠ Ġmedia Projection Ġ= Ġmedia Projection Manager . get Media Projection ( result Code , Ġdata !! ) ĊĠĠĠĠĠĠĠ Ġmedia Projection . register Callback ( object Ġ: ĠMedia Projection . Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Event ( EB _ MEDIA _ PRO JECTION _ ON _ STOP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġmedia Ġrecorder ĊĠĠĠĠĠĠĠ Ġif Ġ( is Available Media Recorder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Recorder Ġ= ĠMedia Recorder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// init Recorder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġê·¸ ë ĥ ¥ ĠìĨĮ ì¼ ĵ ìĿĦ ĠìĥĿìĦ± íķĺë©´ Ġandroid . os . network on main th rea dex ception ĠìĺĪ ìĻ¸ Ġë°ľ ìĥĿ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Thread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= ĠSocket ( Inet Address . get ByName (" 1 9 2 . 1 6 8 . 1 . 1 "), Ġ 3 3 3 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). start () */ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsend Event ( EB _ MEDIA _ PRO JECTION _ ON _ INIT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Permission ( intent : ĠIntent ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Permission Ġ---------------- ") ĊĊĠĠĠĠĠĠĠ Ġsend Event ( EB _ MEDIA _ PRO JECTION _ PERMISSION _ GET ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreject Media Projection () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// unregister Receiver () ĊĠĠĠĠĠĠĠ Ġ// send Event ( Media Projection Status . On Reject ) ĊĠĠĠĠĠĠĠ Ġsend Event ( EB _ MEDIA _ PRO JECTION _ PERMISSION _ RE JECT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Media Projection ( intent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Media Projection ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Ġ= Ġintent . get Parcelable Extra ( EXTRA _ SURFACE ) Ġas ĠSurface , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprojection Name Ġ= Ġintent . getString Extra ( EXTRA _ PRO JECTION _ NAME ) Ġ?: ĠEX TRA _ PRO JECTION _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġintent . getInt Extra ( EXTRA _ SIZE _ WIDTH , ĠDEFAULT _ VALUE _ SIZE _ WIDTH ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġintent . getInt Extra ( EXTRA _ SIZE _ HEIGHT , ĠDEFAULT _ VALUE _ SIZE _ HEIGHT ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Media Projection ( ĊĠĠĠĠĠĠĠ Ġsurface : ĠSurface , ĊĠĠĠĠĠĠĠ Ġprojection Name : ĠString Ġ= ĠEX TRA _ PRO JECTION _ NAME , ĊĠĠĠĠĠĠĠ Ġwidth : ĠInt Ġ= ĠDEFAULT _ VALUE _ SIZE _ WIDTH , ĊĠĠĠĠĠĠĠ Ġheight : ĠInt Ġ= ĠDEFAULT _ VALUE _ SIZE _ HEIGHT ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: media Projection . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= Ġ( getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ). default Display . rotation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" orientation Ġ- Ġ$ orientation Ġ-------------------- ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsurface Tmp Ġ= Ġsurface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwidth Tmp Ġ= ĠDEFAULT _ VALUE _ SIZE _ WIDTH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġheight Tmp Ġ= ĠDEFAULT _ VALUE _ SIZE _ HEIGHT ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠSurface . ROT ATION _ 9 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ== ĠSurface . ROT ATION _ 2 7 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Tmp Ġ= ĠDEFAULT _ VALUE _ SIZE _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Tmp Ġ= ĠDEFAULT _ VALUE _ SIZE _ WIDTH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Recorder ( width Tmp , Ġheight Tmp , Ġsurface ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Recorder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Tmp Ġ= Ġit . surface ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// preview Surface Ġ= Ġsurface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual Display Ġ= Ġmedia Projection . create Virtual Display ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprojection Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Tmp ,// width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Tmp ,// height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication . resources . display Metrics . density D pi , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisplay Manager . VIRTUAL _ DISPLAY _ FLAG _ AUTO _ MIR ROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Tmp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Event ( EB _ MEDIA _ PRO JECTION _ ON _ STARTED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Recorder ?. start () Ġ// ĠRecord ing Ġis Ġnow Ġstarted ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Event ( EB _ MEDIA _ PRO JECTION _ ON _ FAIL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Media Projection () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// stop ìĿĦ Ġíĺ¸ì¶ľ íķĺë©´ Ġìŀ¬ ìĭľ ìŀĳ ìĭľ Ġí į¼ ë¯¸ ìħĺ Ġê³¼ ìłķ ë¶Ģ íĦ° Ġëĭ¤ ìĭľ ĠìĪĺ íĸī íķ´ìķ¼ ĠëĲľëĭ¤ . Ġstop ìĿĢ ĠìĻ Ħ ìłĦ íŀĪ Ġì¢ ħ ë£Į Ġíķł ë ķĮ ë§Į Ġì²ĺë¦¬ Ġíķĺ ìŀĲ . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* if Ġ(:: media Projection . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Projection . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: virtual Display . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual Display . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Recorder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . reset () // reset ìĿĦ Ġíĺ¸ì¶ľ íķĺë©´ Ġìŀ¬ ìĭľ ìŀĳ ìĭľ Ġinit Recorder ë¶Ģ íĦ° Ġëĭ¤ ìĭľ Ġìĭľìŀĳ íķ´ìķ¼ ĠëĲľëĭ¤ . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Event ( EB _ MEDIA _ PRO JECTION _ ON _ STOP ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠtearDown Media Projection () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" te ar Down Media Projection Ġ---------------- ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: media Projection . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Projection . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: virtual Display . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual Display . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmedia Recorder ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . reset () Ġ// ĠYou Ġcan Ġreuse Ġthe Ġobject Ġby Ġgoing Ġback Ġto Ġset Audio Source () Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . release () Ġ// ĠNow Ġthe Ġobject Ġcannot Ġbe Ġreused ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Recorder Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġonly Ġmedia Ġprojection Ġrequest Ġpermission ĊĠĠĠ Ġfun Ġcreate Media Projection () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartActivity ( Media Projection Activity . newInstance ( this , Ġtrue )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġprivate Ġfun Ġinit Recorder ( size W : ĠInt , Ġsize H : ĠInt , Ġpreview Surface : ĠSurface ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Recorder ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Source ( Media Recorder . Audio Source . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Video Source ( Media Recorder . Video Source . SURFACE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Output Format ( Media Recorder . Output Format . TH REE _ G PP ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsocket ìĹ° ê²° ìĿ´ ĠëĲĺ ìĸ´ ĠìŀĪëĭ¤ ë©´ ĠìĨĮ ì¼ ĵ ìľ¼ë¡ľ ĠìłĦ ìĨ ¡ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// socket Ġ= ĠSocket ( Inet Address . get ByName (" 1 9 2 . 1 6 8 . 1 . 1 "), Ġ 3 3 3 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp fd Ġ= ĠParcel FileDescriptor . from Socket ( socket ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp fd Ġ= ĠParcel FileDescriptor . from Socket ( socket ). dup () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setOutput File ( p fd . file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠìĨĮ ì¼ ĵ ìĹ° ê²° ìĿ´ ĠìķĦ ëĭĪ ë©´ ĠìĿ¼ ëĭ¨ Ġëĭ¤ ìļ´ ë¡ľ ëĵľ ìĹĲ ĠíĮĮìĿ¼ ë¡ľ ĠìłĢìŀ¥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ DOWNLOAD S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġpath . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset OutputFile ( path . path Ġ+ Ġ"/ media Projection Video . mp 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Video Size ( size W , Ġsize H ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Video Encoder ( Media Recorder . Video Encoder . H 2 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Audio Encoder ( Media Recorder . Audio Encoder . AM R _ NB ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Encoder ( Media Recorder . Audio Encoder . AAC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Video Encoding Bit Rate ( 5 1 2 Ġ* Ġ 1 0 0 0 )// low Ġquality ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Video Encoding Bit Rate ( 5 1 2 Ġ* Ġ 5 0 0 0 )// medium Ġquality Ġ( 1 m Ġper Ġ 2 0 mb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Video Encoding Bit Rate ( 5 1 2 Ġ* Ġ 1 0 0 0 0 )// high Ġquality Ġ( 1 m Ġper Ġ 4 0 mb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Video Frame Rate ( 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Surface ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" setup Ġpreview Surface ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Preview Display ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġrotation Ġ= Ġ( context Ġas ĠActivity ). window Manager . default Display . rotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġrotation Ġ= Ġ( application Context Ġas ĠActivity ). window Manager . default Display . rotation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġorient aton Ġ= ĠOR IENT ATIONS . get ( rotation Ġ+ Ġ 9 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Orientation Hint ( 9 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġprivate Ġfun Ġsend Event ( status : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( Message Route ( status , Ġ"")) ĊĠĠĠĠĠĠĠ ĠonChange Status ( status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġabstract Ġmethod ĊĠĠĠ Ġopen Ġfun ĠonChange Status ( status Data : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnothing ĊĠĠĠ Ġ} Ċ }