Після 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()зворотному виклику. Тепер я повинен дозволити користувачам зберігати файл на локальному рівні, якщо вони хочуть за допомогою довгого контекстного меню. Я повинен мати можливість використовувати рішення нижче. Що я хочу знати, хоча ви виявили кращий підхід до цього?