简单代码:
public class LaunchActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);
if (isGrantSDCardReadPermission()) {
//
} else {
requestPermission();
}
}
private boolean isGrantSDCardReadPermission() {
return PermissionUtils.isGrantSDCardReadPermission(this);
}
private void requestPermission() {
PermissionUtils.requestSDCardReadPermission(this, REQUEST_CODE_SDCARD_READ);
}
private static final int REQUEST_CODE_SDCARD_READ = 1;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_SDCARD_READ:
if (isGrantSDCardReadPermission()) {
//
} else {
Toast.makeText(this, "failure because without sd card read permission", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}
public class PermissionUtils {
/**
* 是否有权限
*
* @param context
* @return
*/
public static boolean checkSelfPermission(Context context, String permission) {
if (null == context) {
return false;
}
int per = ContextCompat.checkSelfPermission(context, permission);
return per == PackageManager.PERMISSION_GRANTED;
}
/**
* Check that all given permissions have been granted by verifying that each entry in the
* given array is of the value {@link PackageManager#PERMISSION_GRANTED}.
*
* @see Activity#onRequestPermissionsResult(int, String[], int[])
*/
public static boolean verifyPermissions(int[] grantResults) {
// At least one result must be checked.
if (null == grantResults || grantResults.length < 1) {
return false;
}
// Verify that each required permission has been granted, otherwise return false.
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
public static boolean isGrantSDCardReadPermission(Context context) {
return checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
}
public static void requestSDCardReadPermission(Activity activity, int requestCode) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, requestCode);
}
}
最后再附上需要动态申请的权限组,每组只要有一个权限申请成功,就默认组内其他权限申请成功了。
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS