В настройках телефона разрешения даны. Телефон с Андроид 8.0.
compileSdkVersion 28
minSdkVersion 16
targetSdkVersion 28
В манифесте есть:
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
В моем коде эта переменная «разрешения» всегда равна -1:
int permissions = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);




Начиная с Android 6 (API 23) вы также должны запрашивать это разрешение во время выполнения. Это видео может помочь: https://thewikihow.com/video_WGz-alwVh8A
Хорошо, спасибо Ларри Шиферу за разрешения во время выполнения.
Учитывая документы Android:
Я внес некоторые изменения в метод из ссылки 2. Перед тем, как что-то сделать, он проверяет разрешения и при необходимости запрашивает подтверждение у пользователя, в противном случае устанавливает разрешения принудительно.
public void requestRuntimePermission(final Context context, final String manifestPermission, final int requestCode) {
int permissions = ContextCompat.checkSelfPermission(context, manifestPermission);
if (permissions != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
manifestPermission)) {
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context);
builder.setMessage("Allow access?")
.setCancelable(true)
//Cancel
.setNegativeButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
})
//Ok
.setPositiveButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
ActivityCompat.requestPermissions((Activity) context,
new String[]{manifestPermission},
requestCode);
}
});
android.support.v7.app.AlertDialog alert = builder.create();
alert.show();
} else {
// Permission has not been granted yet. Request it directly.
ActivityCompat.requestPermissions((Activity) context, new String[]{manifestPermission},
requestCode);
}
}
}
Пример использования:
requestRuntimePermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE, 0);
P.S. Параметр requestCode в requestRuntimePermission можно использовать для определения того, какое разрешение разрешено в обратном вызове onRequestPermissionsResult. (ссылка 3)