Bộ nhớ ngoài Android: nó là gì, các loại phương tiện và cách làm việc trong phát triển

Tác giả: IT Sectr Đã đăng: 2026-03-13 Thời gian đọc: 11 phút

Bộ nhớ ngoài trên thiết bị di động là phương tiện dữ liệu có thể tháo rời mà bất kỳ ứng dụng nào có quyền thích hợp đều có thể truy cập. Theo Android Open Source Project, 2026, bắt đầu từ Android 10, Google đã giới thiệu Scoped Storage — một mô hình hạn chế quyền truy cập trực tiếp vào hệ thống tệp và yêu cầu sử dụng MediaStore API để làm việc với các tệp phương tiện dùng chung. Cách tiếp cận này tăng cường bảo mật dữ liệu người dùng và ngăn chặn rò rỉ thông tin giữa các ứng dụng.

Những điểm chính

  • External Storage — bộ nhớ có thể tháo rời (thẻ SD, USB-OTG) có sẵn để đọc và ghi bởi các ứng dụng khác nhau
  • Scoped Storage trên Android 10+ hạn chế quyền truy cập trực tiếp vào hệ thống tệp và thay thế bằng MediaStore API
  • iOS không hỗ trợ thẻ SD — quyền truy cập vào tệp bên ngoài được thực hiện qua Document Picker
  • Quyền READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE là bắt buộc đối với Android 9 trở xuống
  • Định dạng thẻ SD làm bộ nhớ trong hoặc di động xác định mô hình truy cập và mã hóa

Bộ nhớ ngoài trên thiết bị di động là gì?

Bộ nhớ ngoài là một vùng bộ nhớ không thuộc hộp cát được bảo vệ của ứng dụng và có thể truy cập được bởi các chương trình khác. Trên Android, thuật ngữ này thường đề cập đến thẻ SD, nhưng bộ nhớ ngoài cũng bao gồm ổ USB được kết nối qua bộ chuyển đổi OTG và ổ đám mây được tích hợp ở cấp độ hệ thống tệp. Sự khác biệt chính so với bộ nhớ trong là thiếu sự cô lập: bất kỳ ứng dụng nào có quyền thích hợp đều có thể đọc và sửa đổi các tệp trong bộ nhớ ngoài.

Trên Android, bộ nhớ ngoài có hai chế độ chính: di động và có thể áp dụng (adoptable). Khi thẻ SD được định dạng làm bộ nhớ di động, nó vẫn có thể tháo rời và được định dạng ở FAT32 hoặc exFAT. Ở chế độ bộ nhớ có thể áp dụng, thẻ được định dạng ở ext4 và được mã hóa bằng AES-128, sau đó hệ thống coi nó như một phần mở rộng của bộ nhớ trong. Chế độ có thể áp dụng đã có sẵn từ Android 6.0 Marshmallow, nhưng các nhà sản xuất thiết bị thường tắt tính năng này trong chương trình cơ sở của họ. Theo thống kê của Google Play Console, chỉ khoảng 12% thiết bị Android hỗ trợ bộ nhớ có thể áp dụng, do đó không nên chỉ dựa vào việc mở rộng bộ nhớ trong qua thẻ SD như một lựa chọn duy nhất.

Trên iOS, không có thẻ SD truyền thống. Apple sử dụng kiến trúc khép kín, nơi tất cả bộ nhớ được xây dựng trên bộ nhớ flash trong và iCloud. Các ổ đĩa ngoài được hỗ trợ qua cổng Lightning hoặc USB-C, nhưng quyền truy cập vào chúng bị giới hạn ở trình quản lý tệp hệ thống Files và các ứng dụng tích hợp với Document Picker. Người dùng quyết định tệp nào sẽ mở từ nguồn bên ngoài — ứng dụng không thể quét ổ đĩa được kết nối mà không có sự đồng ý rõ ràng.

Các loại phương tiện bên ngoài và đặc điểm của chúng

