2012-09-25 36 views
16

làm cách nào để mở tệp đã được lưu trữ trước đó trong hệ thống tệp "privat"? Tệp đang được tải xuống bởi một dịch vụ web và phải được lưu trữ trên fs cục bộ. Tôi gặp lỗi "lạ" khi cố gắng mở tệp qua Intent (Action_View). Mặc dù tệp có trong hệ thống tệp (đã xem tệp trong trình thám hiểm tệp trong trình giả lập/nhật thực) nhưng nó sẽ không được hiển thị trong hoạt động gọi galery được khởi chạy. Thay vì hình ảnh các galery cho thấy một màn hình màu đen không có nội dung trong đó (ngoại trừ thanh hành động). Điều tương tự cũng xảy ra khi cố gắng mở một tập tin pdf/movie/mp3 thông qua phương pháp này (pdf nói ví dụ rằng tập tin bị hỏng).Cách mở tệp trong Android qua Intent

BTW: Các dữ liệu đã được lưu trữ trên fs địa phương là hợp lệ (không tham nhũng), tôi đã tải về các tập tin từ trình gỡ lỗi (thông qua phương pháp kéo) và các tập tin có thể được mở trên máy trạm của tôi ...

public void onAttachment(Context context, Attachment attachment) { 
    try { 
     //Attachment is a structured data object that contains of a byte[], filename and mimetype (like image/jpeg) 
     FileOutputStream fos = FileOutputStream fos = context.openFileOutput(attachment.getAttachmentFileName(), Context.MODE_PRIVATE); 
     fos.write(attachment.getBinary()); 
     fos.flush(); 
     fos.close(); 
     File f = context.getFileStreamPath(attachment.getAttachmentFileName()); 
     Uri uri = Uri.fromFile(f);   
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(uri,attachment.getAttachmentMimetype()); 
     context.startActivity(intent);     
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
}   
+0

có thể nó http://stackoverflow.com/questions/11068648/launching-an-intent-for-file -and-mime-type/11088980 # 11088980 có thể giúp bạn. – ademar111190

Trả lời

2

Khi đặt vị trí thành "openFileOutput("fileName", Activity.MODE_WORLD_READABLE)", nó sẽ hoạt động. Các ứng dụng khác không thể đọc được dữ liệu (ngay cả đối với viewing) được lưu trữ khi thiết để "Context.MODE_PRIVATE"

thấy other post on stackoverflow

12

Loại tệp đính kèm trong mã của bạn là gì? Có lẽ nó trả về loại mime sai?

Mã này làm việc cho tôi:

File file = new File("EXAMPLE.JPG"); 

// Just example, you should parse file name for extension 
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(".JPG"); 

Intent intent = new Intent(); 
intent.setAction(android.content.Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(file), mime); 
startActivityForResult(intent, 10); 
+0

Không, thao tác này sẽ không hoạt động ... Vấn đề là hoạt động này đã được khởi chạy thành công (bộ giải mã, phim/âm thanh, trình đọc pdf) nhưng nội dung (tệp) có vẻ không hợp lệ ... –

+0

Tệp đính kèm trả về đúng mimetype, nếu không hoạt động chính xác (Galery/Mediaplayer/PDF-Reader) sẽ không được bắt đầu. –

+0

Sai. Tham số getMimeTypeFromExtension PHẢI là phần mở rộng của tệp mà không có phần tử '.'. – armandooj

2

Bạn không thể mở file mà không phải là trên sdcard như thế. Bạn sẽ cần sao chép tệp vào sdcard và sau đó mở tệp.

+0

Bạn có thể cho tôi một liên kết nơi điều này được xác nhận bởi google (trong tài liệu sdk) không. Tôi không tìm thấy bất cứ điều gì về điều đó trong tài liệu chính thức ... BTW: Khi tôi mở tập tin trong một hoạt động riêng có thể xử lý hình ảnh hoạt động ... –

+0

Thật không may tôi đang nói ra kinh nghiệm vì vậy tôi không có một liên kết. NHƯNG của nó cùng một vấn đề như trong tải lên hoặc gửi email một tập tin mà không có trong SDCARD ... Nó giống với việc mở các trang webview & vv .. Hy vọng nó sẽ giúp ... Xin lỗi nếu không .. – Givi

+0

Vì vậy, tôi phải viết riêng Viewer - "Hoạt động" có thể xử lý các tệp được lưu trữ trên thư mục riêng tư này? –

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