2011-04-23 24 views
13

Tôi có một ứng dụng lưu tệp được tải xuống từ máy chủ. Các tệp này không phải là riêng tư đối với ứng dụng của tôi và cũng có thể truy cập được vào các ứng dụng khác. Tôi muốn biết những gì sẽ là con đường chính xác để lưu các tập tin này khi thẻ SD là ABSENT. Đối với thẻ SD, có API nổi tiếng -Lưu tệp công khai vào bộ nhớ trong

getExternalStorageDirectory() 

cho dữ liệu cá nhân của ứng dụng trong bộ nhớ trong có -

Context.getFilesDir() 

Trên một số thiết bị, bộ nhớ trong được thể hiện bằng/eMMC /.

Sẽ rất hữu ích nếu ai đó có thể xây dựng trên/emmc /. Tôi biết nó là viết tắt của thẻ nhớ nhúng và không có mặt trong tất cả các thiết bị. Nhưng nó thực sự đại diện cho bộ nhớ trong? Hay đó là bộ nhớ thứ ba?

Tôi có nên lưu các tệp bằng cách sử dụng openFileOutput() với MODE_WORLD_READABLE không?

Trả lời

9

Trên một số thiết bị, bộ nhớ trong được đại diện bởi/emmc /.

/emmc/ thể tồn tại trên một số thiết bị, và nó có thể là nội bộ, nhưng nó có thể không thể truy cập vào các ứng dụng, và nó chắc chắn không phải là một phần của Android SDK trừ khi điều đó xảy ra là gì getExternalStorageDirectory() lợi nhuận.

Nhưng nó thực sự đại diện cho bộ nhớ trong?

số

Hoặc là nó bộ nhớ thứ ba?

Hãy hỏi nhà sản xuất thiết bị của bạn.

Tôi có nên lưu tệp bằng openFileOutput() với MODE_WORLD_READABLE không?

Điều đó là không thể trả lời trong tóm tắt. Bạn nói rằng các tệp của bạn "cũng có thể truy cập được vào các ứng dụng khác", nhưng bạn chưa chỉ ra lý do tại sao bạn mong đợi bất kỳ ứng dụng nào khác quan tâm một chút về tệp của bạn. Các ứng dụng khác sẽ không quét các thư mục của bạn cho các tệp - tốt nhất, chúng sẽ cho phép người dùng duyệt lưu trữ bên ngoài. Lý do duy nhất để có tệp là MODE_WORLD_READABLE là nếu ứng dụng của bạn sẽ kích hoạt một ứng dụng khác để thực hiện điều gì đó với tệp (ví dụ: ACTION_VIEWIntent).

+0

Cảm ơn CommonsWare! Có, ứng dụng của tôi kích hoạt các ứng dụng khác với ACTION_VIEW chính xác là lý do tôi gọi những tệp này là công khai. Ngoài ra, khi một số người khám phá tệp và ứng dụng quét thẻ SD cũng như bộ nhớ trong, tôi muốn họ có thể tìm thấy các tệp này. Vì vậy, câu hỏi của tôi vẫn còn, nơi để lưu các tập tin trong trường hợp thẻ SD không được tìm thấy? – Akshay

+0

@Akshay: "Ngoài ra, khi một số trình khám phá tệp và ứng dụng quét thẻ SD cũng như bộ nhớ trong, tôi muốn chúng có thể tìm thấy những tệp này". - đó là không thể, hoặc nếu có, đó là một lỗ hổng bảo mật lớn. "Vì vậy, câu hỏi của tôi vẫn còn, nơi để lưu các tập tin trong trường hợp thẻ SD không được tìm thấy?" - 'getFilesDir()'. – CommonsWare

+0

Cảm ơn bạn CommonsWare! Tôi đang cố hiểu rõ điều này. Ứng dụng của tôi có thể được so sánh với ứng dụng email tải xuống tệp đính kèm và cho phép người xem tài liệu và trình phát phương tiện mở các tệp này. Ứng dụng email sẽ lưu tệp nếu thẻ SD vắng mặt ở đâu? Không có thư mục công cộng nào trong bộ nhớ trong? Nội dung như/internal_memory/downloads? Tại sao bạn nên xem xét việc quét bộ nhớ trong như một lỗ hổng bảo mật? Chỉ cần xác nhận, bộ nhớ trong ngụ ý bộ nhớ điện thoại/thiết bị, phải không? Xin lỗi vì loạt câu hỏi. – Akshay

14

Tôi nhận thấy điều này là cũ và có câu trả lời được chấp nhận, nhưng tôi nghĩ câu hỏi vẫn còn phù hợp và có cách để đạt được những gì người hỏi muốn. Để cho diễn giải, tôi tin người hỏi muốn lưu một tệp và làm cho ứng dụng khác có thể truy cập (ví dụ để xem), mà không phải suy nghĩ về lưu trữ bên ngoài (ví dụ: giấy phép bổ sung và khả năng lưu trữ bên ngoài là không có mặt).

Nó chỉ ra rằng bạn có thể làm cho các tệp của riêng bạn có thể đọc được bởi các ứng dụng khác.

File file = new File(ctx.getCacheDir(), "picture");    
... 
file.setReadable(true, false); 
    // makes file readable to other apps 

// Get another app to view my picture 
Uri uri = Uri.fromFile(file);   
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "image/*"); 
ctx.startActivity(intent); 

Thiết lậpĐảm bảo mã ở trên hoạt động cho tôi - mà không có ứng dụng trình xem không đọc được tệp. Lưu ý rằng setReadable hoạt động trên toàn bộ thư mục, vì vậy giải pháp tốt nhất có thể là tạo một tên thư mục con 'công khai' và đặt các tệp của bạn vào đó.

+3

Một phao cứu sinh của bạn! Câu trả lời được chấp nhận tập trung quá nhiều vào lý do tại sao bạn không nên làm điều này và không phải là cách thực tế. –