2012-06-17 18 views
20

मैंने यहां सभी समान प्रश्नों की समीक्षा की है, लेकिन मैं अपने जीवन के लिए यह नहीं समझ सकता कि मैं क्या गलत कर रहा हूं।फ़ाइल और एमआईएमई प्रकार के लिए एक इरादा लॉन्च करना?

मैंने एक ऐसा एप्लीकेशन लिखा है जो विभिन्न फाइलों को लॉन्च करने का प्रयास करता है, एक फ़ाइल ब्राउज़र की तरह। जब कोई फ़ाइल क्लिक की जाती है, तो यह प्रोग्राम को इसके संबंधित एमआईएमई प्रकार के आधार पर लॉन्च करने का प्रयास करता है या यह "लॉन्च करने के लिए एप्लिकेशन चुनें" संवाद प्रस्तुत करता है।

यहाँ कोड मैं शुरू करने के लिए उपयोग कर रहा हूँ है:

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); 

यह विफल रहता है और त्रुटि उत्पन्न: अगर मैं उदाहरण के लिए OI फ़ाइल प्रबंधक स्थापित अब

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

, यह इस के बजाय खोलता है त्रुटि फेंक दी जा रही है, और फिर यदि मैं उसी फ़ाइल को उसमें से क्लिक करता हूं, तो यह अनुमोदित संवाद लॉन्च करता है।

मैंने देखा है कि उस विशेष फ़ाइल के लिए एमआईएमई प्रकार विफल रहता है, लेकिन अन्य माइम प्रकार .zip वापस मूल्य मानते हैं।

क्या मुझे कुछ याद आ रहा है जब MIME प्रकार एक संवाद को कॉल करने के लिए शून्य है जो उपयोगकर्ता को चुनने देता है?

मैंने ऐप लॉन्च करने के अन्य बदलावों की कोशिश की है, जिसमें एमआईएमई प्रकार सेट नहीं किया जा रहा है और केवल .setData का उपयोग करके कोई सफलता नहीं है।

जिस क्रिया को मैं करना चाहता हूं वह है, उपयोगकर्ता एक फ़ाइल पर क्लिक करता है, अगर यह ऐप लॉन्च करने वाले एप्लिकेशन से जुड़ा हुआ है, यदि नहीं, तो उपयोगकर्ता को ऐप्स की सूची के साथ "पूर्ण कार्रवाई का उपयोग" संवाद मिलता है।

किसी भी सलाह के लिए धन्यवाद।

+0

mimetype स्ट्रिंग में क्या आ रहा है ?? इसे पेस्ट करें –

+0

ऐसा लगता है कि यह एक ऐसी फ़ाइल है जिसमें एक संबंधित फ़ाइल है, यह सही एमआईएम प्रकार है, लेकिन अगर ऐसा कुछ है जो किसी ऐप से बंधे नहीं है तो यह शून्य के माध्यम से आता है .. – stonedonkey

उत्तर

44

ओपन आशय लोगों को अच्छी तरह से धन्यवाद, मैं इस सवाल का जवाब उनके फ़ाइल प्रबंधक में अपने कोड के माध्यम से पहली बार याद किया, यहाँ है कि मैं क्या साथ समाप्त हो गया है:

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); 

आप "*/*" जब की एक माइम प्रकार का उपयोग करते हैं आप इसे सिस्टम से निर्धारित नहीं कर सकते (यह null है) यह उचित चयन अनुप्रयोग संवाद को सक्रिय करता है।

+7

चेतावनी! - jpgs के लिए, माइम प्रकार jpeg है और jpg नहीं है। अपने कोड का उपयोग करके, यदि आप jpg एक्सटेंशन निकालते हैं, तो यह माइम प्रकार को सही तरीके से सेट नहीं करेगा और नतीजतन, आप छवि को देखने में सक्षम नहीं होंगे। Jpg छवियों के लिए माइम प्रकार सेट करते समय jpeg के साथ jpg को प्रतिस्थापित करना सुनिश्चित करें। – AndroidDev

+0

धन्यवाद मेरी मदद करें लेकिन वास्तविक फ़ाइल intent.setDataAndType (डेटा, प्रकार) सेट करने के बाद चयनकर्ता नहीं है; फ़ाइल अपलोड विफल –

+1

इसके अलावा, MimeTypeMap.getFileExtensionFromUrl एस्ट्रोफ़ेस को अच्छी तरह से संभाल नहीं सकता है: यह "World'sHello.docx" के लिए एक खाली स्ट्रिंग वापस कर देगा, लेकिन "WorldzHello.docx" के लिए डॉक्स को वापस कर देगा। यहां रेगेक्स देखें: https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

आप इस स्निपेट कोड कि 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(); 
    } 
}  

लेकिन मैं आम तौर पर देखने के आवेदन की जाँच करता है कि में नेस्टेड अगर और अंत के साथ "फ़ाइल खोलने का प्रयास फ़ाइल का एक्सटेंशन पाठ/सादे "के प्रकार:

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

आप this question में या इस open source project में पूरा कोड देख सकते हैं। उम्मीद है इससे आपको मदद होगी।

+0

मैंने इन दोनों की कोशिश की और न ही परिणाम परिणाम मैं देख रहा हूँ। पहला उदाहरण एक ही अपवाद उत्पन्न करता है। दूसरा केवल उन ऐप्स को लॉन्च करने का प्रयास करता है जो टेक्स्ट/सादे को माइम प्रकार के रूप में समझते हैं ताकि यह काम न करे। हालांकि धन्यवाद। – stonedonkey