2012-03-01 19 views
8

पर सबकुछ के लिए एक चयनकर्ता का हिस्सा नहीं बनाता है, मैंने कस्टम फ़ाइल एक्सटेंशन के लिए एक इरादा फ़िल्टर बनाने के बारे में यहां कई उत्तरों को देखा है, लेकिन उनमें से कोई भी प्रतीत नहीं होता है मेरे प्रश्न का उत्तर देने के लिए:एंड्रॉइड कस्टम फ़ाइल एक्सटेंशन के लिए इरादा फ़िल्टर कैसे बनाएं, जो इसे

मेरे पास एक इरादा फ़िल्टर है जो अभी काम करता है ... जब मैं अपनी फ़ाइल ब्राउज़ करता हूं या जब मैं इसे ईमेल संलग्नक से खोलता हूं, तो मेरा ऐप सूची में दिखाई देगा। फ़ाइल में स्वयं "tgtp" का कस्टम एक्सटेंशन है, लेकिन यह मूल रूप से केवल एक XML फ़ाइल है।

मेरी समस्या यह है कि हालांकि यह इरादा फ़िल्टर काम करता है, यह मेरे फोन पर हर प्रकार की फाइल के लिए हर ऐपोजर में अपना ऐप जोड़ना प्रतीत होता है। एक उदाहरण होगा यदि मैं अपने संपर्क ऐप डिफ़ॉल्ट को साफ़ करता हूं और अपने संपर्कों में से किसी एक पर क्लिक करता हूं, तो यह कहता है कि मेरा ऐप इसे खोल सकता है।

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

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

अग्रिम धन्यवाद

उत्तर

14

एक ही रास्ता हल करने के लिए इस समस्या को अपने इरादे को scheme और host विशेषताओं को जोड़ने है:

यहाँ मेरे वर्तमान इरादे फिल्टर सब कुछ खोलने के लिए मेरे एप्लिकेशन का उपयोग करता है फिल्टर:

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

दस्तावेज में वजह से है कि कहते हैं android:pathPattern ही काम करता है कि अगर एक योजना है और होस्ट परिभाषित किया गया। http://developer.android.com/guide/topics/manifest/data-element.html

उम्मीद है कि यह मदद करता है।

+1

और निश्चित रूप से यह कुछ है जो मैंने कई बार पढ़ा है लेकिन अभी भी ऐसा करने में असफल रहा ... यह एक आकर्षण की तरह काम करता था। मुझे लगता है कि इस तरह के दर्जनों सवालों के दर्जनों अलग-अलग उत्तरों के कारण मैं उलझन में था। सरल और अच्छी तरह से प्रलेखित नीलामी को इंगित करने के लिए धन्यवाद :) – Nick

+0

यह आपके लिए काम करता है? मेरे पास बिल्कुल वही परिस्थितियां हैं और ऊपर बताई गई समस्या के रूप में जरूरत है। जब मेरे इरादे फ़िल्टर में योजना है, mimeType, और मेजबान जैसा कि इस उत्तर में दिखाया गया है- यह किसी भी परिदृश्य के लिए बिल्कुल काम नहीं करता है। अगर मैं आपके उत्तर से माइम टाइप टाइप करता हूं, तो समाधान फ़ाइल एक्सप्लोरर में खोले गए फ़ाइलों के लिए काम करता है। मुझे अभी भी ईमेल में अनुलग्नक के रूप में इन प्रकार की फ़ाइलों को खोलने में सक्षम होना चाहिए। क्या यह उत्तर सामान्यीकृत था और मुझे वास्तव में कुछ माइम टाइप और होस्ट प्रदान करने की ज़रूरत है, या मुझे दिखाया गया था कि क्या दिखाया गया है (क्योंकि यह काम नहीं करता) – gauglerb

+0

वास्तव में यह एक अच्छा जवाब है। मैं पिछले 2 दिनों के बारे में खोज रहा था लेकिन बहुत उत्तर हैं और उनमें से अधिकतर काम नहीं कर रहे हैं और बहुत जटिल हैं, लेकिन आपने इसे कुछ पंक्तियों में परिभाषित किया है। अब मैं अपने ऐप को .mp3 फ़ाइल के लिए एक डिफ़ॉल्ट ऐप बनाना चाहता हूं, इसलिए जब उपयोगकर्ता एमपी 3 फ़ाइल पर क्लिक करता है तो मेरा ऐप खोलना चाहिए और उस फाइल को चलाएं..यह संभव है ?? –

3

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

PatternMatcher IntentFilter पर pathPattern के लिए प्रयोग किया जाता है लेकिन, PatternMatcher एल्गोरिथ्म मेरे लिए काफी अजीब है। Android PatternMatcher के एल्गोरिदम यहां है।

यदि वहाँ की 'अगले वर्ण' '। *' स्ट्रिंग के मध्य, PatternMatcher उस बिंदु पर पाश बंद हो जाता है में पैटर्न। ( एंड्रॉइड फ्रेमवर्क के PatternMatcher.java देखें।)

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

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

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

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

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

+0

रुचि रखने वाले किसी भी व्यक्ति के लिए, [code.google.com] पर एक समस्या लॉग ऑन की गई है (https: // code.google.com/p/android/issues/detail?id=69080) –

+0

आप चार "। * एम" पर क्यों रुकते हैं? मुझे महत्व समझ में नहीं आता है। क्या यह आपको "संदेश" पैटर्न से पहले चार मीटर तक सीमित करता है? – JoshNaro

+1

@ जोश्नारो हाय, जोश। मैं चार "। * एम" पर रुक गया क्योंकि मुझे अब और टाइप करने की तरह महसूस नहीं हुआ। =) मैंने उस रेखा के नीचे इलिप्स को यह इंगित करने का प्रयास करने के लिए रखा है कि आप उस पैटर्न के साथ जितना चाहें उतना सटीकता के लिए जारी रखेंगे। यदि आप चार "। * एम" पर रुकना चाहते थे, तो आप वास्तव में संदेश पैटर्न से पहले चार "एम" तक सीमित रहेंगे। यह निश्चित रूप से एक सुंदर समाधान नहीं है, लेकिन यह PatternMatcher की विफलता द्वारा प्रस्तुत की गई सीमा के लिए एकमात्र काम है जिसे मैंने अब तक पाया है। –

-1

मुझे एक ही समस्या है, और मेरे मामले में, दोनों अन्य उत्तर काम नहीं करते हैं। निकटतम मैं आया है जब मैं, इसलिए इस तरह दोनों बेंजामिन और sabadow के जवाब गठबंधन, -और- विस्तार में डॉट बाहर छोड़: (i अपने कस्टम उपयोग कर रहा हूँ ".trk" विस्तार)

 <!-- For opening/viewing only trk-files: (works in google drive and "File Manager", not gmail) --> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <action android:name="android.intent.action.SEND" /> 
      <action android:name="android.intent.action.SEND_MULTIPLE" /> 
      <action android:name="android.intent.action.SENDTO" /> 

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

      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*trk" android:host="*" /> 
      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*trk" android:host="*" /> 
      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*trk" android:host="*" /> 
      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*trk" android:host="*" /> 
      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*trk" android:host="*" /> 
      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*t.*trk" android:host="*" /> 
      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*t.*t.*trk" android:host="*" /> 
      <data android:scheme="file" android:mimeType="*/*" android:pathPattern=".*t.*t.*t.*t.*t.*t.*t.*trk" android:host="*" /> 
     </intent-filter>   
     <!-- For catching attachments in Gmail: (also triggers non-trk-files that aren't associated with some other app, but not non-trk-files that already have one of more associations, strangely) --> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <action android:name="android.intent.action.SEND" /> 
      <action android:name="android.intent.action.SEND_MULTIPLE" /> 
      <action android:name="android.intent.action.SENDTO" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:mimeType="*/*" android:scheme="content" /> 
     </intent-filter> 
     <!-- For catching share actions from apps: (also triggered by sharing actions for all other file types) --> 
     <intent-filter> 
      <action android:name="android.intent.action.SEND" /> 
      <category android:name="android.intent.category.DEFAULT" /> 

      <data android:mimeType="application/*" /> 
     </intent-filter> 

यह है थोड़ी देर तक, लेकिन आपको सैंडो और एस END_MULTIPLE क्रियाओं की तरह सभी लाइनों की आवश्यकता नहीं हो सकती है। मुझे बस उन सभी मामलों में काम करने की ज़रूरत है जहां यह काम कर सकता है। अफसोस की बात है कि यह कुछ मामलों में भी ट्रिगर करता है, लेकिन सभी मामलों में नहीं।