In Android M and above, you have to ask for the permissions that are classified as "dangerous". You can find a full list of the permissions that needs to be requested here.
You can, however, avoid requesting by setting compileSDK and targetSDK to < 23. Note that this prevents you from using any of the API 23+ features.
You request the permissions like this:
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},//Your permissions here
1);//Random request code
Check if the user is running API 23+ by doing:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
//Request: Use a method or add the permission asking directly into here.
}
And if you need to check the result, you can do it like this:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(MainActivity.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}