Sau Android 4.4 Kitkat và tính đến năm 2017, tỷ lệ Android 4.4 trở xuống là khoảng 20% và giảm dần, không thể lưu vào thẻ SD bằng cách sử dụng File
lớp và getExternalStorageDirectory()
phương thức. Phương pháp này trả về bộ nhớ trong của thiết bị và hình ảnh lưu vào mọi ứng dụng. Bạn cũng có thể chỉ lưu hình ảnh riêng tư vào ứng dụng của mình và bị xóa khi người dùng xóa ứng dụng của bạn bằng openFileOutput()
phương thức.
Bắt đầu với Android 6.0, bạn có thể định dạng thẻ SD thành bộ nhớ trong nhưng chỉ riêng tư với thiết bị của mình. (Nếu bạn định dạng xe SD là bộ nhớ trong, chỉ thiết bị của bạn mới có thể truy cập hoặc xem nội dung của nó) Bạn có thể lưu vào thẻ SD đó bằng cách sử dụng câu trả lời khác nhưng nếu bạn muốn sử dụng thẻ SD rời, bạn nên đọc câu trả lời của tôi dưới đây.
Bạn nên sử dụng Storage Access Framework để đưa uri vào onActivityResult
phương thức hoạt động của thư mục để lấy thư mục do người dùng chọn và thêm quyền truy cập liên tục để có thể truy cập thư mục sau khi người dùng khởi động lại thiết bị.
@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);
}
}
}
}
Bây giờ, lưu thư mục lưu vào tùy chọn chia sẻ không yêu cầu người dùng chọn thư mục mỗi khi bạn muốn lưu hình ảnh.
Bạn nên sử dụng DocumentFile
lớp để lưu hình ảnh của mình, không File
hoặc ParcelFileDescriptor
, để biết thêm thông tin, bạn có thể kiểm tra chủ đề này để lưu hình ảnh vào thẻ SD với compress(CompressFormat.JPEG, 100, out);
phương thức và DocumentFile
các lớp.
mImage.setImageBitmap(_result.getBitmap());
của tôionTaskComplete()
. Bây giờ tôi phải cho phép người dùng lưu tệp cục bộ nếu họ muốn thông qua menu ngữ cảnh nhấn dài. Tôi sẽ có thể sử dụng giải pháp dưới đây. Những gì tôi muốn biết mặc dù, bạn đã khám phá một cách tiếp cận tốt hơn cho điều này?