किसी विशेष फ़ाइल एक्सटेंशन के लिए Android इरादा फ़िल्टर?


92

मैं 'नेट' से एक विशेष एक्सटेंशन के साथ एक फाइल डाउनलोड करने में सक्षम होना चाहता हूं, और इससे निपटने के लिए मेरे आवेदन को पारित कर दिया है, लेकिन मैं इरादे फिल्टर का पता लगाने में सक्षम नहीं हूं। फिलामेंट को मिमेट्स में शामिल नहीं किया गया है, और मैंने उपयोग करने की कोशिश की

<data android:path="*.ext" />

लेकिन मुझे वह काम नहीं मिला।

जवाबों:


119

यहां बताया गया है कि मैंने इसे प्राप्त करने के लिए अपने AndroidManifest.xml में अपनी गतिविधि को कैसे परिभाषित किया।

<activity android:name="com.keepassdroid.PasswordActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="file" />
        <data android:mimeType="*/*" />
        <data android:pathPattern=".*\\.kdb" />
        <data android:host="*" />
    </intent-filter>
</activity>

schemeका fileसंकेत मिलता है कि यह जब एक स्थानीय फ़ाइल (बजाय HTTP जैसे प्रोटोकॉल की तुलना में) खोला है होना चाहिए।

mimeType\*/\*किसी भी माइम प्रकार से मिलान करने के लिए सेट किया जा सकता है ।

pathPatternवह जगह है जहाँ आप निर्दिष्ट करते हैं कि आप किस विस्तार से मिलान करना चाहते हैं (इस उदाहरण में .kdb)। .*शुरुआत में वर्णों के किसी squence मेल खाता है। इन तारों को दोहरी भागने की आवश्यकता होती है, इसलिए \\\\.एक शाब्दिक अवधि से मेल खाती है। उसके बाद, आप अपनी फ़ाइल एक्सटेंशन के साथ समाप्त होते हैं। PathPattern के साथ एक चेतावनी यह है कि .*आप एक लालची मैच नहीं हैं जैसे कि आप उम्मीद करेंगे कि यह एक नियमित अभिव्यक्ति थी। यह पैटर्न उन पथों से मेल करने में विफल होगा, जिनमें .से पहले एक है .kdb। इस मुद्दे की अधिक विस्तृत चर्चा और वर्कअराउंड के लिए यहां देखें

अंत में, Android प्रलेखन के अनुसार, दोनों hostऔर schemeविशेषताओं के लिए आवश्यक हैंpathPattern काम करने के लिए विशेषता है, इसलिए सिर्फ इतना है कि वाइल्डकार्ड के लिए कुछ भी मैच के लिए निर्धारित किया है।

अब, यदि आप .kdbलिंडा फ़ाइल प्रबंधक जैसे ऐप में एक फ़ाइल का चयन करते हैं, तो मेरा ऐप एक विकल्प के रूप में दिखाई देता है। मुझे ध्यान देना चाहिए कि यह अकेले ही आपको ब्राउज़र में इस फ़ाइल को डाउनलोड करने की अनुमति नहीं देता है, क्योंकि यह केवल फ़ाइल योजना के साथ रजिस्टर करता है। अपने फोन प्रतिरोधों पर लिंडा फ़ाइल प्रबंधक जैसे ऐप होने से आप किसी भी फ़ाइल प्रकार को डाउनलोड करने की अनुमति देते हैं।


3
यह यहाँ काम नहीं करता है। पहले mimeType = " " के साथ, पैकेज एंड्रॉइड 2.1 पर स्थापित नहीं होता है, मुझे एक MalformedMimeTypeException मिलती है। "* / " का उपयोग इसे ठीक करता है, लेकिन फिर, इस फ़िल्टर का कोई प्रभाव नहीं होता है। मैं वर्तमान में स्काईफायर ब्राउज़र के साथ परीक्षण कर रहा हूं, जो माइम प्रकार के डाउनलोड को संरक्षित नहीं करता है, जैसा कि मानक एंड्रॉइड ब्राउज़र करते हैं। और जब Skyfire डाउनलोड सूची में एक फ़ाइल पर क्लिक करते हैं, तो फ़ाइल डेटा के साथ एक सरलीकृत VIEW इरादे प्रसारित होता है। और यह आशय फ़िल्टर मेल नहीं खाता है।
ओलिविएरग

@ ब्रायन पेलिन: मैं वास्तव में .kdbxइस पद के लिए इशारा किए जाने पर ES फाइल एक्सप्लोरर को kdbx फ़ाइलों को खोलने की अनुमति देने के लिए एक्सटेंशन में माइम-प्रकार को बांधने का एक तरीका खोज रहा था। जाहिरा तौर पर अगर इरादे में खाली MIME प्रकार है, तो यह आशय फ़िल्टर काम नहीं करेगा !! इसके अलावा, कार्रवाई और सिर्फ एक यूआरआई के रूप में ईएमपीटीवाई स्ट्रिंग के साथ एक इरादा रखना संभव है। Google डॉक्स ने उस इरादे का जवाब दिया, इसलिए यह मान्य होना चाहिए।
बिलसी। सीएन

2
बस स्पष्ट होने के लिए, mimeType "* / * होना चाहिए" मुझे लगता है कि कुछ लोग अपने * s से बचने के लिए भूल गए
ब्रायन पेलिन

1
यह एंड्रॉइड 4 के साथ काम नहीं करेगा। आपको <data>चार विशेषताओं के साथ टैग पर उपयोग करना चाहिए । 4 टैग होना तार्किक है - या जो एंड्रॉइड 2 के साथ काम करता है - लेकिन एंड्रॉइड 4 अधिक सख्त है। देखें stackoverflow.com/questions/20650378/...
मार्टिन

3
यदि \\\\.शाब्दिक अवधि से मेल खाता है, तो आप इसका उपयोग .kdbएक्सटेंशन बनाने के लिए क्यों नहीं करते हैं \\\\.kdb:?
लीलो

33

इस विषय पर बहुत सी गलत जानकारी है, कम से कम Google के स्वयं के प्रलेखन से नहीं। सबसे अच्छा, और अजीब तर्क दिया, संभवतः एकमात्र वास्तविक दस्तावेज स्रोत कोड है।

लक्ष्य फ़िल्टर कार्यान्वयन तर्क है कि लगभग वर्णन खारिज कर देता है। पार्सर कोड पहेली के अन्य प्रासंगिक टुकड़ा है।

निम्नलिखित फ़िल्टर समझदार व्यवहार के बहुत करीब आते हैं। "फ़ाइल" योजना के लिए पथ पैटर्न लागू होते हैं।

वैश्विक माइम प्रकार का पैटर्न मैच सभी प्रकारों से मेल खाएगा जब तक कि फाइल एक्सटेंशन मैच न हो जाए। यह सही नहीं है, लेकिन ES फ़ाइल एक्सप्लोरर जैसे फ़ाइल प्रबंधकों के व्यवहार से मेल खाने का एकमात्र तरीका है, और यह उन इरादों तक सीमित है जहां URI / फ़ाइल एक्सटेंशन मैच करते हैं।

मैंने यहां "http" जैसी अन्य योजनाओं को शामिल नहीं किया है, लेकिन वे शायद इन सभी फिल्टर पर ठीक काम करेंगे।

विषम योजना "सामग्री" है, जिसके लिए फ़िल्टर को एक्सटेंशन उपलब्ध नहीं है। लेकिन जब तक प्रदाता बताता है कि आपका MIME प्रकार (उदा। जीमेल लगाव के लिए MIME प्रकार पर पास हो जाएगा), फ़िल्टर का मिलान होगा।

के बारे में पता होना चाहिए:

  1. इस बात से अवगत रहें कि कुछ भी फ़िल्टर में लगातार व्यवहार नहीं करता है, यह एक स्पेकल केस है, और डिजाइन लक्ष्य के रूप में कम से कम आश्चर्य के सिद्धांत का उल्लंघन करता है। कोई भी पैटर्न मिलान एल्गोरिदम एक ही वाक्यविन्यास या व्यवहार का पालन नहीं करता है। एक क्षेत्र की अनुपस्थिति कभी-कभी एक वाइल्डकार्ड है और कभी-कभी नहीं होती है। एक डेटा तत्व के भीतर गुण कभी-कभी एक साथ चलते हैं और कभी-कभी समूहन को अनदेखा करते हैं। यह वास्तव में बेहतर किया जा सकता था।
  2. योजना और होस्ट को मिलान करने के लिए पथ नियमों के लिए निर्दिष्ट किया जाना चाहिए (वर्तमान में Google के एपीआई गाइड के विपरीत)।
  3. कम से कम ES फ़ाइल एक्सप्लोरर "MIME प्रकार" के साथ इंटेंस उत्पन्न करता है, जिसे बहुत अलग तरीके से नल करने के लिए फ़िल्टर किया गया है, स्पष्ट रूप से मेल खाना असंभव है, और केवल जोखिम भरे "* / *" फ़िल्टर द्वारा मिलान किया जा सकता है।
  4. "* / *" फिल्टर एक अशक्त MIME प्रकार के साथ इरादों से मेल नहीं खाएगा - जिसके लिए इस विशिष्ट मामले के लिए एक अलग फिल्टर की आवश्यकता है जिसमें MIME प्रकार नहीं है।
  5. "सामग्री" योजना केवल MIME प्रकार से मेल खा सकती है, क्योंकि मूल फ़ाइल नाम इरादे में उपलब्ध नहीं है (कम से कम जीमेल के साथ)।
  6. अलग-अलग "डेटा" तत्वों में विशेषताओं का समूहन (लगभग) व्याख्या के लिए अप्रासंगिक है, मेजबान और बंदरगाह के विशिष्ट अपवाद के साथ - जो एक साथ जोड़ी बनाते हैं। बाकी सब कुछ "डेटा" तत्व के भीतर या "डेटा" तत्वों के बीच कोई विशिष्ट संबंध नहीं है।

इस सब को ध्यान में रखते हुए, यहाँ टिप्पणियों के साथ एक उदाहरण दिया गया है:

<!--
     Capture content by MIME type, which is how Gmail broadcasts
     attachment open requests.  pathPattern and file extensions
     are ignored, so the MIME type *MUST* be explicit, otherwise
     we will match absolutely every file opened.
