Site icon C1CTech

Android Runtime Permissions with Dexter

<p>Android Marshmallow includes a new functionality to let users grant or deny permissions when running an app instead of granting them all when installing it&period; This approach gives the user more control over applications but requires developers to add lots of code just to get a single permission&period;<&sol;p>&NewLine;<p>In this article&comma; we will talk about how to add runtime permissions easily and quickly using <strong><span style&equals;"color&colon; &num;008000&semi;"><a style&equals;"color&colon; &num;008000&semi;" href&equals;"https&colon;&sol;&sol;github&period;com&sol;Karumi&sol;Dexter" target&equals;"&lowbar;blank" rel&equals;"nofollow noopener noreferrer">Dexter<&sol;a><&sol;span><&sol;strong> library&period; Dexter is an Android library that simplifies the process of requesting permissions at runtime&period;<&sol;p>&NewLine;<p class&equals;"p1">This is an introductory article about the Dexter covering basic features offered by the library&period; Dexter provides other features like using it with SnackBar&comma; different types of listeners&comma; error handling and a few others&period; You can find more information on Dexter’s <strong><span style&equals;"color&colon; &num;008000&semi;"><a style&equals;"color&colon; &num;008000&semi;" href&equals;"https&colon;&sol;&sol;github&period;com&sol;Karumi&sol;Dexter"><span class&equals;"s1">developer<&sol;span><&sol;a><&sol;span><&sol;strong> page&period;<&sol;p>&NewLine;<p><strong>Get <span style&equals;"color&colon; &num;008000&semi;">GITHUB<&sol;span> code from <span style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;github&period;com&sol;arunk7839&sol;RuntimePermissionUsingDexter">HERE<&sol;a>&period;<&sol;span><&sol;strong><&sol;p>&NewLine;<p><amp-youtube layout&equals;"responsive" width&equals;"1200" height&equals;"675" data-videoid&equals;"l3QZZOU6KPU" title&equals;"Android Runtime Permissions with Dexter"><a placeholder href&equals;"https&colon;&sol;&sol;youtu&period;be&sol;l3QZZOU6KPU"><img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;l3QZZOU6KPU&sol;hqdefault&period;jpg" layout&equals;"fill" object-fit&equals;"cover" alt&equals;"Android Runtime Permissions with Dexter"><&sol;a><&sol;amp-youtube><&sol;p>&NewLine;<h3><span style&equals;"color&colon; &num;000080&semi;"><strong>Adding Dexter Library<&sol;strong><&sol;span><&sol;h3>&NewLine;<p>To get started with Dexter library firstly you have to include it in your <span style&equals;"color&colon; &num;008000&semi;"><strong>build&period;gradle<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>dependencies&lbrace;&NewLine;<span style&equals;"color&colon; &num;0000ff&semi;"><strong> &sol;&sol; Dexter runtime permissions<&sol;strong><&sol;span>&NewLine; implementation <span class&equals;"pl-s"><span class&equals;"pl-pds">'<&sol;span>com&period;karumi&colon;dexter&colon;6&period;0&period;0<span class&equals;"pl-pds">'<&sol;span><&sol;span>&NewLine;&rcub;<&sol;pre>&NewLine;<p>To start using the library you just need to call <strong><span style&equals;"color&colon; &num;008000&semi;">Dexter<&sol;span><&sol;strong> with a valid <strong><span style&equals;"color&colon; &num;008000&semi;">Activity <&sol;span><&sol;strong>&colon;<&sol;p>&NewLine;<pre><span class&equals;"pl-k">public<&sol;span> <span class&equals;"pl-smi">MyActivity<&sol;span> extends <span class&equals;"pl-smi">Activity<&sol;span> &lbrace;&NewLine; <span class&equals;"pl-k">&commat;Override<&sol;span> &NewLine;<span class&equals;"pl-k"> public<&sol;span> <span class&equals;"pl-k">void<&sol;span> onCreate&lpar;&rpar; &lbrace;&NewLine; <span class&equals;"pl-c1">super<&sol;span><span class&equals;"pl-k">&period;<&sol;span>onCreate&lpar;&rpar;&semi;&NewLine; <span class&equals;"pl-smi">Dexter<&sol;span><span class&equals;"pl-k">&period;<&sol;span>withActivity&lpar;activity&rpar;&NewLine; &period;withPermission&lpar;permission&rpar;&NewLine; &period;withListener&lpar;listener&rpar;&NewLine; &period;check&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine;&rcub;<&sol;pre>&NewLine;<h3><span style&equals;"color&colon; &num;000080&semi;"><strong>Requesting Single Permission<&sol;strong><&sol;span><&sol;h3>&NewLine;<p class&equals;"p1">To request single permission&comma; you can use <strong><span style&equals;"color&colon; &num;008000&semi;">withPermission&lpar;&rpar;<&sol;span><&sol;strong> method by passing the required permission&period; You also need a <span style&equals;"color&colon; &num;008000&semi;"><b>PermissionListener<&sol;b><&sol;span> callback to receive the state of the permission&period;<&sol;p>&NewLine;<ul>&NewLine;<li class&equals;"p1"><b> <span style&equals;"color&colon; &num;0000ff&semi;">onPermissionGranted&lpar;&rpar;<&sol;span><&sol;b> will be called once the permission is granted&period;<&sol;li>&NewLine;<li class&equals;"p1"><b> <span style&equals;"color&colon; &num;0000ff&semi;">onPermissionDenied&lpar;&rpar;<&sol;span><&sol;b> will be called when the permission is denied&period; Here you can check whether the permission is permanently denied by using <span style&equals;"color&colon; &num;008000&semi;"><b>response&period;isPermanentlyDenied&lpar;&rpar;<&sol;b><&sol;span> condition&period;<&sol;li>&NewLine;<li><strong><span style&equals;"color&colon; &num;0000ff&semi;">onPermissionRationaleShouldBeShown&lpar;&rpar; <&sol;span><&sol;strong><span style&equals;"color&colon; &num;000000&semi;">will be called if the user has already declined the permission once&period; This method contains PermissionToken parameter using which you can call any of the two methods &colon;<&sol;span><&sol;li>&NewLine;<&sol;ul>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">continuePermissionRequest&lpar;&rpar;<&sol;span> <&sol;strong>&colon; Continues with the permission request process&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">cancelPermissionRequest&lpar;&rpar;<&sol;span><&sol;strong> &colon; Cancels the permission request process&period;<&sol;p>&NewLine;<p class&equals;"p1">The below code requests <span style&equals;"color&colon; &num;008000&semi;"><b>CAMERA<&sol;b><&sol;span> permission&period;<&sol;p>&NewLine;<pre><span class&equals;"pl-smi">Dexter<&sol;span><span class&equals;"pl-k">&period;<&sol;span>withActivity&lpar;<span class&equals;"pl-c1">this<&sol;span>&rpar;&NewLine; &period;withPermission&lpar;<span class&equals;"pl-smi">Manifest<&sol;span><span class&equals;"pl-k">&period;<&sol;span><span class&equals;"pl-smi">permission<span class&equals;"pl-k">&period;<&sol;span>CAMERA<&sol;span>&rpar;&NewLine; &period;withListener&lpar;<span class&equals;"pl-k">new<&sol;span> <span class&equals;"pl-smi">PermissionListener<&sol;span>&lpar;&rpar; &lbrace;&NewLine; &NewLine;<span class&equals;"pl-k"> &commat;Override<&sol;span> &NewLine;<span class&equals;"pl-k"> public<&sol;span> <span class&equals;"pl-k">void<&sol;span> <span class&equals;"pl-en">onPermissionGranted<&sol;span>&lpar;<span class&equals;"pl-smi">PermissionGrantedResponse<&sol;span> <span class&equals;"pl-v">response<&sol;span>&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol;permission is granted&comma; open the camera<&sol;span><&sol;strong>&NewLine; &rcub;&NewLine; <span class&equals;"pl-k">&commat;Override<&sol;span> &NewLine;<span class&equals;"pl-k"> public<&sol;span> <span class&equals;"pl-k">void<&sol;span> <span class&equals;"pl-en">onPermissionDenied<&sol;span>&lpar;<span class&equals;"pl-smi">PermissionDeniedResponse<&sol;span> <span class&equals;"pl-v">response<&sol;span>&rpar; &lbrace;&NewLine;<code class&equals;"java comments"><strong><span style&equals;"color&colon; &num;0000ff&semi;"> &sol;&sol; check for permanent denial of permission<&sol;span><&sol;strong>&NewLine;           <&sol;code><code>if<&sol;code> <code class&equals;"java plain">&lpar;response&period;isPermanentlyDenied&lpar;&rpar;&rpar; &lbrace;&NewLine;           <&sol;code><span style&equals;"color&colon; &num;0000ff&semi;"><strong><code><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; navigate user to app settings<&sol;span><&sol;code><code class&equals;"java comments">&NewLine;<&sol;code><&sol;strong><&sol;span><code class&equals;"java plain">&rcub;&NewLine;           <&sol;code>&rcub; <span class&equals;"pl-k"> &commat;Override<&sol;span> <span class&equals;"pl-k"> public<&sol;span> <span class&equals;"pl-k">void<&sol;span> <span class&equals;"pl-en">onPermissionRationaleShouldBeShown<&sol;span>&lpar;<span class&equals;"pl-smi">PermissionRequest<&sol;span> <span class&equals;"pl-v">permission<&sol;span>&comma; <span class&equals;"pl-smi">PermissionToken<&sol;span> <span class&equals;"pl-v">token<&sol;span>&rpar; &lbrace; token&period;continuePermissionRequest&lpar;&rpar;&semi; &rcub; &rcub;&rpar; <span class&equals;"pl-k"> &period;<&sol;span>check&lpar;&rpar;&semi;<&sol;pre>&NewLine;<h3><strong><span style&equals;"color&colon; &num;000080&semi;">Requesting Multiple Permissions<&sol;span><&sol;strong><&sol;h3>&NewLine;<p>To request multiple permissions at the same time&comma; you can use <span style&equals;"color&colon; &num;008000&semi;"><strong>withPermissions&lpar;&rpar;<&sol;strong><&sol;span> method&period; Below code requests <span style&equals;"color&colon; &num;0000ff&semi;"><strong>STORAGE<&sol;strong><&sol;span> and <span style&equals;"color&colon; &num;0000ff&semi;"><strong>LOCATION<&sol;strong><&sol;span> permissions&period;<&sol;p>&NewLine;<ul>&NewLine;<li class&equals;"p1"><b><span style&equals;"color&colon; &num;0000ff&semi;">onPermissionsChecked&lpar;&rpar;<&sol;span><&sol;b> will be called if all permissions are granted&period;<&sol;li>&NewLine;<li><strong><span style&equals;"color&colon; &num;0000ff&semi;">onPermissionRationaleShouldBeShown&lpar;&rpar; <&sol;span><&sol;strong><span style&equals;"color&colon; &num;000000&semi;">will be called if the user has already declined the permission once&period;<&sol;span><&sol;li>&NewLine;<&sol;ul>&NewLine;<pre style&equals;"padding-left&colon; 30px&semi;">Dexter&period;withActivity&lpar;this&rpar;&NewLine; &period;withPermissions&lpar;&NewLine; Manifest&period;permission&period;READ&lowbar;EXTERNAL&lowbar;STORAGE&comma;&NewLine; Manifest&period;permission&period;WRITE&lowbar;EXTERNAL&lowbar;STORAGE&comma;&NewLine; Manifest&period;permission&period;ACCESS&lowbar;FINE&lowbar;LOCATION&rpar;&NewLine; &period;withListener&lpar;new MultiplePermissionsListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onPermissionsChecked&lpar;MultiplePermissionsReport report&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; check if all permissions are granted<&sol;span><&sol;strong>&NewLine; if &lpar;report&period;areAllPermissionsGranted&lpar;&rpar;&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; do you work now<&sol;span><&sol;strong>&NewLine; &rcub;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; check for permanent denial of any permission<&sol;span><&sol;strong>&NewLine; if &lpar;report&period;isAnyPermissionPermanentlyDenied&lpar;&rpar;&rpar; &lbrace;&NewLine;<strong><span style&equals;"color&colon; &num;0000ff&semi;"> &sol;&sol; permission is denied permenantly&comma; navigate user to app settings<&sol;span><&sol;strong>&NewLine; &NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onPermissionRationaleShouldBeShown&lpar;List&lt&semi;Permissionsrequest&gt&semi; permissions&comma; PermissionToken token&rpar; &lbrace;&NewLine; token&period;continuePermissionRequest&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine;&rcub;&rpar;&NewLine; &period;check&lpar;&rpar;&semi;<&sol;pre>&NewLine;<h3><strong><span style&equals;"color&colon; &num;000080&semi;">Error Handling<&sol;span><&sol;strong><&sol;h3>&NewLine;<p>You can also catch any errors occurred while integrating the library using <span style&equals;"color&colon; &num;008000&semi;"><strong>PermissionRequestErrorListener<&sol;strong><&sol;span>&period;<&sol;p>&NewLine;<pre> Dexter&period;withActivity&lpar;this&rpar;&NewLine; &period;withPermissions&lpar;&NewLine; Manifest&period;permission&period;READ&lowbar;EXTERNAL&lowbar;STORAGE&comma;&NewLine; Manifest&period;permission&period;WRITE&lowbar;EXTERNAL&lowbar;STORAGE&comma;&NewLine; Manifest&period;permission&period;ACCESS&lowbar;FINE&lowbar;LOCATION&rpar;&NewLine; &period;withListener&lpar;listener&rpar; &NewLine; &period;withErrorListener&lpar;new PermissionRequestErrorListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onError&lpar;DexterError error&rpar; &lbrace;&NewLine; Toast&period;makeText&lpar;getApplicationContext&lpar;&rpar;&comma; "Error occurred&excl; "&plus; error&period;toString&lpar;&rpar; &comma; Toast&period;LENGTH&lowbar;SHORT&rpar;&period;show&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine;&rcub;&rpar;&NewLine; &period;check&lpar;&rpar;&semi;<&sol;pre>&NewLine;<p>Now let’s see how to use Dexter in an example project&period;<&sol;p>&NewLine;<h3><span style&equals;"color&colon; &num;000080&semi;"><strong>Creating New Project<&sol;strong><&sol;span><&sol;h3>&NewLine;<p><strong>1<&sol;strong>&period; Create a new project in <span style&equals;"color&colon; &num;008000&semi;"><strong>Android Studio<&sol;strong><&sol;span> from <span style&equals;"color&colon; &num;008000&semi;"><strong>File &Implies; New Project<&sol;strong><&sol;span> and fill the project details&period;<&sol;p>&NewLine;<p><strong>2<&sol;strong>&period; Add the latest <strong><span style&equals;"color&colon; &num;0000ff&semi;"><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;github&period;com&sol;Karumi&sol;Dexter">Dexter<&sol;a><&sol;span><&sol;strong> dependency to your <span style&equals;"color&colon; &num;008000&semi;"><strong>build&period;gradle&period;<&sol;strong><&sol;span><&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>build&period;gradle<&sol;strong><&sol;span><&sol;p>&NewLine;<pre>dependencies &lbrace;&NewLine; implementation fileTree&lpar;dir&colon; 'libs'&comma; include&colon; &lbrack;'&ast;&period;jar'&rsqb;&rpar;&NewLine; implementation 'androidx&period;appcompat&colon;appcompat&colon;1&period;1&period;0'&NewLine; implementation 'androidx&period;constraintlayout&colon;constraintlayout&colon;1&period;1&period;3'&NewLine;&NewLine; <span style&equals;"color&colon; &num;0000ff&semi;"><strong>&sol;&sol; Dexter runtime permissions<&sol;strong><&sol;span>&NewLine; <strong><span style&equals;"color&colon; &num;008000&semi;">implementation 'com&period;karumi&colon;dexter&colon;6&period;0&period;0'<&sol;span><&sol;strong>&NewLine; testImplementation 'junit&colon;junit&colon;4&period;12'&NewLine; androidTestImplementation 'androidx&period;test&colon;runner&colon;1&period;2&period;0'&NewLine; androidTestImplementation 'androidx&period;test&period;espresso&colon;espresso-core&colon;3&period;2&period;0'&NewLine;&rcub;<&sol;pre>&NewLine;<p><strong>3<&sol;strong>&period; Open <strong><span style&equals;"color&colon; &num;008000&semi;">AndroidManifest<&sol;span><&sol;strong> file and add all the permissions which you want to request&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">AndroidManifest&period;xml <&sol;span><&sol;strong><&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;98&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine;&NewLine;<pre>&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;&NewLine;&lt&semi;manifest xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; package&equals;"com&period;example&period;dexterpermissionsdemo"&gt&semi;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&lt&semi;uses-permission android&colon;name&equals;"android&period;permission&period;CAMERA" &sol;&gt&semi;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;0000ff&semi;"> &lt&semi;uses-permission android&colon;name&equals;"android&period;permission&period;READ&lowbar;EXTERNAL&lowbar;STORAGE" &sol;&gt&semi;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;0000ff&semi;"> &lt&semi;uses-permission android&colon;name&equals;"android&period;permission&period;WRITE&lowbar;EXTERNAL&lowbar;STORAGE" &sol;&gt&semi;<&sol;span><&sol;strong>&NewLine;<strong><span style&equals;"color&colon; &num;0000ff&semi;"> &lt&semi;uses-permission android&colon;name&equals;"android&period;permission&period;ACCESS&lowbar;FINE&lowbar;LOCATION"&sol;&gt&semi;<&sol;span><&sol;strong>&NewLine;&NewLine; &lt&semi;application&NewLine; android&colon;allowBackup&equals;"true"&NewLine; android&colon;icon&equals;"&commat;mipmap&sol;ic&lowbar;launcher"&NewLine; android&colon;label&equals;"&commat;string&sol;app&lowbar;name"&NewLine; android&colon;roundIcon&equals;"&commat;mipmap&sol;ic&lowbar;launcher&lowbar;round"&NewLine; android&colon;supportsRtl&equals;"true"&NewLine; android&colon;theme&equals;"&commat;style&sol;AppTheme"&gt&semi;&NewLine; &lt&semi;activity android&colon;name&equals;"&period;MainActivity"&gt&semi;&NewLine; &lt&semi;intent-filter&gt&semi;&NewLine; &lt&semi;action android&colon;name&equals;"android&period;intent&period;action&period;MAIN" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;category android&colon;name&equals;"android&period;intent&period;category&period;LAUNCHER" &sol;&gt&semi;&NewLine; &lt&semi;&sol;intent-filter&gt&semi;&NewLine; &lt&semi;&sol;activity&gt&semi;&NewLine; &lt&semi;&sol;application&gt&semi;&NewLine;&NewLine;&lt&semi;&sol;manifest&gt&semi;<&sol;pre>&NewLine;<p><strong>4<&sol;strong>&period; Open the layout file of your main activity &lpar;<span style&equals;"color&colon; &num;008000&semi;"><strong>activity&lowbar;main&period;xml<&sol;strong> <&sol;span>&rpar; and add two buttons to test different permission methods&period;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>activity&lowbar;main&period;xml<&sol;strong> <&sol;span><&sol;p>&NewLine;<pre>&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;&NewLine;&lt&semi;RelativeLayout xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"&NewLine; xmlns&colon;app&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res-auto"&NewLine; xmlns&colon;tools&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;tools"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"match&lowbar;parent"&NewLine; tools&colon;context&equals;"&period;MainActivity"&gt&semi;&NewLine;&NewLine;&NewLine; &lt&semi;LinearLayout&NewLine; android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;centerHorizontal&equals;"true"&NewLine; android&colon;layout&lowbar;marginTop&equals;"100dp"&NewLine; android&colon;orientation&equals;"vertical"&NewLine; android&colon;paddingLeft&equals;"16dp"&NewLine; android&colon;paddingRight&equals;"16dp"&gt&semi;&NewLine;&NewLine; &lt&semi;Button&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;btn&lowbar;camera&lowbar;permission"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;layout&lowbar;marginBottom&equals;"16dp"&NewLine; android&colon;text&equals;"CAMERA PERMISSION" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;Button&NewLine; android&colon;id&equals;"&commat;&plus;id&sol;btn&lowbar;multiple&lowbar;permissions"&NewLine; android&colon;layout&lowbar;width&equals;"match&lowbar;parent"&NewLine; android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"&NewLine; android&colon;text&equals;"MULTIPLE PERMISSIONS" &sol;&gt&semi;&NewLine;&NewLine; &lt&semi;&sol;LinearLayout&gt&semi;&NewLine;&NewLine;&lt&semi;&sol;RelativeLayout&gt&semi;<&sol;pre>&NewLine;<p class&equals;"p1"><b>5<&sol;b>&period; Open <span style&equals;"color&colon; &num;008000&semi;"><b>MainActivity&period;java<&sol;b><&sol;span> and do the modification as shown below&period;<&sol;p>&NewLine;<ul>&NewLine;<li class&equals;"p1"><b><span style&equals;"color&colon; &num;0000ff&semi;">requestCameraPermission&lpar;&rpar;<&sol;span><&sol;b> requests for camera permission&period;<&sol;li>&NewLine;<li class&equals;"p1"><b><span style&equals;"color&colon; &num;0000ff&semi;">requestMultiplePermission&lpar;&rpar;<&sol;span><&sol;b> requests multiple permissions at once&period;<&sol;li>&NewLine;<li class&equals;"p1"><span style&equals;"color&colon; &num;0000ff&semi;"><b>response&period;isPermanentlyDenied&lpar;&rpar;<&sol;b> <&sol;span>and <span style&equals;"color&colon; &num;0000ff&semi;"><b>report&period;isAnyPermissionPermanentlyDenied&lpar;&rpar;<&sol;b><&sol;span> checks if the permission is denied permanently&period; Here we have to navigate user to app settings screen by showing a dialog&period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><b>MainActivity&period;java<&sol;b><&sol;span><&sol;p>&NewLine;<pre>package com&period;example&period;dexterpermissionsdemo&semi;&NewLine;&NewLine;import android&period;Manifest&semi;&NewLine;import android&period;content&period;DialogInterface&semi;&NewLine;import android&period;content&period;Intent&semi;&NewLine;import android&period;net&period;Uri&semi;&NewLine;import android&period;os&period;Bundle&semi;&NewLine;import android&period;provider&period;MediaStore&semi;&NewLine;import android&period;provider&period;Settings&semi;&NewLine;import android&period;util&period;Log&semi;&NewLine;import android&period;view&period;View&semi;&NewLine;import android&period;widget&period;Button&semi;&NewLine;import android&period;widget&period;Toast&semi;&NewLine;&NewLine;import com&period;karumi&period;dexter&period;Dexter&semi;&NewLine;import com&period;karumi&period;dexter&period;MultiplePermissionsReport&semi;&NewLine;import com&period;karumi&period;dexter&period;PermissionToken&semi;&NewLine;import com&period;karumi&period;dexter&period;listener&period;DexterError&semi;&NewLine;import com&period;karumi&period;dexter&period;listener&period;PermissionDeniedResponse&semi;&NewLine;import com&period;karumi&period;dexter&period;listener&period;PermissionGrantedResponse&semi;&NewLine;import com&period;karumi&period;dexter&period;listener&period;PermissionRequest&semi;&NewLine;import com&period;karumi&period;dexter&period;listener&period;PermissionRequestErrorListener&semi;&NewLine;import com&period;karumi&period;dexter&period;listener&period;multi&period;MultiplePermissionsListener&semi;&NewLine;import com&period;karumi&period;dexter&period;listener&period;single&period;PermissionListener&semi;&NewLine;&NewLine;import java&period;util&period;List&semi;&NewLine;&NewLine;import androidx&period;appcompat&period;app&period;AlertDialog&semi;&NewLine;import androidx&period;appcompat&period;app&period;AppCompatActivity&semi;&NewLine;&NewLine;public class MainActivity extends AppCompatActivity &lbrace;&NewLine;&NewLine; private Button btnCameraPermission&comma; btnMutiplePermissions&semi;&NewLine;&NewLine; &commat;Override&NewLine; protected void onCreate&lpar;Bundle savedInstanceState&rpar; &lbrace;&NewLine; super&period;onCreate&lpar;savedInstanceState&rpar;&semi;&NewLine; setContentView&lpar;R&period;layout&period;activity&lowbar;main&rpar;&semi;&NewLine;&NewLine;&NewLine; btnCameraPermission &equals; findViewById&lpar;R&period;id&period;btn&lowbar;camera&lowbar;permission&rpar;&semi;&NewLine; btnMutiplePermissions &equals; findViewById&lpar;R&period;id&period;btn&lowbar;multiple&lowbar;permissions&rpar;&semi;&NewLine;&NewLine; btnCameraPermission&period;setOnClickListener&lpar;new View&period;OnClickListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onClick&lpar;View view&rpar; &lbrace;&NewLine; requestCameraPermission&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine;&NewLine; btnMutiplePermissions&period;setOnClickListener&lpar;new View&period;OnClickListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onClick&lpar;View view&rpar; &lbrace;&NewLine; requestMutiplePermission&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&ast;&ast;&NewLine; &ast; Requesting multiple permissions &lpar;storage and location&rpar; at once&NewLine; &ast; This uses multiple permission model from dexter&NewLine; &ast;&sol;<&sol;span><&sol;strong>&NewLine; private void requestMutiplePermission&lpar;&rpar; &lbrace;&NewLine; Dexter&period;withActivity&lpar;this&rpar;&NewLine; &period;withPermissions&lpar;&NewLine; Manifest&period;permission&period;READ&lowbar;EXTERNAL&lowbar;STORAGE&comma;&NewLine; Manifest&period;permission&period;WRITE&lowbar;EXTERNAL&lowbar;STORAGE&comma;&NewLine; Manifest&period;permission&period;ACCESS&lowbar;FINE&lowbar;LOCATION&rpar;&NewLine; &period;withListener&lpar;new MultiplePermissionsListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onPermissionsChecked&lpar;MultiplePermissionsReport report&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; check if all permissions are granted<&sol;span><&sol;strong>&NewLine; if &lpar;report&period;areAllPermissionsGranted&lpar;&rpar;&rpar; &lbrace;&NewLine; Toast&period;makeText&lpar;getApplicationContext&lpar;&rpar;&comma; "All permissions are granted&excl;"&comma; Toast&period;LENGTH&lowbar;SHORT&rpar;&period;show&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; check for permanent denial of any permission<&sol;span><&sol;strong>&NewLine; if &lpar;report&period;isAnyPermissionPermanentlyDenied&lpar;&rpar;&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; show alert dialog navigating to Settings<&sol;span><&sol;strong>&NewLine; showSettingsDialog&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onPermissionRationaleShouldBeShown&lpar;List permissions&comma; PermissionToken token&rpar; &lbrace;&NewLine; token&period;continuePermissionRequest&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&period;&NewLine; withErrorListener&lpar;new PermissionRequestErrorListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onError&lpar;DexterError error&rpar; &lbrace;&NewLine; Toast&period;makeText&lpar;getApplicationContext&lpar;&rpar;&comma; "Error occurred&excl;"&plus; error&period;toString&lpar;&rpar;&comma; Toast&period;LENGTH&lowbar;SHORT&rpar;&period;show&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&NewLine; &period;onSameThread&lpar;&rpar;&NewLine; &period;check&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&ast;&ast;&NewLine; &ast; Requesting camera permission&NewLine; &ast; This uses single permission model from dexter&NewLine; &ast; Once the permission granted&comma; opens the camera&NewLine; &ast;&sol;<&sol;span><&sol;strong>&NewLine; private void requestCameraPermission&lpar;&rpar; &lbrace;&NewLine; Dexter&period;withActivity&lpar;this&rpar;&NewLine; &period;withPermission&lpar;Manifest&period;permission&period;CAMERA&rpar;&NewLine; &period;withListener&lpar;new PermissionListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onPermissionGranted&lpar;PermissionGrantedResponse response&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; permission is granted<&sol;span><&sol;strong>&NewLine; openCamera&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onPermissionDenied&lpar;PermissionDeniedResponse response&rpar; &lbrace;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; check for permanent denial of permission<&sol;span><&sol;strong>&NewLine; if &lpar;response&period;isPermanentlyDenied&lpar;&rpar;&rpar; &lbrace;&NewLine; showSettingsDialog&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&NewLine;&NewLine; &commat;Override&NewLine; public void onPermissionRationaleShouldBeShown&lpar;PermissionRequest permission&comma; PermissionToken token&rpar; &lbrace;&NewLine; token&period;continuePermissionRequest&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&period;check&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&ast;&ast;&NewLine; &ast; Showing Alert Dialog with Settings option&NewLine; &ast; Navigates user to app settings&NewLine; &ast;&sol;<&sol;span><&sol;strong>&NewLine; private void showSettingsDialog&lpar;&rpar; &lbrace;&NewLine; AlertDialog&period;Builder builder &equals; new AlertDialog&period;Builder&lpar;MainActivity&period;this&rpar;&semi;&NewLine; builder&period;setTitle&lpar;"Need Permissions"&rpar;&semi;&NewLine; builder&period;setMessage&lpar;"This app needs permission to use this feature&period; You can grant them in app settings&period;"&rpar;&semi;&NewLine; builder&period;setPositiveButton&lpar;"GOTO SETTINGS"&comma; new DialogInterface&period;OnClickListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onClick&lpar;DialogInterface dialog&comma; int which&rpar; &lbrace;&NewLine; dialog&period;cancel&lpar;&rpar;&semi;&NewLine; openSettings&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine; builder&period;setNegativeButton&lpar;"Cancel"&comma; new DialogInterface&period;OnClickListener&lpar;&rpar; &lbrace;&NewLine; &commat;Override&NewLine; public void onClick&lpar;DialogInterface dialog&comma; int which&rpar; &lbrace;&NewLine; dialog&period;cancel&lpar;&rpar;&semi;&NewLine; &rcub;&NewLine; &rcub;&rpar;&semi;&NewLine; builder&period;show&lpar;&rpar;&semi;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; <strong><span style&equals;"color&colon; &num;0000ff&semi;">&sol;&sol; navigating user to app settings<&sol;span><&sol;strong>&NewLine; private void openSettings&lpar;&rpar; &lbrace;&NewLine; Intent intent &equals; new Intent&lpar;Settings&period;ACTION&lowbar;APPLICATION&lowbar;DETAILS&lowbar;SETTINGS&rpar;&semi;&NewLine; Uri uri &equals; Uri&period;fromParts&lpar;"package"&comma; getPackageName&lpar;&rpar;&comma; null&rpar;&semi;&NewLine; intent&period;setData&lpar;uri&rpar;&semi;&NewLine; startActivityForResult&lpar;intent&comma; 101&rpar;&semi;&NewLine; &rcub;&NewLine;&NewLine; private void openCamera&lpar;&rpar; &lbrace;&NewLine; Intent intent &equals; new Intent&lpar;MediaStore&period;ACTION&lowbar;IMAGE&lowbar;CAPTURE&rpar;&semi;&NewLine; startActivityForResult&lpar;intent&comma; 100&rpar;&semi;&NewLine; &rcub;&NewLine;&rcub;<&sol;pre>&NewLine;<p>When you run your application it will look like this as shown below &colon;<&sol;p>&NewLine;<p><img class&equals;"alignnone wp-image-1276" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;11&sol;Screenshot&lowbar;1573117321&period;png" alt&equals;"Screenshot&lowbar;1573117321" width&equals;"320" height&equals;"569" &sol;>    <img class&equals;"alignnone wp-image-1275" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2019&sol;11&sol;Screenshot&lowbar;1573117433&period;png" alt&equals;"Screenshot&lowbar;1573117433" width&equals;"320" height&equals;"569" &sol;>&NewLine;

Exit mobile version