Bài 3: Đọc ghi dữ liệu với bộ nhớ ngoài External Storage trong Android

Ở bài trước chúng ta đã học qua cách đọc và lưu dữ liệu vào bộ nhớ trong Internal Storage rồi đúng không nào? Hôm nay chúng ta sẽ đi qua cách thứ 3 cũng tương tự đó là thao tác với bộ nhớ ngoài hay còn gọi là External Storage đó các bạn.

Thì đối với việc thao tác với bộ nhớ ngoài bạn sẽ có một số lưu ý nhất định hơn so với bộ nhớ trong đó là bạn phải kiểm tra thiết bị có thẻ nhớ hay không?, bộ nhớ có thể chứ thêm được dữ liệu nữa không? và một điều cực kì quan trọng mà chúng ta đã từng học qua ở bài permission trong android đó là bạn phải xin cấp phép quyền đọc và ghi dữ liệu vào bộ nhớ trong.

Các bạn đừng nghĩ bộ nhớ ngoài là bộ nhớ của thẻ nhớ SDCard thôi nhé, bạn sẽ thấy khá lạ với những gì mình giải thích ở dưới đây đó.

External Storage trong Android là gì?

Rất nhiều và hầu như tất cả mọi người sử dụng điện thoại đều nghĩ bộ nhớ ngoài chính là thẻ nhớ SDCard, nhưng khi bạn là một lập trình viên thì bạn sẽ phải suy nghĩ khác đó, chứ suy nghĩ theo cách trên là sai hoàn toàn rồi.

Theo định nghĩ chính thức tại trang chủ của google thì là như sau:

Every Android-compatible device supports a shared “external storage” that you can use to save files. This can be a removable storage media (such as an SD card) or an internal (non-removable) storage. Files saved to the external storage are world-readable and can be modified by the user when they enable USB mass storage to transfer files on a computer.

Điều này có nghĩa External Storage trong android là phần bộ nhớ mà có thể dùng để chia sẽ dữ liệu . nó có thể là bộ nhớ di động (SDCard), có thể là bộ nhớ trong.Những dữ liệu lưu trong bộ nhớ trong có thể được và chỉnh sửa được bưởi người dùng thông quá kết nối USB với máy tính.

Vậy ở đây bạn sẽ giải quyết một vấn đề quan trọng đó là bộ nhớ ngoài trong lập trình android có thể là Internal Storage nữa nhé, không phải chỉ là thẻ nhớ không thôi đâu.

External Storage được sử dụng khi nào?

Với bộ nhớ trong thì chỉ cho phép lưu trữ dữ liệu mà chỉ ứng dụng đó mới có quyền truy cập vào được thôi còn External lại khác hoàn toàn, nó sinh ra để giúp cho việc lưu dữ liệu để chia sẽ ra bên ngoài, trao đổi giữa các ứng dụng với nhau.

Thường thằng này được dùng để lưu dữ liệu khi ứng dụng thao tác hay tải từ internet về, ở đây mình ví dụ ứng dụng ZingMp3 cho các bạn dễ hiểu nhé:

Khi các bạn cài ứng dụng ZingMp3 vào trên thiết bị android của mình và sau đó tiến hành tải một bài hát về thì bạn biết bài hát đó được lưu ở đâu không? Thẻ nhớ hay là bộ nhớ trong?

Cái này phụ thuộc vào bạn cài app trên thẻ nhớ hay bộ nhớ trong thôi, mà lưu ý là bộ nhớ trong ở đây cũng được gọi là External Storage đó nhé.

Đây là 1 ví dụ cho kiểu lưu trữ này đó.

Tại sao sử dụng External Storage để lưu trữ?

Rất đơn giản là vì những dữ liệu lớn thì kiểu dữ liệu Internal Storage không thể đáp ứng dụng thì ở đây nó đã giải quyết được vấn đề này.Ngoài ra ưu điểm của loại lưu trữ này là có thể chia sẽ dữ liệu với nhau giữa các ứng dụng hoặc là có thể sao chép, lưu trữ ra ngoài được.

Một cảnh cáo nguy hiểm cho loại lưu trữ này đó là dữ liệu có thể bị xoá mất bởi người dùng hay ứng dụng khác, hoặc là trường hợp thẻ nhớ bị tháo rời…

Đọc và ghi dữ liệu với External Storage

Ghi dữ liệu

Xin cấp quyền trên AndroidManifest.xml

Dù ghi dữ liệu hay đọc dữ liệu thì bạn cũng phải xin cấp quyền đọc hay ghi trên bộ nhớ trong hết chính vì vậy mà đầu tiên chúng ta sẽ đi xin cung cấp quyền trước bằng cách khai báo vào trong file AndroidManifest.xml như sau:


