Після Android 4.4 Kitkat, а станом на 2017 рік частка Android 4.4 і менше становить приблизно 20% і зменшується, зберегти на SD-картці за допомогою File
класу та getExternalStorageDirectory()
методу неможливо . Цей метод повертає внутрішню пам'ять пристрою, а зображення зберігаються видимими для кожного додатка. Ви також можете зберігати зображення, які є лише приватними у вашій програмі, та видаляти їх, коли користувач видаляє ваш додаток за допомогоюopenFileOutput()
методом.
Починаючи з Android 6.0, ви можете відформатувати SD-карту як внутрішню пам'ять, але лише приватну для вашого пристрою. (Якщо ви форматуєте автомобіль SD як внутрішню пам'ять, лише ваш пристрій може отримати доступ до нього чи побачити його вміст) Ви можете зберегти його на цій SD-картці за допомогою інші відповіді, але якщо ви хочете використовувати знімну SD-карту, прочитайте мою відповідь нижче.
Вам слід скористатися Storage Access Framework Framework, щоб отримати урі до onActivityResult
методу активності папок, щоб отримати вибрану користувачем папку, і додати відновлюваний постійний дозвіл, щоб мати доступ до папки після перезавантаження пристрою.
@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()
зворотному виклику. Тепер я повинен дозволити користувачам зберігати файл на локальному рівні, якщо вони хочуть за допомогою довгого контекстного меню. Я повинен мати можливість використовувати рішення нижче. Що я хочу знати, хоча ви виявили кращий підхід до цього?