После Android 4.4 Kitkat и доли Android 4.4 и менее в 2017 году, составляющей около 20%, уменьшается, сохранить на SD-карту невозможно, используя File
класс и getExternalStorageDirectory()
метод. Этот метод возвращает внутреннюю память устройства и сохраненные изображения, видимые для каждого приложения. Вы также можете сохранять изображения только для вашего приложения и удалять, когда пользователь удаляет ваше приложение с помощьюopenFileOutput()
методом.
Начиная с Android 6.0, вы можете отформатировать свою SD-карту как внутреннюю память, но только для своего устройства. (Если вы отформатируете SD-автомобиль как внутреннюю память, только ваше устройство может получить доступ или просмотреть его содержимое). Вы можете сохранить на эту SD-карту, используя другие ответы, но если вы хотите использовать съемную SD-карту, вы должны прочитать мой ответ ниже.
Вы должны использовать Storage Access Framework, чтобы получить onActivityResult
метод действия URI к папке, чтобы получить папку, выбранную пользователем, и добавить извлекаемое постоянное разрешение, чтобы иметь возможность доступа к папке после того, как пользователь перезапустит устройство.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// selectDirectory() invoked
if (requestCode == REQUEST_FOLDER_ACCESS) {
if (data.getData() != null) {
Uri treeUri = data.getData();
tvSAF.setText("Dir: " + data.getData().toString());
currentFolder = treeUri.toString();
saveCurrentFolderToPrefs();
// grantUriPermission(getPackageName(), treeUri,
// Intent.FLAG_GRANT_READ_URI_PERMISSION |
// Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
}
}
Теперь сохраните папку сохранения в общих настройках, чтобы пользователь не выбирал папку каждый раз, когда вы хотите сохранить изображение.
Вы должны использовать DocumentFile
класс для сохранения вашего изображения, а не File
или ParcelFileDescriptor
, для получения дополнительной информации вы можете проверить эту ветку для сохранения изображения на SD-карту с compress(CompressFormat.JPEG, 100, out);
методом и DocumentFile
классами.
mImage.setImageBitmap(_result.getBitmap());
мойonTaskComplete()
обратный вызов. Теперь я должен разрешить пользователям сохранять файл локально, если они хотят через долгое нажатие контекстного меню. Я должен быть в состоянии использовать решение ниже. Что я хочу знать, вы нашли лучший подход к этому?