-->
<intent-filter
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:priority="50" >
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />

    <data android:scheme="file" />
    <data android:scheme="content" />
    <data android:mimeType="application/vnd.my-type" />
</intent-filter>

<!--
     Capture file open requests (pathPattern is honoured) where no
     MIME type is provided in the Intent.  An Intent with a null
     MIME type will never be matched by a filter with a set MIME
     type, so we need a second intent-filter if we wish to also
     match files with this extension and a non-null MIME type
     (even if it is non-null but zero length).
-->
<intent-filter
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:priority="50" >
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />

    <data android:scheme="file" />
    <data android:host="*" />

    <!--
         Work around Android's ugly primitive PatternMatcher
         implementation that can't cope with finding a . early in
         the path unless it's explicitly matched.
    -->
    <data android:pathPattern=".*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
</intent-filter>

<!--
     Capture file open requests (pathPattern is honoured) where a
     (possibly blank) MIME type is provided in the Intent.  This
     filter may only be necessary for supporting ES File Explorer,
     which has the probably buggy behaviour of using an Intent
     with a MIME type that is set but zero-length.  It's
     impossible to match such a type except by using a global
     wildcard.
-->
<intent-filter
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:priority="50" >
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />

    <data android:scheme="file" />
    <data android:host="*" />
    <data android:mimeType="*/*" />

    <!--
         Work around Android's ugly primitive PatternMatcher
         implementation that can't cope with finding a . early in
         the path unless it's explicitly matched.
    -->
    <data android:pathPattern=".*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.my-ext" />
</intent-filter>

बहुत अच्छा है कि आप \\ .. पर और अधिक और अन्य quirks के लिए कई सबूत की जरूरत के लिए खड़े हो जाओ। Google को इसे 4.2 से तय करना चाहिए था, नर्क क्या है। काश, मेरे पास अभी भी ऐसे मामले हैं जो आपके उदाहरण से ठीक नहीं लगते हैं। क्या ".gblorb" जैसे 6 चा एक्सटेंशन के साथ कुछ समस्या है कि मेरा कोड 3 अक्षरों या उससे कम के साथ ठीक काम करता है?
राउंडस्पारो हिल्टेक्स

इस सवाल का सबसे अच्छा जवाब और मेरी राय में इसी तरह के सवाल! अफसोस की बात है, जब तक कि फ़ाइल एक्सटेंशन द्वारा कंटेंट इंटेंट्स का मिलान करना संभव नहीं है (जैसा कि आप 5 में इंगित करते हैं), गलत मिलान किए बिना सभी सही इंटेंट्स के लिए मज़बूती से फ़िल्टर करना संभव नहीं है। यह उस मामले के लिए है जहां आप कस्टम माइम प्रकार का उपयोग नहीं कर सकते हैं। इसलिए जब तक एंड्रॉइड इसके लिए कोई समाधान प्रदान नहीं करता है, यह मेरे लिए ऐप के भीतर एक फ़ाइल-चयनकर्ता होने जा रहा है ... मैं उपयोगकर्ता को असंगत व्यवहार के साथ भ्रमित नहीं करना चाहता।
बेंजामिन बिसिंगर

1
बहुत बहुत धन्यवाद .. आपने बस अपना दिन बना लिया है .. मेरे मामले में मुझे <data android:mimeType="*/*" /> तीनों विकल्पों में से MimeType को बदलना पड़ा और इसने Google ड्राइव और जीमेल सहित सभी ऐप्स के लिए आकर्षण की तरह काम किया।
ऋषभ वाधवा

1
मैं आपको बहुत धन्यवाद देना चाहूंगा, @ डेविड सैनी। आपने मेरी 24 घंटों की लंबी तड़प को खत्म करने की कोशिश की। मैंने stackoverflow.com/q/18577860/6110285 , stackoverflow.com/a/8599921/6110285 की कोशिश की और बहुत कुछ ऐसा ही था। यह केवल एक ही है जो काम करता है।
14

24

मुझे यह स्वीकार करना चाहिए कि एंड्रॉइड पर फाइल सिस्टम से ईमेल और फाइलों से अटैचमेंट खोलने का सरल कार्य अब तक के अधिक मैडल अनुभवों में से एक रहा है। बहुत सारी फाइलें या बहुत कम संभालना आसान है। लेकिन इसे सही ठहराना कठिन है। स्टैकओवरफ़्लो पर पोस्ट किए गए अधिकांश समाधान मेरे लिए सही तरीके से काम नहीं करते हैं।

मेरी आवश्यकताएं थीं:

  • मेरे ऐप द्वारा मेरे ऐप हैंडल अटैच किए गए हैं
  • मेरे ऐप फ़ाइल को उन फ़िलस्टोर पर रखें, जो मेरे ऐप द्वारा जनरेट किए गए थे और जिनका एक विशेष एक्सटेंशन है

संभवतः इस कार्य के बारे में जाने का सबसे अच्छा तरीका अपने अनुलग्नकों के लिए एक कस्टम MIME प्रकार निर्दिष्ट करना है। और आप शायद एक कस्टम फ़ाइल एक्सटेंशन भी चुनेंगे। तो चलिए बताते हैं कि हमारे ऐप को "कूल ऐप" कहा जाता है और हम अंत में ".cool" फाइल अटैचमेंट जनरेट करते हैं।

यह मेरे लक्ष्य के लिए मिला निकटतम है और यह काम करता है ... संतोषजनक।

<!-- Register to handle email attachments -->
<!-- WARNING: Do NOT use android:host="*" for these as they will not work properly -->
<intent-filter>
    <!-- needed for properly formatted email messages -->
    <data
        android:scheme="content"
        android:mimeType="application/vnd.coolapp"
        android:pathPattern=".*\\.cool" />
    <!-- needed for mangled email messages -->
    <data
        android:scheme="content"
        android:mimeType="application/coolapp"
        android:pathPattern=".*\\.cool" />
    <!-- needed for mangled email messages -->
    <data
        android:scheme="content"
        android:mimeType="application/octet-stream"
        android:pathPattern=".*\\.cool" />

    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

<!-- Register to handle file opening -->
<intent-filter>
    <data android:scheme="file"
          android:mimeType="*/*"
          android:pathPattern=".*\\.cool"
          android:host="*"/>

    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>

टिप्पणियाँ:

  • pathPattern(का उपयोग करते समय कम या ज्यादा अनुलग्नकों के लिए ध्यान नहीं दिया जा रहा हैandroid:scheme="content" )। अगर किसी को केवल कुछ पैटर्न पर प्रतिक्रिया देने के लिए पथप्रदर्शक मिलता है तो मैं यह देखकर रोमांचित हो जाऊंगा कि कैसे।
  • अगर मैंने ऐड किया तो जीमेल ऐप ने चॉइस में मेरे ऐप को लिस्ट करने से मना कर दिया android:host="*" विशेषता ।
  • यह शायद अभी भी काम करता है अगर ये intent-filter ब्लॉकों को मिला दिया जाता है लेकिन मैंने इसे सत्यापित नहीं किया है।
  • किसी फ़ाइल को डाउनलोड करते समय एक ब्राउज़र से अनुरोधों को संभालने के android:scheme="http"लिए इस्तेमाल किया जा सकता है। ध्यान दें कि कुछ ब्राउज़रों के android:mimeTypeसाथ प्रयोग में गड़बड़ी हो सकती है android:mimeType="*/*"और डीबगर में जांच कर सकते हैं कि वास्तव में क्या हुआ है और फिर उस कष्टप्रद ऐप को समाप्त न करने के लिए फ़िल्टरिंग को कस दें जो सब कुछ संभालता है
  • कुछ फ़ाइल खोजकर्ता आपकी फ़ाइलों के लिए MIME-Types को भी गड़बड़ कर देंगे। ऊपर intent-filterगैलेक्सी S3 पर सैमसंग के "माय फाइल्स" ऐप के साथ परीक्षण किया गया था। एफएक्स एक्सप्लोरर अभी भी फ़ाइल को ठीक से खोलने से इनकार करता है और मैंने यह भी देखा कि एप्लिकेशन आइकन का उपयोग फ़ाइलों के लिए नहीं किया गया है। फिर, अगर किसी को भी काम करने के लिए कृपया नीचे टिप्पणी करें।

मुझे आशा है कि आपको यह उपयोगी लगेगा और आपको सभी संभावित संयोजनों से गुजरने वाले दिनों को बर्बाद नहीं करना पड़ेगा। इसमें सुधार की गुंजाइश है इसलिए टिप्पणियों का स्वागत है।


यह मेरे लिए एक कार्यशील समाधान है। कन्टैंट-स्कीम और फ़ाइल-स्कीम के लिए एक अलग <आशय-फ़िल्टर> को पंजीकृत करने का काम किया! धन्यवाद!
महालिफिकेशन

धन्यवाद! मेरे लिए काम किया। गैलेक्सी S6 पर जीमेल ऐप और सैमसंग माय फाइल्स ऐप दोनों ही आपके समाधान का उपयोग करके मेरे ऐप के साथ फाइल खोलने में सक्षम थे!
हरिस

वास्तव में "ऐप का नाम क्या है?" (मेरे मामले में, मानव-पठनीय ऐप नाम में रिक्त स्थान हैं।)
विलियम जॉकस

@IlliamJockusch ऐसा लगता है जैसे @DavidSainty स्ट्रिंग संसाधन फ़ाइल में केवल एप्लिकेशन नाम संग्रहीत कर रहा है। रिक्त स्थान ठीक होना चाहिए। के लिए इस्तेमाल किया स्ट्रिंग android:labelलक्ष्य फ़िल्टर के लिए स्ट्रिंग है जो उपयोगकर्ता चयनकर्ता मेनू में देखेंगे। डिफ़ॉल्ट रूप से एप्लिकेशन नाम का उपयोग किया जाता है।
ओमाहना

मुझे "Google ड्राइव" ऐप के लिए क्या उपयोग करना चाहिए?
एंड्रॉइड डेवलपर

9

ऊपर ब्रायन के जवाब से मुझे वहां का 90% रास्ता मिल गया। इसे खत्म करने के लिए, माइम प्रकार के लिए मैंने उपयोग किया

android:mimeType="*/*"

मुझे संदेह है कि पिछले पोस्टरों ने एक ही विवरण पोस्ट करने का प्रयास किया है, लेकिन कोड के रूप में स्टार स्लैश स्टार को छोड़कर, स्टैकओवरफ़्लो इसे केवल एक स्लैश के रूप में चित्रित करता है।


2
इसके साथ आप सभी फ़ाइल प्रकारों को संभाल लेंगे, और यह वास्तव में कष्टप्रद है (ठीक है, सिवाय इसके कि अगर आपका ऐप वास्तव में सब कुछ संभालता है) ...
टिम ऑटिन

ये गलत है। कृपया अपने ऐप्स के अंदर ऐसा न करें।
मंगल

8

इसके बजाय android:path, android:mimeTypeइस विशेष सामग्री के MIME प्रकार के मान के साथ प्रयास करें। इसके अलावा, android:pathवाइल्डकार्ड को स्वीकार नहीं करता है - इसके android:pathPatternलिए उपयोग करें ।


"फिलामेंट को मेटिमिपेस में शामिल नहीं किया गया है"? आपके द्वारा डाउनलोड की जा रही सामग्री के प्रकार के लिए अभी भी एक mimetype होना चाहिए, भले ही वह एक ही शब्द का उपयोग न करता हो।
एरिक मिल

सामग्री के प्रकार के लिए एक mimetype है, लेकिन फ़ाइल एक तृतीय पक्ष एप्लिकेशन द्वारा निर्मित होती है जो इस पर एक अलग एक्सटेंशन डालती है, इसलिए मुझे नहीं लगता कि इसे mimetype के रूप में पहचाना जाएगा।
सूर्योदय से

7

मैं इसे उम्र के लिए काम करने की कोशिश कर रहा हूं और सभी सुझाए गए समाधानों को मूल रूप से करने की कोशिश की है और अभी भी विशिष्ट फ़ाइल एक्सटेंशन को पहचानने के लिए एंड्रॉइड प्राप्त नहीं कर सकता। मैं एक के साथ एक आशय-फ़िल्टर है"*/*" म्यूटाइप के है जो केवल एक चीज है जो काम करने के लिए लगता है और फ़ाइल-ब्राउज़र अब मेरे ऐप को फ़ाइलों को खोलने के लिए एक विकल्प के रूप में सूचीबद्ध करता है, हालांकि मेरा ऐप अब किसी भी तरह की फ़ाइल खोलने के लिए एक विकल्प के रूप में दिखाया गया है मैंने pathPattern टैग का उपयोग करके विशिष्ट फ़ाइल एक्सटेंशन निर्दिष्ट किए हैं। यह इतना आगे बढ़ जाता है कि जब भी मैं अपनी संपर्क सूची में किसी संपर्क को देखने / संपादित करने का प्रयास करता हूं, तो एंड्रॉइड मुझसे पूछता है कि क्या मैं संपर्क देखने के लिए अपने ऐप का उपयोग करना चाहता हूं, और यह सिर्फ कई स्थितियों में से एक है जहां ऐसा होता है, बहुत ही कष्टप्रद है।

आखिरकार मुझे यह Google समूह एक समान प्रश्न के साथ मिला, जिसके लिए एक वास्तविक एंड्रॉइड फ्रेमवर्क इंजीनियर ने उत्तर दिया। वह बताती है कि एंड्रॉइड को केवल फ़ाइल-एक्सटेंशन के बारे में कुछ भी नहीं पता है, केवल MIME-types ( https://groups.google.com/forum/# .topic/android-developers/a7qsSl3vQq0 )।

इसलिए मैंने जो कुछ देखा, आजमाया और पढ़ा है, एंड्रॉइड बस फ़ाइल-एक्सटेंशन के बीच अंतर नहीं कर सकता है और pathPattern टैग मूल रूप से समय और ऊर्जा की भारी बर्बादी है। यदि आप केवल एक निश्चित माइम-प्रकार (जैसे पाठ, वीडियो या ऑडियो) की फ़ाइलों की आवश्यकता के लिए भाग्यशाली हैं, तो आप माइम-प्रकार के साथ एक आशय-फ़िल्टर का उपयोग कर सकते हैं। यदि आपको Android द्वारा ज्ञात एक विशिष्ट फ़ाइल-एक्सटेंशन या माइम-प्रकार की आवश्यकता नहीं है, तो आप भाग्य से बाहर हैं।

अगर मैं इसमें से किसी के बारे में गलत हूं तो कृपया मुझे बताएं, अब तक मैंने हर पोस्ट को पढ़ा है और हर प्रस्तावित समाधान की कोशिश की है जो मुझे मिल सकता है लेकिन किसी ने भी काम नहीं किया है।

मैं इस बारे में एक या दो पेज लिख सकता हूं कि एंड्रॉइड में इस तरह की चीजें कितनी सामान्य लगती हैं और डेवलपर अनुभव कैसा है, लेकिन मैं आपको अपने गुस्से को दूर करने के लिए बचाऊंगा;)। आशा है कि मैंने किसी को कुछ परेशानी से बचाया।


1
आपको अपवित्र किया गया क्योंकि आपका उत्तर एक उपयोगी लिंक देता है और डाउनवॉटर ने कोई टिप्पणी नहीं छोड़ी है। क्षमा करें SO कभी-कभी इस तरह से अमित्र हो सकता है, लेकिन उस पर मत छोड़ो।
जॉन हैटन

3

ब्रायन का उत्तर बहुत ही करीब है, लेकिन यहाँ एक साफ-सुथरा और त्रुटि रहित तरीका है कि आप अपने कस्टम एक्सटेंशन के साथ एक फ़ाइल खोलने की कोशिश कर रहे हैं (जब आपको स्कीम या होस्ट की कोई आवश्यकता नहीं है):

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:mimeType="*/*" />
    <data android:pathPattern="*.*\\.kdb" />
</intent-filter>

2
Android दस्तावेज़ीकरण बताता है कि यदि कोई योजना और होस्ट निर्दिष्ट किया गया है, तो पथप्रदर्शक विशेषता केवल सार्थक है, और मैंने इसे सत्यापित किया है: developer.android.com/guide/topics/manifest/data-element.html
ब्रायन पेलिन 1

4
-1; यह किसी भी फ़ाइल से मेल खाएगा ; ब्रायन की टिप्पणी सही है और mimeType के मामूली संशोधन के साथ = " / " उनका मूल उदाहरण एकदम सही है।
निक

यह पोस्ट अगर बहुत समय पहले से है, लेकिन कोई "/" इंस्टॉल नहीं करता है। आपको "* / *" की आवश्यकता है, जो किसी भी फ़ाइल प्रकार से मेल खाएगा (निश्चित रूप से, यदि आप यह कहने का मतलब है)। तो आपके प्रोग्राम को वीडियो या एमपी 3 खोलने के लिए कहा जा सकता है। मुझे अभी तक इसका कोई हल नहीं मिला है।
रेने

आपको <data>चार विशेषताओं के साथ एक टैग का उपयोग करना चाहिए । आपका समाधान एंड्रॉइड 2 के साथ काम कर सकता है - लेकिन नियम अधिक सख्त हो गए हैं: stackoverflow.com/questions/20650378/…
मार्टिन

अजीब रास्ते के साथ क्या हो रहा है ? और hostऔर schemeआवश्यक हैं!
इगोरगानापोलस्की

3

एंड्रॉइड 4 पर नियम अधिक सख्त हो गए थे तब वे हुआ करते थे। उपयोग:

    <data
      android:host=""
      android:mimeType="*/*"
      android:pathPattern=".*\\.ext"
      android:scheme="file"
    ></data>

3

मैं एक कस्टम फ़ाइल एक्सटेंशन के लिए अपने आप से बहुत संघर्ष कर रहा हूं। बहुत खोज करने के बाद, मुझे यह वेब पेज मिला, जहाँ पोस्टर से पता चला कि एंड्रॉइड का पैटर्नमैचर क्लास (जिसका उपयोग इंटेंट-फिल्टर्स में मिलान के लिए पाथनाटर्न के लिए किया जाता है) में अप्रत्याशित व्यवहार होता है जब आपके रास्ते में आपके मैच पैटर्न का पहला चरित्र कहीं और होता है। (जैसे यदि आप "* .xyz" से मेल खाना चाह रहे हैं, तो पैटर्नमैचर वर्ग रुक जाता है यदि आपके पथ में पहले "x" है)। यहाँ वह एक वर्कअराउंड के लिए मिला, और मेरे लिए काम किया, हालांकि यह एक हैक का एक सा है:

पैटर्नमैचर का इस्तेमाल इंटेंटफिल्टर में पाथ पाटन के लिए किया जाता है लेकिन, पैटर्नमैचर्स एल्गोरिथ्म मेरे लिए काफी अजीब है। यहाँ Android PatternMatcher का एल्गोरिथ्म है।

यदि स्ट्रिंग के बीच में '*' का * अगला वर्ण '' है, तो पैटर्नमैचर उस बिंदु पर लूप बंद कर देता है। (Android फ्रेमवर्क का पैटर्चरमैचर.जवा देखें।)

पूर्व। स्ट्रिंग: "यह मेरा लगाव है" पैटर्न: "। अट। "। Android PatternMatcher मैच के लिए लूप दर्ज करें '। 'पैटर्न के अगले चरित्र से मिलने तक पैटर्न (इस उदाहरण पर,' ए '),'। इंडेक्स 8 में 'लूपिंग लूप बंद हो जाता है -' ए 'के बीच' और 'माय' है। इसलिए इस मैच का परिणाम 'गलत' है।

काफी अजीब है, है ना। इसे वर्कअराउंड करने के लिए - वास्तव में संभावना को कम करता है - डेवलपर को कष्टप्रद बेवकूफ पथचित्र का उपयोग करना चाहिए।

पूर्व। लक्ष्य: uri पथ से मेल खाता है जिसमें 'संदेश' शामिल है।

<intent-filter>
...
<data android:pathPattern=".*message.*" />
<data android:pathPattern=".*m.*message.*" />
<data android:pathPattern=".*m.*m.*message.*" />
<data android:pathPattern=".*m.*m.*m.*message.*" />
<data android:pathPattern=".*m.*m.*m.*m.*message.*" />
...
</intent-filter>

यह विशेष रूप से तब जारी किया जाता है जब कस्टम फाइल एक्स्टेंशन के साथ मिलान किया जाता है।


रुचि रखने वाले किसी व्यक्ति के लिए, एक कोड code.google.com
बेंजामिन डेविस

3

उपरोक्त किसी भी कार्य को VIEW या SEND क्रियाओं के लिए ठीक से नहीं किया जाता है, यदि प्रत्यय एंड्रॉइड के सिस्टम = MIME डेटाबेस में MIME प्रकार के साथ पंजीकृत नहीं है। केवल सेटिंग्स मैंने पाया है कि निर्दिष्ट प्रत्यय के लिए आग में शामिल हैं android:mimeType="*/*", लेकिन फिर सभी फ़ाइलों के लिए कार्रवाई आग। स्पष्ट रूप से आप क्या चाहते हैं नहीं!

एंड्रॉइड माइम डेटाबेस में माइम और प्रत्यय को जोड़े बिना मुझे कोई उचित समाधान नहीं मिल सकता है, अब तक मुझे ऐसा करने का कोई तरीका नहीं मिला है। अगर किसी को पता है, एक सूचक बहुत अच्छा होगा।


2

जब एक इरादे मिलते हैं intent-filter, ये हैंintent-filter आवश्यकताएं हैं: (एक चेकलिस्ट की कल्पना करें)।

  • कोई मेल <action>
  • कोई मेल <category>
  • कोई भी मिलान <data mimeType>(आसान तय: " / ")
  • वैकल्पिक रूप से:

    • किसी भी मिलान <data scheme>(आसान फिक्स: <data android:scheme="file" /> <data android:scheme="content" />)

    • कोई भी मिलान <data host>(आसान तय: "*")

    • कोई भी मिलान <data pathPattern/etc.>(उदाहरण के लिए .*\\.0cc)

कई <data $type="">तत्वों को परिभाषित करने से अगर किसी भी <data $type=>मैच के लिए $ टाइप बॉक्स की जांच होती है Intent

MimeType को छोड़ना आपके टूटता है intent-filter, भले ही यह बेमानी हो। ओमिटिंग <data scheme/host/pathPattern>आपके फिल्टर को हर चीज से मेल खाता है।

https://f-droid.org/en/packages/de.k3b.android.intentintercept/ सभी इरादों को प्राप्त करने के लिए डिज़ाइन किया गया एक ऐप है , और आपको इरादे का निरीक्षण करने की अनुमति देता है। मुझे पता चला कि साधारण फ़ाइल प्रबंधक के माध्यम से खोले गए बिना पहचाने गए फ़ाइल एक्सटेंशन MIME प्रकार के साथ दिए गए हैं application/octet-stream

https://stackoverflow.com/a/4621284/2683842 रिपोर्ट करती है कि <data pathPattern=> .*xyzपहली बार xदेखने पर गर्भपात हो जाता है, और उसके बाद नहीं आने पर तुरंत विफल हो जाएगी yz। इसलिए जब तक आप इसके बजाय प्रयास /sdcard/.hidden/foo.0ccनहीं करेंगे ।.*\\.0cc.*\\..*\\.0cc

  • मैंने सत्यापित नहीं किया कि क्या यह समाधान आवश्यक है।

अंतिम परिणाम:

<activity android:name=".Ft2NsfActivity">

    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="file" />
        <data android:scheme="content" />
        <data android:host="*" />
        <data android:pathPattern=".*\\.ftm"/>
        <data android:pathPattern=".*\\..*\\.ftm"/>
        <data android:pathPattern=".*\\..*\\..*\\.ftm"/>
        <data android:pathPattern=".*\\..*\\..*\\..*\\.ftm"/>
        <data android:pathPattern=".*\\.0cc"/>
        <data android:pathPattern=".*\\..*\\.0cc"/>
        <data android:pathPattern=".*\\..*\\..*\\.0cc"/>
        <data android:pathPattern=".*\\..*\\..*\\..*\\.0cc"/>
        <data android:mimeType="*/*" />
    </intent-filter>

</activity>

1

अगर आप चाहते हैं कि फाइलें सीधे जीमेल, ड्रॉपबॉक्स या किसी भी बिल्ड एंड्रॉइड फाइल टूल से खोली जाएं, तो निम्न कोड का उपयोग करें ('एंड्रॉइड: होस्ट = "*" "जो फ़ाइल को जीमेल के लिए पहुंच से बाहर कर दिया):

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="content" android:pathPattern=".*\\.kdb" 
          android:mimeType="application/octet-stream"/>


</intent-filter>

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:scheme="file" android:mimeType="*/*"     
          android:pathPattern=".*\\.kdb"/>
</intent-filter>

डेटा फ़िल्टर को एंड्रॉइड वर्जन 4.x के अनुसार एक स्टेटमेंट में लिखा जाना चाहिए


मैं एंड्रॉइड ब्राउज़र को डाउनलोड करने और सही ढंग से काम करने की कोशिश कर रहा हूं। आपका समाधान एंड्रॉइड देशी ब्राउज़र और एंड्रॉइड क्रोम के लिए अच्छी तरह से काम करता है, हालांकि एंड्रॉइड फ़ायरफ़ॉक्स अभी भी एक पाठ विंडो में मेरी फ़ाइल को खोलता है। यह एक कस्टम माइम प्रकार और कस्टम एक्सटेंशन है। पहले केवल विस्तार के साथ, यह केवल फ़ायरफ़ॉक्स में काम करता था। अब यह फ़ायरफ़ॉक्स (जीमेल सहित) को छोड़कर हर जगह काम करता है। मैं अभी भी इसका परीक्षण कर रहा हूं, लेकिन मैं इस तथ्य को चिह्नित करना चाहता हूं कि यहां क्रॉस ब्राउजर मुद्दों का एक नया सेट है।
डेमन स्मिथ

1

ब्राउज़र, जीमेल और फ़ाइल ब्राउज़र (परीक्षण) से खोलने के लिए नीचे दिए गए फ़िल्टर का उपयोग करना। नोट: कृपया दो फ़िल्टर मर्ज न करें, जो ब्राउज़र को आपके ऐप (परीक्षण) को अनदेखा कर देगा।

        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>

            <data android:scheme="file" android:pathPattern=".*\\.ext" android:mimeType="application/*"/>
            <data android:scheme="content" android:pathPattern=".*\\.ext" android:mimeType="application/*"/>
        </intent-filter>

        <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            <data android:scheme="http"
                  android:host="*"
                  android:pathPattern=".*\\.ext" />
            <data android:scheme="https"
                  android:host="*"
                  android:pathPattern=".*\\.ext" />
            <data android:scheme="ftp"
                  android:host="*"
                  android:pathPattern=".*\\.ext" />

        </intent-filter>

क्या आपने जीमेल अटैचमेंट्स के साथ इस उत्तर का परीक्षण किया है?
इगोरगानापोलस्की

1

अद्यतन 2020

एंड्रॉइड ने कंटेंट URIs और MIME-Types को इरादे फिल्टर के लिए स्थानांतरित कर दिया है।

समस्या

एक सामग्री URI के लिए फ़ाइल का एक्सटेंशन या नाम शामिल होना आवश्यक नहीं है और यह विभिन्न अनुप्रयोगों के बीच भिन्न होगा जो सामग्री / फ़ाइल प्रदान कर रहे हैं।

यहां एक ही ईमेल अनुलग्नक के लिए विभिन्न ईमेल अनुप्रयोगों से कुछ उदाहरण सामग्री यूआरआई हैं:

Gmail -> content://com.google.android.gm.sapi/some_email@gmail.com/message_attachment_external/%23thread-a%3Ar332738858767305663/%23msg-a%3Ar-5439466788231005876/0.1?account_type=com.google&mimeType=application%2Foctet-stream&rendition=1

आउटलुक -> content://com.microsoft.office.outlook.fileprovider/outlookfile/data/data/com.microsoft.office.outlook/cache/file-download/file--2146063402/filename.customextention

सैमसंग ईमेल ऐप -> content://com.samsung.android.email.attachmentprovider/1/1/RAW

जैसा कि वे देख सकते हैं कि वे सभी भिन्न हैं और आपकी वास्तविक फ़ाइल से संबंधित कुछ भी शामिल करने की गारंटी नहीं है। इस प्रकार, आप उस android:pathPatternतरह का उपयोग नहीं कर सकते हैं जैसा कि अधिकांश ने सुझाया है।

ईमेल अनुलग्नकों के लिए समाधान के आसपास एक काम

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>

    <category android:name="android.intent.category.BROWSABLE"/>
    <category android:name="android.intent.category.DEFAULT"/>

    <data android:scheme="content"/>
    <data android:host="*"/>

    <!--  Required for Gmail and Samsung Email App  -->
    <data android:mimeType="application/octet-stream"/>

    <!--  Required for Outlook  -->
    <data android:mimeType="application/my-custom-extension"/>
</intent-filter>

परीक्षण के माध्यम से मुझे MIME- प्रकार जो Gmail, आउटलुक, और सैमसंग ईमेल का उपयोग किया गया और उन लोगों को मेरे इरादे-फ़िल्टर में मिला।

चेतावनियां / Gotchas

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

  • मुझे <data android:mimeType="*/*"/>अपने इरादे को फ़िल्टर किए बिना फ़ाइल ब्राउज़र के माध्यम से अपना ऐप लॉन्च करने का कोई तरीका नहीं मिला । मैं इसका उपयोग नहीं कर सका क्योंकि यह तब अपना ऐप लॉन्च करता था जब भी उपयोगकर्ता अपने फोन पर किसी भी फ़ाइल को क्लिक करता था (न कि केवल कस्टम-फ़ाइल-एक्सटेंशन वाले)। मैं इसे आपके इरादे-फ़िल्टर में जोड़ने की अनुशंसा नहीं करूंगा।

अंतिम विचार

  • एंड्रॉइड में एक विशिष्ट एक्सटेंशन प्रकार के साथ अपने ऐप को जोड़ने के लिए वर्तमान में कोई सुरुचिपूर्ण समाधान नहीं है। यह सबसे अच्छा था जो मैं अपनी स्थिति में कर सकता था।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.