2012-06-17 15 views
20

Tôi đã xem xét tất cả các câu hỏi tương tự ở đây, nhưng tôi không thể cho cuộc sống của tôi tìm ra những gì tôi đang làm sai.Khởi chạy ý định cho tệp và loại MIME?

Tôi đã viết một ứng dụng cố gắng khởi chạy các tệp khác nhau, sắp xếp một trình duyệt tệp. Khi một tệp được nhấp, nó sẽ cố gắng khởi chạy chương trình dựa trên loại MIME được liên kết của nó hoặc nó trình bày hộp thoại "Chọn ứng dụng để khởi chạy".

Dưới đây là đoạn code tôi đang sử dụng để khởi động:

File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position)); 

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); 

    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); 
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    myIntent.setDataAndType(Uri.fromFile(file),mimetype); 
    startActivity(myIntent); 

này thất bại và tạo ra các lỗi:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes } 

Bây giờ nếu tôi cài đặt File Manager OI ví dụ, nó sẽ mở ra thay vì điều này lỗi được ném và sau đó nếu tôi nhấp vào cùng một tệp từ bên trong nó, nó sẽ khởi chạy hộp thoại approriate.

Tôi đã nhận thấy rằng loại MIME cho tệp cụ thể đó không thành công, nhưng các loại mime khác như .zip làm giá trị trả lại.

Tôi có thiếu thứ gì đó khi loại MIME không có giá trị để gọi một hộp thoại cho phép người dùng chọn không?

Tôi đã thử các biến thể khác của khởi chạy ứng dụng, bao gồm không đặt loại MIME và chỉ sử dụng .setData mà không thành công.

Hành động tôi muốn xảy ra là, người dùng nhấp vào tệp, nếu tệp được liên kết với một ứng dụng mà ứng dụng khởi chạy, nếu không, người dùng sẽ nhận được hộp thoại "Hoàn thành hành động đang sử dụng" với danh sách ứng dụng.

Cảm ơn lời khuyên nào.

+0

những gì đang đến trong chuỗi mimetype ?? dán nó ở đây –

+0

Có vẻ như nếu đó là nội dung nào đó có tệp được liên kết thì đó là loại MIME chính xác, nhưng nếu đó là nội dung chưa được gắn với một ứng dụng, nó sẽ bị vô hiệu .. – stonedonkey

Trả lời

44

nhờ Vâng để những kẻ Ý định mở, tôi đã bỏ lỡ câu trả lời lần đầu tiên thông qua mã của họ trong quản lý tập tin của họ, đây là những gì tôi đã kết thúc với:

File file = new File(filePath); 
    MimeTypeMap map = MimeTypeMap.getSingleton(); 
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); 
    String type = map.getMimeTypeFromExtension(ext); 

    if (type == null) 
     type = "*/*"; 

    Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri data = Uri.fromFile(file); 

    intent.setDataAndType(data, type); 

    startActivity(intent); 

Nếu bạn sử dụng một loại mime của "*/*" khi bạn không thể xác định nó từ hệ thống (nó là null) nó kích hoạt hộp thoại ứng dụng chọn phù hợp.

+7

CẢNH BÁO! - Đối với jpg, loại mime là jpeg và NOT jpg. Sử dụng mã của bạn, nếu bạn trích xuất phần mở rộng jpg, nó sẽ không đặt đúng loại mime và do đó, bạn sẽ không thể xem được hình ảnh đó. Hãy chắc chắn để thay thế jpg với jpeg khi thiết lập các loại mime cho hình ảnh jpg. – AndroidDev

+0

cảm ơn sự giúp đỡ của tôi nhưng tập tin thực sự không chooser sau khi thiết lập intent.setDataAndType (dữ liệu, loại); tải lên tệp không thành công. –

+1

Ngoài ra, MimeTypeMap.getFileExtensionFromUrl không thể xử lý dấu nháy đơn tốt: nó sẽ trả về một chuỗi rỗng cho "WorldHello.docx", nhưng sẽ trả về docx cho "WorldzHello.docx". Xem Regex tại đây: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

Bạn có thể sử dụng ý đồ tổng quát để mở file, như đoạn mã này được đề xuất here:

private void openFile(File aFile){ 
    try { 
     Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION, 
     new ContentURI("file://" + aFile.getAbsolutePath())); 
     startActivity(myIntent); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
}  

Nhưng tôi thường thấy rằng các ứng dụng kiểm tra phần mở rộng của tập tin trong lồng nhau nếu và cuối cùng cố gắng để mở tập tin với " text/plain "type:

Intent generic = new Intent(); 
generic.setAction(android.content.Intent.ACTION_VIEW); 
generic.setDataAndType(Uri.fromFile(file), "text/plain");  
try { 
    startActivity(generic); 
    } catch(ActivityNotFoundException e) { 
    ... 
}  

Bạn có thể thấy mã hoàn chỉnh trong this question hoặc trong open source project này. Tôi hy vọng điều này sẽ giúp bạn.

+0

Tôi đã thử cả hai kết quả này tôi đang tìm kiếm. Ví dụ đầu tiên tạo ra cùng một ngoại lệ. Lần thử thứ hai chỉ khởi chạy các ứng dụng hiểu văn bản/thuần túy là loại mime để không hoạt động. Cảm ơn bạn. – stonedonkey

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