package Ġcom . aren ac ast . medi apro jection Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . graphics . Camera Ċ import Ġandroid . media . projection . Media Projection Manager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Display Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroidx . activity . result . Activity Result Launcher Ċ import Ġandroidx . activity . result . contract . Activity Result Contract Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġcom . aren ac ast . medi apro jection . model . Message Route Ċ import Ġcom . aren ac ast . medi apro jection . rt mp . R tmp Service Ċ import Ġcom . aren ac ast . medi apro jection . rt mp . R tmp Service Broadcast Receiver Ċ import Ġcom . aren ac ast . medi apro jection . scre enc apt ure .* Ċ import Ġcom . aren ac ast . medi apro jection . service . Video View Service Ċ import Ġcom . aren ac ast . medi apro jection . databinding . Activity Main Binding Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġorg . green robot . event bus . EventBus Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġval ĠTAG Ġ= Ġ" MainActivity " ĊĊĠĠĠ Ġprivate Ġvar ĠresultCode : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġresult Data : ĠIntent ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnotification Manager : ĠNotification Manager ĊĊĠĠĠ Ġprivate Ġvar Ġis Run Service Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġrun ServiceType Ġ= ĠSERVICE _ TYPE _ RT MP ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdata Binding : ĠActivity Main Binding ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġëĭ¤ë¥¸ ìķ ± ĠìľĦ ìĹĲ Ġê·¸ ë¦¬ ê¸° Ġê ¶ Į íķľ ìĦ ¤ ìłķ ìĿ´ ĠìķĪ ëĵľ ë¡ľ ìĿ´ ëĵľ 1 1 ë¶Ģ íĦ° ëĬĶ Ġíķ´ëĭ¹ Ġìĺ µ ìħĺ ìĦ ¤ ìłķ íĻĶ ë©´ ìľ¼ë¡ľ Ġë°Ķ ë¡ľ Ġê°Ģì§Ģ ì§Ģ ĠìķĬ ê³ł Ġíķľ ëĭ¨ ê³Ħ ĠìĿ´ ìłĦ ë© Ķ ë ī ´ ë¡ľ ë§Į ĠëĤĺ íĥĢ ëĤĺ ëĬĶ ê± ¸ ë¡ľ Ġë³Ģê²½ ëĲľ ëĭ¤ . ĊĠĠĠ ĠëĶ°ëĿ¼ ìĦľ Ġìľł ìłĢ ê°Ģ Ġì§ ģ ìłĳ Ġê·¸ ë© Ķ ë ī ´ ìĹĲìĦľ Ġìķ ± ìĿĦ ĠìĦłíĥĿ íķ´ìĦľ Ġê ¶ Į íķľ ìĺ µ ìħĺ ĠíĻ Ķ ë©´ ìľ¼ë¡ľ Ġì§Ħ ìŀħ íķĺìĹ¬ ìķ¼ Ġíķľëĭ¤ . Ġíķľ ë²Ī ëįĶ ĠìĦłíĥĿ ìĿĦ Ġíķ´ ìķ¼ ëĲĺëĬĶ Ġìĥģ íĻ © ìľ¼ë¡ľ Ġë³Ģê²½ ĊĠĠĠ ĠAndroid 1 1 ĠMe et up ìĹĲìĦľ ĠìĿ´ë Ł ° Ġë¶Ģ ë¶Ħ ë ķĮ ë¬¸ ìĹĲ ĠB ubble , ĠFull screen Intent , ĠP IP ìĿĦ ĠíĻľ ìļ© íķĺ ëĿ¼ ê³ł Ġê ¶ Į íķĺê³ł ĠìŀĪëĭ¤ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcan Overlay Ġ= Ġregister For Activity Result ( Overlay Activity Result Contract ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" can Overlay Ġ- ĠPermission ĠGr anted ") ĊĠĠĠĠĠĠĠ Ġrun Service ( this . run ServiceType ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġ// ĠLife ĠCycle ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġ// set ContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġdata Binding Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġdata Binding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" onCreate Ġ---------------- ") ĊĊĠĠĠĠĠĠĠ Ġ// val Ġr Ġ= ĠResources . getSystem () ĊĠĠĠĠĠĠĠ Ġ// on Configuration Changed ( r . configuration ) ĊĊĠĠĠĠĠĠĠ Ġnotification Manager Ġ= Ġget System Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĊĠĠĠĠĠĠĠ Ġ// val Ġbtn Start RT MP Service Ġ= ĠfindViewById < Button >( R . id . rt mp _ service _ btn _ start ) ĊĠĠĠĠĠĠĠ Ġ// val Ġbtn Start Media Projection Service Ġ= ĠfindViewById < Button >( R . id . medi apro jection _ service _ btn _ start ) ĊĠĠĠĠĠĠĠ Ġ// val Ġbtn Start Media Projection Activity Ġ= ĠfindViewById < Button >( R . id . medi apro jection _ activity _ btn _ start ) ĊĊĠĠĠĠĠĠĠ Ġdata Binding . rt mp Service Btn Start . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Run Service Ġ|| ĠR tmp Service . is Streaming () Ġ|| ĠR tmp Service . is Recording ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor ĠR tmp Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Service ( SERVICE _ TYPE _ RT MP ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Binding . medi apro jection Service Btn Start . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Run Service ) Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor ĠVideo View Service ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// run Service ( SERVICE _ TYPE _ LOCAL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Binding . medi apro jection Activity Btn Start . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Run Service ) Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// startActivity ( Media Projection Activity . newInstance ( this , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* val Ġperms Ġ= ĠHashMap < String , ĠInt >() ĊĠĠĠĠĠĠĠ Ġperms [ Manifest . permission . RECORD _ AUDIO ] Ġ= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġperms [ Manifest . permission . CAMERA ] Ġ= ĠPackage Manager . PERMISSION _ GRAN TED ĊĊĠĠĠĠĠĠĠ Ġif Ġ( perms [ Manifest . permission . RECORD _ AUDIO ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"${ Manifest . permission . RECORD _ AUDIO } Ġ- ĠPER MISSION _ GRAN TED ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"${ Manifest . permission . RECORD _ AUDIO } Ġ- ĠPER MISSION _ DEN IED ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( perms [ Manifest . permission . CAMERA ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"${ Manifest . permission . CAMERA } Ġ- ĠPER MISSION _ GRAN TED ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ"${ Manifest . permission . CAMERA } Ġ- ĠPER MISSION _ DEN IED ") ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Destroy Ġ---------------- ") ĊĠĠĠĠĠĠĠ Ġstop Notification () ĊĠĠĠĠĠĠĠ Ġunregister Receiver () ĊĊĠĠĠĠĠĠĠ Ġ// EventBus . getDefault (). post ( Message Route ( EB _ RT MP _ SERVICE _ STOP _ SERVICE , Ġ"")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Pause Ġ---------------- ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ ĠAndroid Manifest . xml ĊĠĠĠ Ġandroid : config Changes =" orientation | keyboard Hidden | screen Size " ĊĠĠĠ Ġorientation ë§Į Ġì¶Ķê°Ģ ëĲĺ ë©´ Ġë©Ķ ìĨĮ ëĵľ ê°Ģ Ġíĺ¸ì¶ľ ëĲĺ ì§Ģ ĠìķĬ ëĬĶ ëĭ¤ . Ġscreen Size ê°Ģ Ġê°Ļ ìĿ´ Ġíı¬ íķ¨ ëĲĺ ìķ¼ Ġìłķ ìĥģ ìłģìľ¼ë¡ľ Ġíĺ¸ì¶ľ ëĲ ¨ . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĠĠĠĠĠĠĠ Ġ// Log . e ( TAG , Ġ" on Configuration Changed Ġ- Ġ${ new Config . orientation }") ĊĊĠĠĠĠĠĠĠ Ġ/* when ( new Config . orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration . OR IENTATION _ POR TRA IT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( Message Route ( EB _ RT MP _ SERVICE _ POR TRA IT , Ġ" 1 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration . OR IENTATION _ LAND SC APE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post ( Message Route ( EB _ RT MP _ SERVICE _ LAND SC APE , Ġ" 2 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġ// ĠService ĠMethods ĊĠĠĠ Ġprivate Ġfun Ġshow Reject Dialog () Ġ{ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" Overlay ĠPermission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage (" Please Ġgrant Ġpermission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" Ok ") Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcan Overlay . launch (" package :$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button (" Cancel ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Service ( run ServiceType : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" run Service Ġ- Ġtype :$ run ServiceType Ġ-------------------- ") ĊĠĠĠĠĠĠĠ Ġthis . run ServiceType Ġ= Ġrun ServiceType ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Settings . can Draw Overlay s ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( run ServiceType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Register Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetInstance For R tmp Service () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Permission For R tmp Service () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġstart Service () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Reject Dialog () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Service () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start Service Ġ-------------------- ") ĊĠĠĠĠĠĠĠ Ġis Run Service Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground Service ( Video View Service . new Service ( this )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Service ( Video View Service . new Service ( this )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġ// ĠR TMP ĠService ĠMethods ĊĠĠĠ Ġprivate Ġfun ĠgetInstance For R tmp Service () Ġ{ ĊĠĠĠĠĠĠĠ ĠR tmp Service . init ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreceive Broadcast Event ( intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsend Event Ġ= Ġintent ?. getString Extra ( EXTRA _ SEND _ BRO ADCAST ) ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" receive Broadcast Event : Ġ$ send Event , Ġ${ intent ?. action } Ġ>>> >>>>>>>> >>>> >> ") ĊĊĠĠĠĠĠĠĠ Ġwhen ( send Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEB _ RT MP _ SERVICE _ START _ STREAM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠEB _ RT MP _ SERVICE _ START _ STREAM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEB _ RT MP _ SERVICE _ STOP _ STREAM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// stop Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠEB _ RT MP _ SERVICE _ STOP _ STREAM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEB _ RT MP _ SERVICE _ STOP _ SERVICE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , ĠEB _ RT MP _ SERVICE _ STOP _ SERVICE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Receiver () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Register Receiver () Ġ{ ĊĠĠĠĠĠĠĠ ĠR tmp Service Broadcast Receiver . register ( this , Ġ:: receive Broadcast Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunregister Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Run Service Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠR tmp Service Broadcast Receiver . unregister ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġnotification Ġis Ġto Ġsolve ĠMedia Projection Ġproblem Ġthat Ġonly Ġrender Ġsurface Ġif Ġsomething ĊĠĠĠĠ Ġ* Ġchanged . ĊĠĠĠĠ Ġ* ĠIt Ġcould Ġproduce Ġproblem Ġin Ġsome Ġserver Ġlike Ġin ĠY outube Ġthat Ġneed Ġsend Ġvideo Ġand Ġaudio Ġall Ġtime ĊĠĠĠĠ Ġ* Ġto Ġwork . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Builder : ĠNotification . Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification . Builder ( this ). set Small Icon ( R . drawable . notification _ anim ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title (" Streaming ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text (" Display Ġmode Ġstream ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Ticker (" Stream Ġin Ġprogress ") ĊĠĠĠĠĠĠĠ Ġnotification Builder . setAuto Cancel ( true ) ĊĊĠĠĠĠĠĠĠ Ġnotification Manager . notify ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Builder . build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġnotification Manager . cancel ( NOTIFICATION _ ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġ// ĠPermission : ĠìļĶ ì²Ń ìĪ ľ ìĦľ ĠOverlay Ġ-> ĠRecord Audio Ġ-> ĠMedia Projection ĠìĪ ľ ìĦľ ëĮĢ ë¡ľ ĠìļĶ ì²Ń ĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Activity Result Ġ---------------- ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ MEDIA _ PRO JECTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( result Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity . RESULT _ OK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" REQUEST _ MEDIA _ PRO JECTION Ġ- ĠPermission ĠGr anted ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Projection Permission Granted ( result Code , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" REQUEST _ MEDIA _ PRO JECTION Ġ- ĠPermission ĠDen ied ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Receiver () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layout : ĠView Ġ= ĠfindViewById ( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( parent Layout , ĠR . string . user _ cancelled , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmedia Projection Permission Granted ( result Code : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . result Code Ġ= ĠresultCode ĊĠĠĠĠĠĠĠ Ġthis . result Data Ġ= Ġdata ĊĊĠĠĠĠĠĠĠ Ġis Run Service Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġinit Notification () ĊĠĠĠĠĠĠĠ ĠR tmp Service . setData ( result Code , Ġdata !! ) ĊĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠR tmp Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" endpoint ", Ġ" rt mp :// 1 9 2 . 1 6 8 . 0 . 1 5 2 : 1 9 3 5 / live / aren ac ast _ streaming ") ĊĠĠĠĠĠĠĠ Ġ// intent . putExtra (" endpoint ", Ġ" rt mp :// media . w el lf are . tv : 1 9 3 5 / sen i ort v / aren ac ast _ streaming ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠìĦľë¹ĦìĬ¤ ë¥¼ Ġìĭ¤íĸī íķĺë©´ ĠonStart Command Ġê°Ģ Ġíĺ¸ì¶ľ ëĲĺ ë©´ ìĦľ Ġìĭľìŀĳ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground Service ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Service ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Permission For Media Projection () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( R tmp Service . is Streaming ()) Ġreturn ĊĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( R tmp Service . send Intent (), ĠREQUEST _ MEDIA _ PRO JECTION ) ĊĊĠĠĠĠĠĠĠ Ġ// Java . Lang . IllegalArgumentException : ĠCan Ġonly Ġuse Ġlower Ġ 1 6 Ġbits Ġfor Ġrequest Code Ġë¬¸ìłľ ë¡ľ ĠìĿ¼ ëĭ¨ Ġì£¼ ìĦĿ ì² ĺë¦¬ ĊĠĠĠĠĠĠĠ Ġ/* val Ġresult Ġ= Ġregister For Activity Result ( Media Projection Result Contract ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultCode Ġ= Ġit . getInt Extra ( EXTRA _ RESULT _ CODE , ĠActivity . RESULT _ C ANCE LED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Data Ġ= Ġit . get Parcelable Extra ( EXTRA _ REQUEST _ DATA ) Ġas ĠIntent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Projection Permission Granted ( result Code , Ġresult Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layout : ĠView Ġ= ĠfindViewById ( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( parent Layout , ĠR . string . user _ cancelled , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult . launch ( R tmp Service . send Intent ()) ĊĠĠĠĠĠĠĠ Ġ// val Ġmedia Projection Manager Ġ= Ġget System Service ( Context . MEDIA _ PRO JECTION _ SERVICE ) Ġas ĠMedia Projection Manager ĊĠĠĠĠĠĠĠ Ġ// result . launch ( media Projection Manager . create Screen Capture Intent ()) ĊĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRC _ RECORD _ AUDIO Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Permission For Media Projection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layout : ĠView Ġ= ĠfindViewById ( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( parent Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Permission Ġrequest Ġwas Ġdenied Ġby Ġuser !! ", ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRC _ MULTIPLE _ PERM Ġ-> Ġ{// ĠREC ORD _ AUDIO Ġ& ĠCAM ERA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperms Ġ= ĠHashMap < String , ĠInt >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Audio Perm Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Camera Perm Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġgrant Results . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperms [ permissions [ i ]] Ġ= Ġgrant Results [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perms [ Manifest . permission . RECORD _ AUDIO ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġis Audio Perm Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perms [ Manifest . permission . CAMERA ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġis Camera Perm Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Audio Perm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layout : ĠView Ġ= ĠfindViewById ( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( parent Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Audio Permission Ġrequest Ġwas Ġdenied Ġby Ġuser !! ", ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ìĿ¼ ëĭ¨ Ġì¹ ´ë © Ķ ëĿ¼ ëĬĶ ĠíķĦ ìĪĺ ê°Ģ ĠìķĦ ëĭ Į Ġìĺ µ ìħĺ ìľ¼ë¡ľ Ġì²ĺë¦¬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Camera Perm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠAlertDialog . Builder ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle (" Not ic w ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Message (" Camera Permission Ġrequest Ġwas Ġdenied Ġby Ġuser !! \ n Disable Ġcamera Ġyour Ġstreaming ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Cancel able ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . set Positive Button (" Ok ") Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Permission For Media Projection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Permission For Media Projection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layout : ĠView Ġ= ĠfindViewById ( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( parent Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Permission Ġrequest Ġwas Ġdenied Ġby Ġuser !! ", ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* if Ġ( grant Results . isNotEmpty () Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠRC _ RECORD _ AUDIO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Permission For Media Projection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Layout : ĠView Ġ= ĠfindViewById ( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( parent Layout , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Permission Ġrequest Ġwas Ġdenied Ġby Ġuser !! ", ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Permission For Require All () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Record Audio Permission : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , ĠManifest . permission . RECORD _ AUDIO ) ĊĠĠĠĠĠĠĠ Ġval Ġhas Camera Permission : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , ĠManifest . permission . CAMERA ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAudio ëĬĶ ĠíķĦ ìĪĺ ĠCamera ëĬĶ Ġìĺ µ ìħĺ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Record Audio Permission Ġ== ĠPackage Manager . PERMISSION _ GRAN TED Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Camera Permission Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Permission For Media Projection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . RECORD _ AUDIO , Manifest . permission . CAMERA ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRC _ MULTIPLE _ PERM ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Permission For Record Audio () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Record Audio Permission : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , ĠManifest . permission . RECORD _ AUDIO ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAudio ëĬĶ ĠíķĦ ìĪĺ ĠCamera ëĬĶ Ġìĺ µ ìħĺ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Record Audio Permission Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Permission For Media Projection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . RECORD _ AUDIO ), ĠRC _ RECORD _ AUDIO ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Permission For Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Camera Permission : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( this , ĠManifest . permission . CAMERA ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAudio ëĬĶ ĠíķĦ ìĪĺ ĠCamera ëĬĶ Ġìĺ µ ìħĺ ĊĠĠĠĠĠĠĠ Ġif Ġ( has Camera Permission Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Permission For Media Projection () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( Manifest . permission . CAMERA ), ĠRC _ CAMERA ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Permission For R tmp Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Permission For Require All () ĊĠĠĠĠĠĠĠ Ġ// get Permission For Media Projection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// -------------------------------------------------------------------------------- -------- ĊĠĠĠ Ġ// Ġcompanion ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠOverlay Activity Result Contract Ġ: ĠActivity Result Contract < String , ĠBoolean >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate Intent ( context : ĠContext , Ġinput : ĠString ?): ĠIntent Ġ= ĊĠĠĠĠĠĠĠ ĠIntent ( Settings . ACTION _ MANAGE _ OVER LAY _ PERMISSION , ĠUri . parse ( input )) ĊĊĠĠĠ Ġoverride Ġfun Ġparse Result ( result Code : ĠInt , Ġintent : ĠIntent ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ ĠresultCode Ġ== ĠActivity . RESULT _ OK Ċ } Ċ Ċ internal Ġclass ĠMedia Projection Result Contract Ġ: ĠActivity Result Contract < Intent , ĠIntent >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcreate Intent ( context : ĠContext , Ġinput : ĠIntent ?): ĠIntent Ġ= Ġinput !! ĊĊĠĠĠ Ġoverride Ġfun Ġparse Result ( result Code : ĠInt , Ġintent : ĠIntent ?): ĠIntent Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK Ġ&& Ġintent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( INT ENT _ FILTER _ MEDIA _ PRO JECTION ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ RESULT _ CODE , ĠresultCode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ REQUEST _ DATA , Ġintent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// putExtra ( KEY _ ACTION , ĠACTION _ PERMISSION _ INIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( INT ENT _ FILTER _ MEDIA _ PRO JECTION ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( EXTRA _ RESULT _ CODE , ĠActivity . RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ }