Android sử dụng một hệ thống tệp tương tự như hệ thống tệp dựa trên ổ đĩa trong các nền tảng khác. Hệ thống này cung cấp một số lựa chọn để bạn lưu dữ liệu ứng dụng của mình:
- Bộ nhớ dành riêng cho ứng dụng: Lưu trữ các tệp chỉ dành cho ứng dụng của bạn, trong các thư mục chuyên dụng thuộc ổ bộ nhớ trong hoặc các thư mục chuyên dụng khác trong bộ nhớ ngoài. Hãy dùng các thư mục thuộc bộ nhớ trong để lưu thông tin nhạy cảm mà những ứng dụng khác không được truy cập.
- Bộ nhớ dùng chung: Lưu trữ các tệp mà ứng dụng của bạn định chia sẻ với ứng dụng khác, bao gồm cả nội dung đa phương tiện, tài liệu và các tệp khác.
- Lựa chọn ưu tiên: Lưu trữ dữ liệu gốc và riêng tư trong các cặp khóa-giá trị.
- Cơ sở dữ liệu: Lưu trữ dữ liệu có cấu trúc trong một cơ sở dữ liệu riêng tư bằng cách sử dụng thư viện lưu trữ Room.
Đặc điểm của các tuỳ chọn này được tóm tắt trong bảng sau:
Loại nội dungPhương thức truy cậpCần cấp quyềnCác ứng dụng khác có thể truy cập không?Các tệp bị xoá khi gỡ cài đặt ứng dụng?Tệp dành riêng cho ứng dụngTệp chỉ dành cho ứng dụng của bạnTừ bộ nhớ trong,getFilesDir[]
hoặc getCacheDir[]
Từ bộ nhớ ngoài,
getExternalFilesDir[]
hoặc getExternalCacheDir[]
Không cần thiết cho bộ nhớ trongKhông cần thiết cho bộ nhớ ngoài khi ứng dụng được dùng trên những thiết bị chạy Android 4.4 [API cấp 19] trở lênKhôngCóNội dung đa phương tiệnCác tệp đa phương tiện có thể chia sẻ [hình ảnh, tệp âm thanh, video]API
MediaStore
READ_EXTERNAL_STORAGE
khi truy cập vào tệp của ứng dụng khác trên Android 11 [API cấp 30] trở lênREAD_EXTERNAL_STORAGE
hoặc WRITE_EXTERNAL_STORAGE
khi truy cập vào tệp của ứng dụng khác trên Android 10 [API cấp 29]Cần có quyền đối với tất cả các tệp trên Android 9 [API cấp 28] trở xuốngCó, mặc dù ứng dụng khác cần quyền
READ_EXTERNAL_STORAGE
KhôngTài liệu và các tệp khácCác loại nội dung khác có thể chia sẻ, bao gồm cả tệp đã tải xuốngKhung truy cập bộ nhớKhông cóCó, thông qua bộ chọn tệp hệ thốngKhôngLựa chọn ưu tiên về ứng dụngCặp khóa-giá trịThư viện Lựa chọn ưu tiên về JetpackKhông cóKhôngCóCơ sở dữ liệuDữ liệu có cấu trúcThư viện lưu trữ RoomKhông cóKhôngCóGiải pháp bạn chọn phụ thuộc vào nhu cầu cụ thể của bạn:
Danh mục vị trí bộ nhớ
Android cung cấp 2 loại vị trí bộ nhớ thực: bộ nhớ trong và bộ nhớ ngoài. Trên hầu hết các thiết bị, bộ nhớ trong nhỏ hơn bộ nhớ ngoài. Tuy nhiên, bộ nhớ trong luôn có sẵn trên mọi thiết bị, do đó, đây là nơi đáng tin cậy hơn để lưu dữ liệu mà ứng dụng của bạn dựa vào.
Các ổ đĩa di động, chẳng hạn như thẻ SD, sẽ xuất hiện trong hệ thống tệp như một phần của bộ nhớ ngoài. Android biểu thị các thiết bị này bằng một đường dẫn, chẳng hạn như getFilesDir[]
0.
Các ứng dụng được lưu trữ vào bộ nhớ trong theo mặc định. Tuy nhiên, nếu kích thước APK rất lớn, bạn có thể cho biết lựa chọn ưu tiên trong tệp kê khai của ứng dụng là cài đặt ứng dụng trên bộ nhớ ngoài:
...
Quyền và quyền truy cập vào bộ nhớ ngoài
Android xác định các quyền liên quan đến bộ nhớ sau đây: READ_EXTERNAL_STORAGE
, WRITE_EXTERNAL_STORAGE
và getFilesDir[]
3.
Trong những phiên bản Android trước đây, các ứng dụng cần khai báo quyền READ_EXTERNAL_STORAGE
để truy cập vào mọi tệp bên ngoài thư mục dành riêng cho ứng dụng trong bộ nhớ ngoài. Ngoài ra, các ứng dụng cũng cần phải khai báo quyền WRITE_EXTERNAL_STORAGE
để ghi vào mọi tệp bên ngoài thư mục dành riêng cho ứng dụng.
Các phiên bản Android mới dựa vào mục đích của một tệp hơn là vị trí của tệp để xác định khả năng ứng dụng truy cập và ghi vào một tệp nhất định. Cụ thể là nếu ứng dụng của bạn nhắm đến Android 11 [API cấp 30] trở lên, thì quyền WRITE_EXTERNAL_STORAGE
sẽ không ảnh hưởng đến quyền truy cập của ứng dụng vào bộ nhớ. Mô hình lưu trữ dựa trên mục đích này giúp cải thiện quyền riêng tư của người dùng vì các ứng dụng chỉ được cấp quyền truy cập vào những phần thực sự cần thiết trong hệ thống tệp của thiết bị.
Android 11 giới thiệu quyền getFilesDir[]
3, cho phép quyền ghi vào các tệp bên ngoài thư mục dành riêng cho ứng dụng và MediaStore
. Để tìm hiểu thêm về quyền này và lý do hầu hết ứng dụng không cần phải khai báo quyền này để thực hiện đầy đủ các trường hợp sử dụng, hãy xem hướng dẫn về cách quản lý mọi tệp trên thiết bị lưu trữ.
Bộ nhớ có giới hạn
Để mang lại cho người dùng nhiều quyền kiểm soát hơn đối với tệp của họ và giảm thiểu tình trạng tệp lộn xộn, các ứng dụng nhắm đến Android 10 [API cấp 29] trở lên được cấp quyền truy cập có giới hạn vào bộ nhớ ngoài, hoặc bộ nhớ có giới hạn, theo mặc định. Những ứng dụng như vậy chỉ có quyền truy cập vào thư mục dành riêng cho ứng dụng trong bộ nhớ ngoài, cũng như các loại nội dung đa phương tiện cụ thể mà ứng dụng đó đã tạo.
Lưu ý: Nếu ứng dụng của bạn yêu cầu quyền liên quan đến bộ nhớ trong thời gian chạy, thì hộp thoại mà người dùng nhìn thấy sẽ cho biết rằng ứng dụng của bạn đang yêu cầu quyền truy cập rộng vào bộ nhớ ngoài, ngay cả khi bộ nhớ có giới hạn được bật.Hãy dùng bộ nhớ có giới hạn, trừ khi ứng dụng của bạn cần quyền truy cập vào một tệp được lưu trữ bên ngoài thư mục dành riêng cho ứng dụng và bên ngoài thư mục mà MediaStore
API có thể truy cập. Nếu lưu trữ các tệp dành riêng cho ứng dụng trong bộ nhớ ngoài, bạn có thể làm cho việc sử dụng bộ nhớ có giới hạn hơn trở nên dễ dàng hơn bằng cách đặt các tệp này vào một thư mục dành riêng cho ứng dụng trong bộ nhớ bên ngoài. Bằng cách đó, ứng dụng của bạn vẫn duy trì quyền truy cập vào các tệp này khi bộ nhớ có giới hạn được bật.
Để chuẩn bị ứng dụng của bạn cho bộ nhớ có giới hạn, hãy xem hướng dẫn về các trường hợp sử dụng bộ nhớ và phương pháp hay nhất. Nếu ứng dụng của bạn có trường hợp sử dụng khác không thuộc phạm vi của bộ nhớ có giới hạn, hãy gửi một yêu cầu về tính năng. Bạn có thể tạm thời chọn không sử dụng bộ nhớ có giới hạn.
Xem tệp trên thiết bị
Để xem các tệp được lưu trữ trên một thiết bị, hãy dùng Trình khám phá tệp trên thiết bị của Android Studio.