Có 1 điều mà không phải ai cũng để ý đó là nếu như bạn xin cấp quyền android.permission.WRITE_EXTERNAL_STORAGE thì bạn sẽ không cần phải xin thêm quyền android.permission.READ_EXTERNAL_STORAGE nữa bởi vì quyền ghi file là bao gồm quyền đọc file và ghi file rồi.Chính vì vậy ở trên bạn có thể chỉ cần khai báo một quyền duy nhất thôi đó là:


Một lưu ý nữa là từ android 4.4 trở lên nếu bạn đọc và ghi dữ liệu ở thu mục riêng tư của app, thư mục riêng tư là thư mục mà thiết bị sẽ tự tạo cho ứng dụng đó trên bộ nhớ External Storage chứ không phải là Internal Storage đâu nhé, để xem thư mục này ở đâu bạn có thể dùng goi hàm getExternalFilesDir(null).getAbsolutePath() để xem nhé, mình note lại đây thôi tạm thời bạn bỏ qua mục này cũng được.

Cấp quyền khi runtime từ android 6.0

Vì quyền đọc ghi file là thuộc về quyền nguy hiểm chỉnh vì vậy bạn phải xin quyền khi ứng dụng khởi chay lần đầu tiên nữa trên các thiết bị điện thoại android 6.0 trở lên.Cái này bạn đọc chi tiết tại bài viết xin cấp quyền trong android ở blog mình nhé.

Để đảm bảo ứng dụng khi bị Crash khi các bạn chạy trên Android 6.0 thì bạn sẽ thêm đoạn code sau đây vào hàm OnCreate() hay bất kì nơi nào trước khi các bạn tiến hành quá trình đọc ghi file.

Kiểm tra thiết bị có bộ nhớ ngoài và có thể ghi file được không?

Bạn chỉ cần dùng đoạn code như sau dưới đây để check là xong:


Nếu trả về true thì bạn có thể tiến hành đọc và ghi file trên thiết bị này và sẽ không gặp bất kì lỗi gì, nếu không kiểm tra cái này nguy cơ xảy ra lỗi cho app là có thể xảy ra đó các bạn.Bởi vì bộ nhớ ngoài bạn có thể xảy ra các trường hợp như đầy, bị xoá, hoặc đang chia sẽ với thiết bị ngoại vi khác ứng dụng không thể truy xuất lúc này được.

Sau khi đã xin quyền và check true ở bước trên rồi thì bây giờ chúng ta sẽ đi ghi dữ liệu vào bộ nhớ trong với đoạn code như sau:


Ở đây sẽ có người thắc mắc là cái file tên thangcoder.com sẽ được lưu ở đâu? nếu như đoạn code trên khi chạy trên máy ảo sẽ được lưu vào thư mục:


Nhưng khi mình chạy trên máy thật thì nó lưu vào thư mục:


Thật sự mà nói để biết nó lưu cố định vào đâu thì chẳng biết được tại vì theo mình thấy tuy vào thiết bị các đường dẫn này lại tương đối lại khác nhau.Để biết chi tiết nó lưu ở đây bạn sẽ xem log của đoạn code này:


Cái này mình sẽ mô tả và nhận xét chi tiết hơn trong video nhé các bạn, còn dưới đây là file mình đã lưu lại trên thiết bị thật khi chạy đoạn code trên.

Lưu file xuống bộ nhớ ngoài với External storage

Lưu file xuống bộ nhớ ngoài với External storage

Như mình đã nói bộ nhớ máy hay thẻ nhớ SDCard thì đều là External Storage cả, vấn đề là nếu bạn cài app trên thẻ nhớ thì mặc định file trên sẽ ở mục thẻ nhớ còn nếu app đang cài trên bô nhớ máy thì sẽ giống như hình ở trên.

Ghi dữ liệu

Nếu bạn chưa xin cấp quyền ở trên thì ở đây bạn sẽ phải xin quyền đọc file nhé, tuy nhiên ở trên mình đã xin hết rồi nên thôi không cần nữa.Dưới đây là đoạn code để bạn có thể đọc file đã lưu lại ở trên nhé:


Chi tiết đoạn code trên mình đã giới thiệu ở bài trước rồi nhé, ở đây thì cũng chẳng có gì khó hiểu cả đúng không nhỉ?

Nếu bạn chưa hiểu thì xem video bên dưới đây nhé, mình sẽ nói chi tiết hơn và đừng quên mọi ý kiến thắc mắc các bạn cứ comment bên dưới blog nha.

Video hướng dẫn External Storage trong Android

Download Source Code

Tiếp theo

Chúc các bạn học tập vui vẽ!

Bài 3: Đọc ghi dữ liệu với bộ nhớ ngoài External Storage trong Android
4.5 (90%) 2 votes

Add Comment

*