/* Ċ * ĠCopyright Ġ 2 0 1 7 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ * Ċ * ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ * Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ * ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ * Ċ * ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ * Ċ * ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ * Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ * ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ * ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġcom . example . android . basic permissions Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġcom . example . android . basic permissions . camera . Camera Preview Activity Ċ import Ġcom . example . android . basic permissions . util . check Self Permission Compat Ċ import Ġcom . example . android . basic permissions . util . request Permissions Compat Ċ import Ġcom . example . android . basic permissions . util . should Show Request Permission R ationale Compat Ċ import Ġcom . example . android . basic permissions . util . show Snackbar Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ Ċ const Ġval ĠPER MISSION _ REQUEST _ CAMERA Ġ= Ġ 0 Ċ Ċ /** Ċ Ġ* ĠLaunch er ĠActivity Ġthat Ġdemonstrates Ġthe Ġuse Ġof Ġruntime Ġpermissions Ġfor ĠAndroid ĠM . Ċ Ġ* ĠThis ĠActivity Ġrequests Ġpermissions Ġto Ġaccess Ġthe Ġcamera Ċ Ġ* Ġ([ android . Manifest . permission . CAMERA ]) Ċ Ġ* Ġwhen Ġthe Ġ' Show ĠCamera ĠPreview ' Ġbutton Ġis Ġclicked Ġto Ġstart Ġ Ġ[ Camera Preview Activity ] Ġonce Ċ Ġ* Ġthe Ġpermission Ġhas Ġbeen Ġgranted . Ċ Ġ* Ċ Ġ* Ġ< p > First , Ġthe Ġstatus Ġof Ġthe ĠCamera Ġpermission Ġis Ġchecked Ġusing Ġ[ Activity Compat . check Self Permission ] Ċ Ġ* ĠIf Ġit Ġhas Ġnot Ġbeen Ġgranted Ġ([ PackageManager . PERMISSION _ GRAN TED ]), Ġit Ġis Ġrequested Ġby Ċ Ġ* Ġcalling Ġ[ Activity Compat . request Permissions ]. ĠThe Ġresult Ġof Ġthe Ġrequest Ġis Ċ Ġ* Ġreturned Ġto Ġthe Ċ Ġ* Ġ[ android . support . v 4 . app . Activity Compat . On Request Permissions Result Callback ], Ġwhich Ġstarts Ċ Ġ* Ġif Ġthe Ġpermission Ġhas Ġbeen Ġgranted . Ċ Ġ* Ċ Ġ* Ġ< p > Note Ġthat Ġthere Ġis Ġno Ġneed Ġto Ġcheck Ġthe ĠAPI Ġlevel , Ġthe Ġsupport Ġlibrary Ċ Ġ* Ġalready Ġtakes Ġcare Ġof Ġthis . ĠSimilar Ġhelper Ġmethods Ġfor Ġpermissions Ġare Ġalso Ġavailable Ġin Ċ Ġ* Ġ([ Activity Compat ], Ċ Ġ* Ġ[ android . support . v 4 . content . Context Compat ] Ġand Ġ[ android . support . v 4 . app . Fragment ]). Ċ Ġ*/ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠActivity Compat . On Request Permissions Result Callback Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlayout : ĠView ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġlayout Ġ= ĠfindViewById ( R . id . main _ layout ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġa Ġlistener Ġfor Ġthe Ġ' Show ĠCamera ĠPreview ' Ġbutton . ĊĠĠĠĠĠĠĠ ĠfindViewById < Button >( R . id . button _ open _ camera ). setOnClickListener Ġ{ Ġshow Camera Preview () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPER MISSION _ REQUEST _ CAMERA ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġfor Ġcamera Ġpermission . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . size Ġ== Ġ 1 Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġhas Ġbeen Ġgranted . ĠStart Ġcamera Ġpreview ĠActivity . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . show Snackbar ( R . string . camera _ permission _ gr anted , ĠSn ackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġrequest Ġwas Ġdenied . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . show Snackbar ( R . string . camera _ permission _ den ied , ĠSn ackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Camera Preview () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe ĠCamera Ġpermission Ġhas Ġbeen Ġgranted ĊĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission Compat ( Manifest . permission . CAMERA ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġis Ġalready Ġavailable , Ġstart Ġcamera Ġpreview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . show Snackbar ( R . string . camera _ permission _ available , ĠSn ackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġis Ġmissing Ġand Ġmust Ġbe Ġrequested . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Camera Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġthe Ġ[ android . Manifest . permission . CAMERA ] Ġpermission . ĊĠĠĠĠ Ġ* ĠIf Ġan Ġadditional Ġr ationale Ġshould Ġbe Ġdisplayed , Ġthe Ġuser Ġhas Ġto Ġlaunch Ġthe Ġrequest Ġfrom ĊĠĠĠĠ Ġ* Ġa ĠSn ackBar Ġthat Ġincludes Ġadditional Ġinformation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrequest Camera Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPermission Ġhas Ġnot Ġbeen Ġgranted Ġand Ġmust Ġbe Ġrequested . ĊĠĠĠĠĠĠĠ Ġif Ġ( should Show Request Permission R ationale Compat ( Manifest . permission . CAMERA )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProvide Ġan Ġadditional Ġr ationale Ġto Ġthe Ġuser Ġif Ġthe Ġpermission Ġwas Ġnot Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthe Ġuser Ġwould Ġbenefit Ġfrom Ġadditional Ġcontext Ġfor Ġthe Ġuse Ġof Ġthe Ġpermission . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDisplay Ġa ĠSn ackBar Ġwith Ġa Ġbutton Ġto Ġrequest Ġthe Ġmissing Ġpermission . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . show Snackbar ( R . string . camera _ access _ required , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ IN DEFIN ITE , ĠR . string . ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions Compat ( array Of ( Manifest . permission . CAMERA ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPER MISSION _ REQUEST _ CAMERA ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . show Snackbar ( R . string . camera _ permission _ not _ available , ĠSn ackbar . LENGTH _ SHORT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġthe Ġpermission . ĠThe Ġresult Ġwill Ġbe Ġreceived Ġin Ġon Request Permission Result (). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions Compat ( array Of ( Manifest . permission . CAMERA ), ĠPER MISSION _ REQUEST _ CAMERA ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠCamera Preview Activity :: class . java ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠ Ġ} Ċ } Ċ