2012-12-13 23 views
13

From here Tôi biết cách viết tệp và có thể truy cập được vào ứng dụng khác và mục đích khác, nhưng giờ đây Context.MODE_WORLD_READABLE không được chấp nhận làm cách nào tôi có thể thực hiện việc này một cách an toàn?Android: Thay thế cho Ngữ cảnh không được chấp nhận.MODE_WORLD_READABLE?

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE); 

Okay biết thêm:

Tôi đang sử dụng này:

intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(uri, "video/*"); 

Và uri sẽ là người mà tôi sẽ viết thư cho một vị trí sdcard. Và video sẽ xuất phát từ ứng dụng nên vấn đề là, nếu điều này bây giờ không được phép, làm thế nào tôi có thể viết tệp và xem nó.

Trả lời

11

Và uri sẽ là thứ tôi sẽ ghi vào vị trí sdcard.

Điều đó đã là MODE_WORLD_WRITABLE theo mặc định. Cũng lưu ý rằng mã bạn đã liệt kê (openFileOutput()) không không phải ghi vào bộ nhớ ngoài (những gì bạn gọi không chính xác là "sdcard"). openFileOutput() dành cho bộ nhớ trong.

Và video sẽ xuất phát từ ứng dụng nên vấn đề là, nếu điều này hiện không được phép, làm cách nào tôi có thể ghi tệp và xem tệp.

Nếu bạn đang thực sự ghi tệp vào bộ nhớ ngoài, chỉ cần sử dụng Uri trỏ đến tệp đó.

Nếu bạn đang ghi tệp vào bộ nhớ trong, hãy tạo ContentProvider để phân phối tệp đó và sử dụng Uri trỏ đến số ContentProvider đó. Here is a sample application với số ContentProvider trích xuất tệp PDF từ assets/ khi chạy đầu tiên, sau đó phân phát tệp đó qua openFile() để người xem PDF có thể xem tệp đó.

+0

Cảm ơn. Điều đó xảy ra tại chỗ. : D – Marl

+1

Nếu tệp video đã được lưu dưới dạng tệp để lưu trữ nội bộ (sử dụng vị trí được đưa ra bởi 'getCacheDir'), bạn có nói rằng ContentProvider bằng cách nào đó có thể phục vụ URI cho VideoView có thể phát được không? Bởi vì URI trực tiếp đối với video được lưu bên trong không hoạt động (tôi đoán vì tệp video cần phải có thể đọc được trên thế giới để được xem bởi một lượt xem video nhưng không thể đọc được trên thế giới nếu trong bộ nhớ cache riêng của ứng dụng). –

+0

@DanielSmith: "Bạn có nói rằng ContentProvider bằng cách nào đó có thể phục vụ URI cho VideoView mà có thể phát được không?" - video rất khó, vì thường người chơi cần một luồng có thể tìm kiếm (có thể chuyển tiếp và lùi) và một luồng được xuất bản bởi một 'ContentProvider' không thể tìm kiếm được. Tôi không biết bất kỳ định dạng video nào có thể được phát bằng luồng chỉ chuyển tiếp, mặc dù tôi chưa nghiên cứu điểm đó. – CommonsWare

3

Dường như các tài liệu rõ ràng về nó.

liên tục này đã bị phản đối ở mức API 17.

Tạo file trên thế giới có thể đọc được là rất nguy hiểm, và có khả năng gây lỗ hổng bảo mật trong các ứng dụng. Nó được khuyến khích mạnh mẽ; thay vào đó, ứng dụng nên sử dụng cơ chế chính thức hơn cho các tương tác như Trình cung cấp nội dung, BroadcastReceiver và Dịch vụ. Không có đảm bảo rằng chế độ truy cập này sẽ vẫn còn trên một tệp, chẳng hạn như khi nó đi qua một bản sao lưu và khôi phục. Chế độ tạo tệp: cho phép tất cả các ứng dụng khác có quyền truy cập đọc vào tệp được tạo.

+0

thêm chi tiết khác cho câu hỏi của tôi .. – Marl

7

Lưu video của bạn trong bộ nhớ nội bộ của bạn sử dụng:

openFileOutput("test.mp4", "MODE_PRIVATE"); 

Sau đó làm điều này:

String path = context.getFilesDir().getAbsolutePath() + "/test.mp4"; // path to the root of internal memory. 
File f = new File(path); 
f.setReadable(true, false); 
Intent playIntent .... 
playIntent.setType("video/*"); 
playIntent.setData(Uri.fromFile(f)); 

Good Luck.

+0

Cảm ơn bạn điều này đã giúp tôi, không muốn sử dụng sdcard cho một tập tin tạm thời, lưu ý đây là Api 9 hoặc cao hơn, do đó, kết thúc bằng cách sử dụng mode_world_readable cho Api 8, và điều này cho 9 và cao hơn. –

+0

Tất nhiên, lựa chọn tốt nhất là ContentProvider, trong một số trường hợp, điều này sẽ không hoạt động. ví dụ: người chơi không thể truy cập các tệp srt được lưu ở cùng một vị trí của tệp video và sử dụng cùng tên ngay cả khi chúng tôi đặtReadable cho tệp srt. – hasan83

+0

@ hasan83 nếu tôi viết tệp bằng FileOutputStream vào dữ liệu/dữ liệu/com. ****. ***/myfolder, nó không cho phép tôi đọc tệp như trên bất kỳ lý do gì? – NitZRobotKoder

Các vấn đề liên quan