package Ġinfo . ben jamin h ill . its ful lo fst ars Ċ Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Activity Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ Ċ /** Ċ Ġ* ĠWork Ġout Ġthe Ġdangerous Ġpermissions Ġlisted Ġin Ġthe ĠAndroid Manifest . xml Ġ( dynamic ally ) Ċ Ġ* Ġbefore Ġdiv ing Ġinto Ġthe Ġapp : Ġ` run After All Permissions Granted Ġ{ Ġyour Code Ġ}` Ċ Ġ*/ Ċ abstract Ġclass ĠE Z Permission Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpermission Callback : Ġ() Ġ-> ĠUnit ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġignore Ġexceptions Ġin Ġcor outines Ġhttps :// github . com / Kotlin / kotlin x . coroutines / issues / 1 4 8 # issuecomment - 3 3 8 1 0 1 9 8 6 ĊĠĠĠĠĠĠĠ Ġval Ġbase UE H Ġ= ĠThread . getDefault Un caught ExceptionHandler () ĊĠĠĠĠĠĠĠ ĠThread . setDefault Un caught ExceptionHandler Ġ{ Ġthread , Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġmay Ġdouble Ġlog Ġthe Ġerror Ġon Ġolder Ġversions Ġof Ġandroid ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" FATAL ĠEXCEPTION : Ġ${ thread . name } Ġ$ error ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase UE H . unc a ught Exception ( thread , Ġerror ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġerror ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠProt ect Ġyour Ġcode Ġwith Ġthis Ġblock Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġrun After All Permissions Granted ( f : Ġ() Ġ-> ĠUnit ) Ġ= Ġif Ġ( missing Permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" We Ġalready Ġhave Ġall Ġthe Ġpermissions Ġ(${ required Permissions . join ToString () }) Ġwe Ġneeded , Ġrunning Ġdirectly ") ĊĠĠĠĠĠĠĠ Ġf () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġa Ġprototype Ġso Ġwe Ġskip Ġthe Ġright Ġway Ġto Ġdo Ġpermissions Ġ( with Ġreasons Ġgiven Ġfirst , Ġfallback Ġplan , Ġetc ) ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Request ing Ġpermissions , Ġbe Ġback Ġsoon .") ĊĠĠĠĠĠĠĠ Ġlog Permissions () ĊĠĠĠĠĠĠĠ Ġpermission Callback Ġ= Ġf ĊĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , Ġmissing Permissions . to Typed Array (), ĠS IMP LE _ PERMISSION _ ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġgrant Permissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠS IMP LE _ PERMISSION _ ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Permission Ġgrant Ġresult : Ġ${ grant Permissions . join ToString ()} =${ grant Results . join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Permissions () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( missing Permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" User Ġgranted Ġall Ġpermissions Ġthat Ġwe Ġrequested .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Callback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" User Ġdecl ined Ġrequired Ġpermissions : Ġ${ missing Permissions . join ToString () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Please Ġrestart Ġthe Ġapp Ġafter Ġallowing Ġaccess Ġto : Ġ${ missing Permissions . join ToString () }", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġgrant Permissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Permissions () Ġ= Ġrequired Permissions . forEach Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Permission : Ġ$ it ; Ġmissing : Ġ${ it Ġin Ġmissing Permissions }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrequired Permissions ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpackage Manager . get Package Info ( packageName , ĠPackage Manager . GET _ PERMISSION S ). requested Permissions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġprivate Ġval Ġmissing Permissions ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrequired Permissions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĠContext Compat . check Self Permission ( this , Ġit ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS IMP LE _ PERMISSION _ ID Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" if os " ĊĠĠĠ Ġ} Ċ }