Android Marshmallow permission model on OS 4.0 READ_EXTERNAL_STORAGE permission always not granted

What ActivityCompat.requestPermissions() does is:

  • call through to the real requestPermissions() if you are on Android 6.0+, or

  • use PackageManager to see if you hold the requested permissions on older versions of Android

The problem with READ_EXTERNAL_STORAGE is that it was added in API Level 16 (Android 4.1). You cannot hold it on older versions of Android than that, for the simple reason that it did not exist.

Either:

  • Set your minSdkVersion to 16, or

  • Put your own logic in to handle this case, recognizing that READ_EXTERNAL_STORAGE is irrelevant prior to API Level 16