package Ġcom . mt i . component . master . view . example Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . support . v 4 . app . Activity Compat Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . view . View Ċ import Ġcom . due ee ke . vide oc ont roller . Standard Video Controller Ċ import Ġcom . due ee ke . vide op layer . ijk . I jk Player Ċ import Ġcom . due ee ke . vide op layer . player . Video View Ċ import Ġcom . mt i . component . master . R Ċ import Ġcom . mt i . component . master . adapter . Video Player Adapter Ċ import Ġcom . mt i . component . master . base . Base Activity Ċ import Ġcom . mt i . component . master . callback . On Adapter ItemClickListener Ċ import Ġcom . mt i . component . master . model . Video Entry Ċ import Ġcom . mt i . component . media . player . PIP Manager Ċ import Ġkotlinx . android . synt hetic . main . act _ video _ player .* Ċ import Ġkotlinx . android . synt hetic . main . act _ video _ record . web View Ċ Ċ /** Ċ Ġ* Ġ@ an thor Ġcreated Ġby Ġj zw Ċ Ġ* Ġ@ date Ġ 2 0 2 0 / 5 / 2 9 Ċ Ġ* Ġ@ change Ċ Ġ* Ġ@ describe Ġ è§Ĩé¢ĳ æĴŃæĶ¾ ç»Ħä»¶ demo Ċ Ġ**/ Ċ class ĠVideo Player Component Activity Ġ: ĠBase Activity () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ Ĥ¬ æµ ® çªĹ æĴŃæĶ¾ æİ§åĪ¶åĻ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm PIP Manager : ĠP IP Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontroller : ĠStandard Video Controller < *> ĊĊĠĠĠ Ġoverride Ġfun Ġget Layout Id (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR . layout . act _ video _ player ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit Views ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Toolbar Title (" è§Ĩé¢ĳ æĴŃæĶ¾ ") ĊĠĠĠĠĠĠĠ Ġshow Toolbar Back View () ĊĠĠĠĠĠĠĠ Ġrequest Permission () ĊĠĠĠĠĠĠĠ Ġinit Video View () ĊĠĠĠĠĠĠĠ Ġbtn Local Video . setOnClickListener ( View . OnClickListener Ġ{ Ġscan Local Video () Ġ}) ĊĠĠĠĠĠĠĠ Ġset Markdown Data (" Video Player Component . html ", ĠwebView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĿå§ĭåĮĸ video View ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ å·²ç»ı æľī æ Ĥ¬ æµ ® çªĹ æĴŃæĶ¾ ï¼Į åĪĻ çĽ´æİ¥ æĴŃæĶ¾ ï¼Į åĲ¦åĪĻ æ·»åĬł åĪ° å®¹åĻ¨ æĴŃæĶ¾ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Video View () Ġ{ ĊĠĠĠĠĠĠĠ Ġm PIP Manager Ġ= ĠP IP Manager . getInstance ( this ) ĊĠĠĠĠĠĠĠ Ġcontroller Ġ= ĠStandard Video Controller < Video View < I jk Player >>( this ) ĊĠĠĠĠĠĠĠ Ġvar Ġvideo View Ġ= Ġm PIP Manager . video View ĊĠĠĠĠĠĠĠ Ġvideo View . set Video Controller ( controller ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m PIP Manager . is Start Float Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm PIP Manager . stop Float Window () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Player State ( video View . current Player State ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . set Play State ( video View . current Play State ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm PIP Manager . act Class Ġ= ĠVideo Player Component Activity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . setTitle (" æ Ĥ¬ æµ ® çªĹ æĴŃæĶ¾ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View . set Url (" https :// gsl b . m ia op ai . com / stream / IR 3 o MY D hr ON 5 hu C mf 7 s HC fn U 5 Y KE kg O 2 . mp 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Container . addView ( video View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġvideo View Ġæ Ĥ¬ æµ ® çªĹ æĴŃæĶ¾ è§Ĩé¢ĳ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġplay Float Video ( url : ĠString , Ġtitle : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm PIP Manager . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Start Float Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Float Window () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View . set Url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View . set Video Controller ( controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontroller . setTitle ( title Ġ?: Ġ" æ Ĥ¬ æµ ® çªĹ æĴŃæĶ¾ ") Ċ // ĠĠĠĠĠĠĠ Ġm PIP Manager . start Float Window () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æī«æıı æľ¬åľ° è§Ĩé¢ĳ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġscan Local Video () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlist Ġ= ĠArrayList < Video Entry >() ĊĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media ._ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . TITLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . DISPLAY _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . DATA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . AL BU M , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . AR TI ST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . DURATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . SIZE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġthis . content Resolver . query ( Media Store . Video . Media . EXTERNAL _ CONTENT _ URI , Ġprojection , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġcursor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( it . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġit . getInt ( it . getColumnIndex OrThrow ( Media Store . Video . Media ._ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġit . getString ( it . getColumnIndex OrThrow ( Media Store . Video . Media . TITLE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġit . getString ( it . getColumnIndex OrThrow ( Media Store . Video . Media . DATA )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġit . getLong ( it . getColumnIndex OrThrow ( Media Store . Video . Media . SIZE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġit . getLong ( it . getColumnIndex OrThrow ( Media Store . Video . Media . DURATION )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Ġ= ĠVideo Entry ( title , Ġpath , Ġsize , Ġduration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" æľ¬åľ° è§Ĩé¢ĳ ï¼ļ ${ video . url }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( video ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Video Data ( list ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® è§Ĩé¢ĳ åĪĹè¡¨ æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Video Data ( data : ĠList < Video Entry >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( data . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠVideo Player Adapter ( this , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= Ġobject Ġ: ĠLinearLayoutManager ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Scroll Vert ically (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . setOn ItemClickListener ( object Ġ: ĠOn Adapter ItemClickListener < Video Entry > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Item Click ( position : ĠInt , Ġitem : ĠVideo Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Float Video ( item . url , Ġitem . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĿĥéĻĲ çĶ³è¯· ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrequest Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . SYSTEM _ ALERT _ WINDOW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , Ġpermission , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġm PIP Manager . resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġm PIP Manager . pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġm PIP Manager . reset () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġif Ġ(! m PIP Manager . on Back Press ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }