package Ġcom . example . li y ach ao . permission Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . support . v 4 . app . Fragment Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġcom . example . li y ach ao . R Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* Ġ 6 . 0 Ġ è¿Ĳè¡Į æĹ¶ æĿĥéĻĲ å¤ĦçĲĨ å·¥åħ· ç±» ãĢĤ Ċ Ġ* Ċ Ġ* Ġ@ author Ġli y ach ao Ċ Ġ* Ġ@ date Ġ 2 0 1 8 / 1 / 1 8 Ċ Ġ*/ Ċ Ċ object ĠPermission Utils Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Request Code Ġ= Ġ- 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪ¤æĸŃ å½ĵåīį æīĭæľº API çīĪæľ¬ æĺ¯åĲ¦ Ġ>= Ġ 6 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġis Over Mar shm allow : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ĊĊĠĠĠ Ġprivate Ġvar Ġm On Permission Listener : ĠOn Permission Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġrequest Permissions Result ( activity : ĠActivity , Ġrequest Code : ĠInt , Ġpermission : ĠArray < String >, Ġcallback : ĠOn Permission Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Permissions ( activity , Ġrequest Code , Ġpermission , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Permissions Result ( fragment : Ġandroid . app . Fragment , Ġrequest Code : ĠInt , Ġpermission : ĠArray < String >, Ġcallback : ĠOn Permission Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Permissions ( fragment , Ġrequest Code , Ġpermission , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest Permissions Result ( fragment : ĠFragment , Ġrequest Code : ĠInt , Ġpermission : ĠArray < String >, Ġcallback : ĠOn Permission Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Permissions ( fragment , Ġrequest Code , Ġpermission , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè¯·æ±Ĥ æĿĥéĻĲ å¤ĦçĲĨ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobject ĠĠĠĠĠ Ġactivity Ġor Ġfragment ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Code Ġè¯·æ±Ĥ çłģ ĊĠĠĠĠ Ġ* Ġ@ param Ġpermissions ĠéľĢè¦ģ è¯·æ±Ĥ çļĦ æĿĥéĻĲ ĊĠĠĠĠ Ġ* Ġ@ param Ġcallback ĠĠĠ Ġ ç»ĵæŀľ åĽŀè°ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġprivate Ġfun Ġrequest Permissions (` object `: ĠAny , Ġrequest Code : ĠInt , Ġpermissions : ĠArray < String >, Ġcallback : ĠOn Permission Listener ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcheck Calling Object Suit ability (` object `) ĊĠĠĠĠĠĠĠ Ġm On Permission Listener Ġ= Ġcallback ĊĊĠĠĠĠĠĠĠ Ġif Ġ( check Permissions ( getContext (` object `), Ġpermissions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m On Permission Listener Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Permission Listener !!. on Permission Granted () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdenied Permissions Ġ= Ġget Denied Permissions ( getContext (` object `), Ġ* permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( den ied Permissions . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Request Code Ġ= Ġrequest Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(` object ` Ġis ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` object `. request Permissions ( den ied Permissions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array (), Ġrequest Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(` object ` Ġis Ġandroid . app . Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` object `. request Permissions ( den ied Permissions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array (), Ġrequest Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(` object ` Ġis ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` object `. request Permissions ( den ied Permissions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array (), Ġrequest Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Request Code Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ ä¸Ĭä¸ĭ æĸĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetContext (` object `: ĠAny ): ĠContext ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext : ĠContext ? ĊĠĠĠĠĠĠĠ Ġif Ġ(` object ` Ġis Ġandroid . app . Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġ` object `. activity ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(` object ` Ġis ĠFragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġ` object `. activity ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġ` object ` Ġas ĠActivity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè¯·æ±Ĥ æĿĥéĻĲ ç»ĵæŀľ ï¼Į å¯¹åºĶ on Request Permissions Result () æĸ¹æ³ķ ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Request Code Ġ!= Ġ- 1 Ġ&& Ġrequest Code Ġ== Ġm Request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( verify Permissions ( grant Results )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m On Permission Listener Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Permission Listener !!. on Permission Granted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m On Permission Listener Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm On Permission Listener !!. on Permission Denied () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĺ¾ç¤º æıĲç¤º å¯¹ è¯Ŀ æ¡Ĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshow Tips Dialog ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle (" æıĲç¤º ä¿¡æģ¯ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage (" å½ĵåīį åºĶçĶ¨ ç¼º å°ĳ å¿ħè¦ģ æĿĥéĻĲ ï¼Į è¯¥ åĬŁèĥ½ æļĤ æĹ¶ æĹłæ³ķ ä½¿çĶ¨ ãĢĤ å¦Ĥ èĭ¥ éľĢè¦ģ ï¼Į è¯· åįķ åĩ» ãĢĲ ç¡®å®ļ ãĢĳ æĮīéĴ® åīį å¾Ģ è®¾ç½® ä¸Ńå¿ĥ è¿Ľè¡Į æĿĥéĻĲ æİĪæĿĥ ãĢĤ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button (" åıĸæ¶Ī ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" ç¡®å®ļ ") Ġ{ Ġdialog , Ġwhich Ġ-> Ġstart AppSettings ( context ) Ġ}. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĲ¯åĬ¨ å½ĵåīį åºĶçĶ¨ è®¾ç½® é¡µéĿ¢ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart AppSettings ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Settings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ) ĊĠĠĠĠĠĠĠ Ġintent . data Ġ= ĠUri . parse (" package :" Ġ+ Ġcontext . packageName ) ĊĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éªĮè¯ģ æĿĥéĻĲ æĺ¯åĲ¦ éĥ½ å·²ç»ı æİĪæĿĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġverify Permissions ( grant Results : ĠInt Array ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( grant Result Ġin Ġgrant Results ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Result Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æĿĥéĻĲ åĪĹè¡¨ ä¸Ń æīĢæľī éľĢè¦ģ æİĪæĿĥ çļĦ æĿĥéĻĲ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠĠĠĠ Ġä¸Ĭ ä¸ĭ æĸĩ ĊĠĠĠĠ Ġ* Ġ@ param Ġpermissions Ġ æĿĥéĻĲ åĪĹè¡¨ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Denied Permissions ( context : ĠContext ?, Ġvar arg Ġpermissions : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdenied Permissions Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( permission Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( context !! , Ġpermission ) Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenied Permissions . add ( permission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdenied Permissions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ£Ģ æŁ¥ æīĢ ä¼łéĢĴ å¯¹è±¡çļĦ æŃ£ç¡® æĢ§ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġobject Ġ å¿ħé¡» ä¸º Ġactivity Ġor Ġfragment ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Calling Object Suit ability (` object `: ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(` object ` Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNullPointerException (" Activity Ġor ĠFragment Ġshould Ġnot Ġbe Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġis Activity Ġ= Ġ` object ` Ġis ĠActivity ĊĠĠĠĠĠĠĠ Ġval Ġis Support Fragment Ġ= Ġ` object ` Ġis ĠFragment ĊĠĠĠĠĠĠĠ Ġval Ġis App Fragment Ġ= Ġ` object ` Ġis Ġandroid . app . Fragment ĊĊĠĠĠĠĠĠĠ Ġif Ġ(!( is Activity Ġ|| Ġis Support Fragment Ġ|| Ġis App Fragment )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Caller Ġmust Ġbe Ġan ĠActivity Ġor Ġa ĠFragment ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ£Ģ æŁ¥ æīĢæľīçļĦ æĿĥéĻĲ æĺ¯åĲ¦ å·²ç»ı è¢« æİĪæĿĥ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpermissions Ġ æĿĥéĻĲ åĪĹè¡¨ ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcheck Permissions ( context : ĠContext ?, Ġpermissions : ĠArray < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Over Mar shm allow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( permission Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( context !! , Ġpermission ) Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġcheck Permissions 1 ( method : Ġ() Ġ-> ĠUnit , Ġpermission : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= ĠK night Permission . get Cur Activity () ĊĠĠĠĠĠĠĠ Ġif Ġ( check Permissions ( activity , Ġpermission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . invoke () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . permission _ describe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . negative , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . positive ) Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions Result ( activity , Ġ 1 , Ġpermission , Ġobject Ġ: ĠOn Permission Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Permission Granted () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Permission Denied () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Tips Dialog ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. create (). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Permission Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Permission Granted () ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Permission Denied () ĊĠĠĠ Ġ} Ċ Ċ } Ċ