42
42
import android .provider .Settings ;
43
43
import android .util .Log ;
44
44
45
+ import androidx .annotation .Nullable ;
45
46
import androidx .core .content .ContextCompat ;
46
47
47
48
import java .util .ArrayList ;
48
49
import java .util .List ;
50
+ import java .util .Set ;
49
51
50
52
/**
51
53
* This class includes utility functions for Android permissions related operations.
@@ -58,38 +60,65 @@ public final class PermissionsUtil {
58
60
static final int REQUEST_CAMERA_PERMISSION = 2 ;
59
61
static final int REQUEST_VIBRATE_PERMISSION = 3 ;
60
62
public static final int REQUEST_ALL_PERMISSION_REQ_CODE = 1001 ;
63
+ public static final int REQUEST_SINGLE_PERMISSION_REQ_CODE = 1002 ;
61
64
public static final int REQUEST_MANAGE_EXTERNAL_STORAGE_REQ_CODE = 2002 ;
62
65
63
66
private PermissionsUtil () {
64
67
}
65
68
66
69
/**
67
70
* Request a dangerous permission. name must be specified in <a href="https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml">this</a>
68
- * @param name the name of the requested permission.
71
+ * @param permissionName the name of the requested permission.
69
72
* @param activity the caller activity for this method.
70
73
* @return true/false. "true" if permission was granted otherwise returns "false".
71
74
*/
72
- public static boolean requestPermission (String name , Activity activity ) {
75
+ public static boolean requestPermission (String permissionName , Activity activity ) {
73
76
if (Build .VERSION .SDK_INT < Build .VERSION_CODES .M ) {
74
77
// Not necessary, asked on install already
75
78
return true ;
76
79
}
77
80
78
- if (name .equals ("RECORD_AUDIO" ) && ContextCompat .checkSelfPermission (activity , Manifest .permission .RECORD_AUDIO ) != PackageManager .PERMISSION_GRANTED ) {
79
- activity .requestPermissions (new String [] { Manifest .permission .RECORD_AUDIO }, REQUEST_RECORD_AUDIO_PERMISSION );
80
- return false ;
81
- }
81
+ switch (permissionName ) {
82
+ case "RECORD_AUDIO" :
83
+ case Manifest .permission .RECORD_AUDIO :
84
+ if (ContextCompat .checkSelfPermission (activity , Manifest .permission .RECORD_AUDIO ) != PackageManager .PERMISSION_GRANTED ) {
85
+ activity .requestPermissions (new String [] { Manifest .permission .RECORD_AUDIO }, REQUEST_RECORD_AUDIO_PERMISSION );
86
+ return false ;
87
+ }
88
+ return true ;
82
89
83
- if (name .equals ("CAMERA" ) && ContextCompat .checkSelfPermission (activity , Manifest .permission .CAMERA ) != PackageManager .PERMISSION_GRANTED ) {
84
- activity .requestPermissions (new String [] { Manifest .permission .CAMERA }, REQUEST_CAMERA_PERMISSION );
85
- return false ;
86
- }
90
+ case "CAMERA" :
91
+ case Manifest .permission .CAMERA :
92
+ if (ContextCompat .checkSelfPermission (activity , Manifest .permission .CAMERA ) != PackageManager .PERMISSION_GRANTED ) {
93
+ activity .requestPermissions (new String [] { Manifest .permission .CAMERA }, REQUEST_CAMERA_PERMISSION );
94
+ return false ;
95
+ }
96
+ return true ;
87
97
88
- if (name .equals ("VIBRATE" ) && ContextCompat .checkSelfPermission (activity , Manifest .permission .VIBRATE ) != PackageManager .PERMISSION_GRANTED ) {
89
- activity .requestPermissions (new String [] { Manifest .permission .VIBRATE }, REQUEST_VIBRATE_PERMISSION );
90
- return false ;
98
+ case "VIBRATE" :
99
+ case Manifest .permission .VIBRATE :
100
+ if (ContextCompat .checkSelfPermission (activity , Manifest .permission .VIBRATE ) != PackageManager .PERMISSION_GRANTED ) {
101
+ activity .requestPermissions (new String [] { Manifest .permission .VIBRATE }, REQUEST_VIBRATE_PERMISSION );
102
+ return false ;
103
+ }
104
+ return true ;
105
+
106
+ default :
107
+ // Check if the given permission is a dangerous permission
108
+ try {
109
+ PermissionInfo permissionInfo = getPermissionInfo (activity , permissionName );
110
+ int protectionLevel = Build .VERSION .SDK_INT >= Build .VERSION_CODES .P ? permissionInfo .getProtection () : permissionInfo .protectionLevel ;
111
+ if (protectionLevel == PermissionInfo .PROTECTION_DANGEROUS && ContextCompat .checkSelfPermission (activity , permissionName ) != PackageManager .PERMISSION_GRANTED ) {
112
+ activity .requestPermissions (new String [] { permissionName }, REQUEST_SINGLE_PERMISSION_REQ_CODE );
113
+ return false ;
114
+ }
115
+ } catch (PackageManager .NameNotFoundException e ) {
116
+ // Unknown permission - return false as it can't be granted.
117
+ Log .w (TAG , "Unable to identify permission " + permissionName , e );
118
+ return false ;
119
+ }
120
+ return true ;
91
121
}
92
- return true ;
93
122
}
94
123
95
124
/**
@@ -98,6 +127,16 @@ public static boolean requestPermission(String name, Activity activity) {
98
127
* @return true/false. "true" if all permissions were granted otherwise returns "false".
99
128
*/
100
129
public static boolean requestManifestPermissions (Activity activity ) {
130
+ return requestManifestPermissions (activity , null );
131
+ }
132
+
133
+ /**
134
+ * Request dangerous permissions which are defined in the Android manifest file from the user.
135
+ * @param activity the caller activity for this method.
136
+ * @param excludes Set of permissions to exclude from the request
137
+ * @return true/false. "true" if all permissions were granted otherwise returns "false".
138
+ */
139
+ public static boolean requestManifestPermissions (Activity activity , @ Nullable Set <String > excludes ) {
101
140
if (Build .VERSION .SDK_INT < Build .VERSION_CODES .M ) {
102
141
return true ;
103
142
}
@@ -115,6 +154,9 @@ public static boolean requestManifestPermissions(Activity activity) {
115
154
116
155
List <String > requestedPermissions = new ArrayList <>();
117
156
for (String manifestPermission : manifestPermissions ) {
157
+ if (excludes != null && excludes .contains (manifestPermission )) {
158
+ continue ;
159
+ }
118
160
try {
119
161
if (manifestPermission .equals (Manifest .permission .MANAGE_EXTERNAL_STORAGE )) {
120
162
if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R && !Environment .isExternalStorageManager ()) {
0 commit comments