Việc lựa chọn phương tiện bên ngoài phụ thuộc vào yêu cầu về tốc độ, dung lượng và tính di động. Các loại phương tiện khác nhau có các đặc điểm tốc độ, hệ thống tệp và trường hợp sử dụng khác nhau trong ứng dụng di động.

Loại phương tiệnDung lượng tối đaTốc độ đọcHệ thống tệp
SD UHS-I2 TBlên đến 104 MB/sexFAT / FAT32
SD UHS-II2 TBlên đến 312 MB/sexFAT / FAT32
USB 3.0 OTG2 TBlên đến 400 MB/sexFAT / NTFS / FAT32
USB-C SSD4 TBlên đến 1000 MB/sexFAT / APFS / NTFS

Thẻ SD và các lớp tốc độ

Thẻ SD được phân loại theo tốc độ ghi: Class 10 (10 MB/s), U1 (10 MB/s), U3 (30 MB/s), V30 (30 MB/s) và V90 (90 MB/s). Ghi video 4K yêu cầu thẻ ít nhất U3 hoặc V30. Đối với các ứng dụng di động làm việc với các tệp phương tiện lớn (xử lý ảnh, chỉnh sửa video), nên sử dụng thẻ từ lớp U3 trở lên. Tốc độ thẻ ảnh hưởng trực tiếp đến hiệu suất ứng dụng: ghi video 4K trên thẻ Class 10 có thể gây rớt khung hình do băng thông không đủ. Khi chọn thẻ SD cho ứng dụng, hãy chú ý không chỉ đến lớp tốc độ mà còn đến xếp hạng Lớp Hiệu suất Ứng dụng: A1 và A2 chỉ ra hiệu suất đọc và ghi ngẫu nhiên tối thiểu, rất quan trọng cho các hoạt động cơ sở dữ liệu và bộ nhớ đệm ứng dụng.

Ổ USB-OTG

USB-OTG (On-The-Go) cho phép kết nối các ổ USB bên ngoài với thiết bị di động qua bộ chuyển đổi. Android hỗ trợ OTG từ phiên bản 3.1, nhưng để gắn kết ổ đĩa cần có nhân hỗ trợ hệ thống tệp. FAT32 và exFAT được hỗ trợ mặc định, NTFS — chỉ trên các thiết bị có nhân tùy chỉnh hoặc qua thư viện Paragon. Trên iOS, hỗ trợ ổ USB xuất hiện trong iOS 13 với ứng dụng Files. Để làm việc với ổ đĩa, ứng dụng phải sử dụng UIDocumentPickerViewController, chỉ cung cấp quyền truy cập vào các tệp do người dùng chọn — iOS không cấp toàn quyền truy cập vào hệ thống tệp của ổ đĩa.

Bộ nhớ đám mây như một phần mở rộng

Các dịch vụ đám mây — iCloud, Google Drive, Dropbox — có thể tích hợp vào hệ thống tệp của thiết bị thông qua các nhà cung cấp hệ thống. Trên iOS, iCloud Drive là một phần của vùng chứa Sandbox của ứng dụng và các tệp được đồng bộ hóa tự động giữa các thiết bị của người dùng. Trên Android, Google Drive cung cấp API để đọc và ghi tệp, nhưng không có gắn kết trực tiếp vào hệ thống tệp. Đối với các ứng dụng di động làm việc với khối lượng dữ liệu lớn, bộ nhớ đám mây có thể là giải pháp thay thế cho thẻ SD, đặc biệt trên các thiết bị không có khe cắm mở rộng.

Cách làm việc với bộ nhớ ngoài trên Android

Làm việc với bộ nhớ ngoài trên Android phụ thuộc vào phiên bản hệ điều hành và mô hình Scoped Storage. Quy trình truy cập tệp khác nhau đối với Android 9 trở xuống, Android 10–12 và Android 13+.

Truy cập qua MediaStore API

Bắt đầu từ Android 10, cách chính để truy cập các tệp phương tiện dùng chung là MediaStore API. API này cung cấp giao diện thống nhất để đọc và ghi hình ảnh, video và tệp âm thanh trong bộ nhớ dùng chung. Ứng dụng không yêu cầu quyền READ_EXTERNAL_STORAGE để truy cập vào các tệp của riêng mình, nhưng đọc tệp từ các ứng dụng khác vẫn cần quyền rõ ràng từ người dùng. MediaStore tự động lập chỉ mục các tệp phương tiện và cung cấp ContentResolver để truy vấn chúng.

kotlin
val collection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
} else {
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI
}

val projection = arrayOf(
    MediaStore.Images.Media._ID,
    MediaStore.Images.Media.DISPLAY_NAME
)

val cursor = contentResolver.query(collection, projection, null, null, null)

Sau khi thực hiện truy vấn, bạn nhận được một Cursor chứa URI của các tệp. Để đọc tệp, hãy mở InputStream qua contentResolver.openInputStream(uri). Ghi được thực hiện tương tự qua contentResolver.openOutputStream(uri). MediaStore tự động xử lý xung đột tên và cung cấp khả năng chèn tệp mới qua contentResolver.insert(uri, values), trả về URI của tệp đã tạo.

Làm việc với tệp tùy ý qua SAF

Storage Access Framework (SAF) là cách được khuyến nghị để truy cập các tệp tùy ý trên Android 10+. SAF cung cấp hộp thoại chọn tệp hệ thống qua đó người dùng cấp cho ứng dụng quyền truy cập vào một tệp hoặc thư mục cụ thể. Ứng dụng nhận được URI truy cập có hiệu lực cho đến khi thiết bị khởi động lại hoặc cho đến khi quyền bị thu hồi một cách rõ ràng trong cài đặt. SAF không yêu cầu quyền READ_EXTERNAL_STORAGE hoặc WRITE_EXTERNAL_STORAGE, giúp đơn giản hóa việc xuất bản trên Google Play và giảm số lượng yêu cầu quyền.

kotlin
val requestCode = 42
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
intent.addFlags(
    Intent.FLAG_GRANT_READ_URI_PERMISSION
        or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)
startActivityForResult(intent, requestCode)

Cách làm việc với bộ nhớ ngoài trên iOS

Trên iOS, việc làm việc với tệp bên ngoài được xây dựng dựa trên UIDocumentPickerViewController, mà người dùng mở ra để chọn các tệp hoặc thư mục cụ thể. Ứng dụng không có quyền truy cập trực tiếp vào hệ thống tệp của ổ đĩa ngoài — chỉ vào các tệp mà người dùng đã chọn một cách rõ ràng. Sau khi chọn tệp, ứng dụng nhận được một URL tạm thời trong vùng chứa Sandbox và có thể làm việc với tệp qua FileManager.

Sử dụng UIDocumentPickerViewController

UIDocumentPickerViewController cho phép người dùng chọn một hoặc nhiều tệp từ bất kỳ nguồn nào có sẵn: iCloud Drive, ổ USB được kết nối hoặc dịch vụ đám mây của bên thứ ba. Sau khi chọn, bộ điều khiển trả về một mảng URL mà ứng dụng có thể đọc trong suốt phiên. Để giữ quyền truy cập sau khi ứng dụng đóng, bạn phải gọi startAccessingSecurityScopedResource() và lưu dấu trang có phạm vi bảo mật trong UserDefaults.

swift
let picker = UIDocumentPickerViewController(
    forOpeningContentTypes: [.data, .image],
    asCopy: true
)
picker.delegate = self

func documentPicker(
    controller: UIDocumentPickerViewController,
    didPickDocumentsAt urls: [URL]
) {
    guard let url = urls.first else { return }
    let data = try Data(contentsOf: url)
}

Tham số asCopy: true có nghĩa là iOS sẽ sao chép tệp vào vùng chứa Sandbox của ứng dụng và ứng dụng sẽ có bản sao riêng độc lập với tệp gốc. Nếu chỉ định asCopy: false, ứng dụng nhận được tham chiếu đến tệp gốc, nhưng để truy cập nó, phải gọi url.startAccessingSecurityScopedResource(). Nếu không gọi, việc đọc tệp sẽ gây ra ngoại lệ. Sau khi hoàn thành công việc với tệp, hãy luôn gọi url.stopAccessingSecurityScopedResource() để giải phóng tài nguyên và ngăn rò rỉ bộ mô tả.

Giới hạn và bảo mật của bộ nhớ ngoài

Bảo mật của bộ nhớ ngoài thấp hơn so với bộ nhớ trong vì các tệp có thể truy cập được bởi các ứng dụng khác. Bất kỳ ứng dụng nào có quyền READ_EXTERNAL_STORAGE đều có thể đọc tất cả các tệp trên thẻ SD, bao gồm cả những tệp mà ứng dụng của bạn đã tạo để lưu trữ tạm thời dữ liệu nhạy cảm. Một ứng dụng độc hại có thể quét thẻ SD và trích xuất dữ liệu người dùng nếu chúng không được mã hóa. Do đó, không nên lưu trữ mã thông báo xác thực, mật khẩu hoặc dữ liệu cá nhân của người dùng trong bộ nhớ ngoài dưới dạng văn bản thuần túy.

Trên Android 10+, Scoped Storage hạn chế đáng kể khả năng truy cập của ứng dụng vào hệ thống tệp dùng chung. Ứng dụng chỉ có thể đọc các tệp do chính nó tạo ra mà không cần quyền và việc truy cập vào tệp của các ứng dụng khác yêu cầu sự đồng ý rõ ràng của người dùng qua hộp thoại SAF. Tuy nhiên, hạn chế này không áp dụng cho các ứng dụng có phiên bản SDK mục tiêu dưới 29 — chúng tiếp tục hoạt động theo mô hình cũ, tạo ra rủi ro cho người dùng chưa cập nhật ứng dụng của họ. Google Play đã yêu cầu targetSdkVersion 29+ cho tất cả các ứng dụng mới và cập nhật từ năm 2021.

Định dạng và mã hóa là một khía cạnh bảo mật quan trọng khác. Thẻ SD được định dạng làm bộ nhớ di động không được hệ thống mã hóa theo mặc định. Ngay cả khi sử dụng bộ nhớ có thể áp dụng, mã hóa chỉ được kích hoạt nếu nhà sản xuất thiết bị đã bật tính năng này trong chương trình cơ sở. Để bảo vệ dữ liệu nhạy cảm được lưu trên bộ nhớ ngoài, hãy sử dụng thư viện EncryptedFile từ AndroidX Security, thư viện này mã hóa từng tệp riêng biệt bằng AES256-GCM, bất kể mã hóa hệ thống.

Khuyến nghị sử dụng bộ nhớ ngoài

Sử dụng hiệu quả bộ nhớ ngoài đòi hỏi sự cân bằng giữa tính khả dụng của dữ liệu và bảo mật. Thực hiện theo các quy tắc này để đảm bảo lưu trữ đáng tin cậy các tệp của người dùng.

  • Không lưu trữ dữ liệu nhạy cảm trong bộ nhớ ngoài mà không mã hóa. Sử dụng EncryptedFile hoặc EncryptedSharedPreferences để bảo vệ mã thông báo, mật khẩu và dữ liệu cá nhân
  • Kiểm tra khả dụng của bộ nhớ ngoài trước khi ghi: sử dụng Environment.getExternalStorageState() để kiểm tra trạng thái thẻ SD. Thẻ có thể bị tháo ra, bị hỏng hoặc không khả dụng để ghi
  • Sử dụng Scoped Storage trên Android 10+ và SAF để truy cập tệp dùng chung. Điều này giảm số lượng quyền được yêu cầu và cải thiện trải nghiệm người dùng
  • Luôn xử lý ngoại lệ khi làm việc với bộ nhớ ngoài. Tệp có thể bị xóa bởi ứng dụng khác hoặc bị di chuyển trong khi đọc, gây ra FileNotFoundException
  • Cảnh báo người dùng trước khi ghi lượng lớn dữ liệu vào bộ nhớ ngoài. Hiển thị hộp thoại xác nhận và cho phép chọn thư mục qua SAF

Điều quan trọng cần nhớ là bộ nhớ ngoài không đảm bảo tính toàn vẹn dữ liệu khi xảy ra lỗi. Thẻ SD có số chu kỳ ghi lại hạn chế, đặc biệt là các mẫu giá rẻ Class 4 và Class 6. Với việc ghi nhiều (ví dụ: ghi nhật ký hoặc lưu đệm dữ liệu phát trực tuyến), thẻ có thể hỏng trong vòng vài tháng. Đối với các kịch bản như vậy, hãy sử dụng bộ nhớ trong hoặc bộ nhớ đám mây và chỉ lưu các tệp trên bộ nhớ ngoài mà người dùng cho là chấp nhận được nếu mất. Thường xuyên kiểm tra trạng thái thẻ SD qua StatFs và thông báo cho người dùng về các lỗi hệ thống tệp nghiêm trọng.

Câu hỏi thường gặp

Có cần quyền truy cập bộ nhớ ngoài trên Android 13 không?

Trên Android 13+, quyền READ_EXTERNAL_STORAGE đã được thay thế bằng các quyền chi tiết hơn: READ_MEDIA_IMAGES, READ_MEDIA_VIDEOREAD_MEDIA_AUDIO. Đối với các loại tệp khác, hãy sử dụng SAF.

Có thể định dạng thẻ SD làm bộ nhớ trong không?

Có, tính năng adoptable storage có sẵn trên Android 6.0+. Thẻ được định dạng ở ext4 với mã hóa AES-128. Tuy nhiên, nhiều nhà sản xuất tắt tùy chọn này và khoảng 88% thiết bị không hỗ trợ bộ nhớ có thể áp dụng.

Làm thế nào để kiểm tra xem thẻ SD có được cài đặt trong thiết bị không?

Sử dụng phương thức Environment.getExternalStorageState(), trả về chuỗi trạng thái. Giá trị MEDIA_MOUNTED có nghĩa là thẻ có sẵn để đọc và ghi. Các giá trị khác chỉ ra lỗi hoặc không có thẻ.

Sự khác biệt giữa Scoped Storage và quyền truy cập đầy đủ hệ thống tệp là gì?

Scoped Storage giới hạn ứng dụng trong vùng chứa riêng của nó và các thư viện phương tiện MediaStore dùng chung. Quyền truy cập đầy đủ cho phép đọc bất kỳ tệp nào trên thiết bị. Scoped Storage tăng cường bảo mật dữ liệu người dùng và bắt buộc đối với các ứng dụng mới.

Làm thế nào để lấy URI truy cập tệp trên thẻ SD qua SAF?

Khởi chạy Intent với hành động ACTION_OPEN_DOCUMENT_TREE, hành động này sẽ mở hộp thoại chọn thư mục hệ thống. Sau khi chọn, bạn nhận được quyền URI có hiệu lực cho đến khi khởi động lại. Lưu URI này trong SharedPreferences để sử dụng sau.

Tóm tắt

  • External Storage — bộ nhớ có thể tháo rời (thẻ SD, USB-OTG) có thể truy cập cho tất cả ứng dụng với quyền thích hợp
  • Scoped Storage trên Android 10+ hạn chế quyền truy cập trực tiếp vào hệ thống tệp và giới thiệu MediaStore API cho các tệp phương tiện
  • iOS không hỗ trợ thẻ SD — quyền truy cập tệp bên ngoài chỉ khả dụng qua UIDocumentPickerViewController
  • Thẻ SD được chia thành các lớp tốc độ: Class 10, U1, U3, V30, V90 — yêu cầu tối thiểu U3 để ghi video 4K
  • Bảo mật của bộ nhớ ngoài thấp hơn bộ nhớ trong — hãy mã hóa dữ liệu nhạy cảm trước khi ghi
  • Bộ nhớ có thể áp dụng cho phép sử dụng thẻ SD như phần mở rộng của bộ nhớ trong, nhưng chỉ được hỗ trợ trên 12% thiết bị
  • Khuyến nghị sử dụng SAF để truy cập các tệp tùy ý và không lưu trữ dữ liệu quan trọng mà không mã hóa

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm