По правилам безопасности Android приложение должно запрашивать у пользователя разрешение записи на карту, интернету, контактам и т. д. Но если при запросе доступа приложения к интернету подтверждения от пользователя не требуется, то при запросе к карте памяти это разрешение должен подтвердить пользователь. Если разрешение не будет запрошено или не будет подтверждено, то при обращение к карте памяти вы получите ошибку.
В следующем методе производится проверка наличия разрешения. Это нужно на случай, если пользователь разрешит доступ к карте, а потом зайдет в настройки приложения и отменит своё разрешение. Как вы уже догадались, если это не проверить то произойдет ошибка при обращении к карте памяти.
Если Разрешение записи на карту памяти нет, то запрашиваем его
ActivityCompat.requestPermissions(activity, new String[]
{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants
.MY_PERMISSIONS_REQUEST_WRITE);
Можно ещё повторно обратится к этому же методу permisson и если выход будет, через else то мы будем уверены, что разрешение точно получено, но в этом методе я этого не делаю, т. к. пока пользователь не даст разрешения на запись к карте памяти он будет повторно до бесконечности получать запрос, пока не закроет приложение.
Обратите внимание, что Manifest.permission.WRITE_EXTERNAL_STORAGE получает доступ к карте и на запись и на чтение, если доступ на запись не нужен то можно воспользоваться Manifest.permission.READ_EXTERNAL_STORAGE. И все эти разрешения нужно обязательно прописать в манифесте.
// Разрешение записи на карту памяти
public static void permisson(Context context, Activity activity){
// Проверка наличия разрешения записи на карту памяти
if (ContextCompat.checkSelfPermission(context,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager
.PERMISSION_GRANTED) {
// Разрешение не предоставлено
Toast.makeText(context, "Разрешения на запись нет",
Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(activity, new String[]
{Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants
.MY_PERMISSIONS_REQUEST_WRITE);
}
else {
// Разрешение предоставлено
Toast.makeText(context, "Разрешение на запись есть",
Toast.LENGTH_LONG).show();
}
}