Android आशय फ़िल्टर: फ़ाइल एक्सटेंशन के साथ सहयोगी ऐप


92

मेरे पास एक कस्टम फ़ाइल प्रकार / एक्सटेंशन है जिसे मैं अपने ऐप के साथ जोड़ना चाहता हूं।

जहाँ तक मुझे पता है, डेटा तत्व इस उद्देश्य के लिए बनाया गया है, लेकिन मैं इसे काम नहीं कर सकता। http://developer.android.com/guide/topics/manifest/data-element.html डॉक्स और बहुत सारे फ़ोरम पोस्ट के अनुसार, इसे इस तरह काम करना चाहिए:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:mimeType="application/pdf" />
</intent-filter>

खैर, यह काम नहीं करता है। मैंने गलत क्या किया? मैं बस अपनी फ़ाइल प्रकार घोषित करना चाहता हूं।


Android जोड़ें: इरादे फ़िल्टर में लेबल = "@ string / app_name"
प्रशांत

जवाबों:


116

जिस स्थिति को आप संभालना चाहते हैं, उसे संबोधित करने के लिए आपको कई इरादों वाले फिल्टर की आवश्यकता है।

उदाहरण 1, mimetypes के बिना http अनुरोधों को संभालें:

  <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="http" />
    <data android:host="*" />
    <data android:pathPattern=".*\\.pdf" />
  </intent-filter>

Mimetypes के साथ संभाल, जहां प्रत्यय अप्रासंगिक है:

  <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="http" />
    <data android:host="*" />
    <data android:mimeType="application/pdf" />
  </intent-filter>

फ़ाइल ब्राउज़र ऐप से इरादे संभालें:

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

मुझे लगा कि मेजबान = "*" को छोड़ा जा सकता है, लेकिन यह बहुत व्यापक होना शुरू हो गया।
Phyrum Tea

@Phyrum चाय: क्या मेरे ऐप का उपयोग करके किसी अन्य फ़ाइल को OTHER ऐप में जोड़ने का कोई तरीका है? मेरा ऐप उन फ़ाइलों को उत्पन्न करता है, जिन्हें मैं Android को बताना चाहता हूं कि वे टेक्स्ट फाइलें हैं और उन्हें एक टेक्स्ट एडिटर के साथ खोलना है (मेरा ऐप टेक्स्ट एडिटर नहीं है)।
लुइस ए। फ्लोरिट

@ लुइस.फ्लोरिट क्या आपने अपनी फ़ाइलों को कॉल करने का प्रयास किया है * .txt? यह काम हो सकता है।
गवरील

कस्टम एक्सटेंशन MimeType के साथ काम नहीं कर रहा है। अगर मैं Gmail सूचना के रूप में / मेरा ऐप दिखा रहा हूं, तो मैं जीमेल नोटिफिकेशन पर भी क्लिक करता हूं।
मदन वी।

1
काम नहीं कर रहा हूँ .. मैं तंग आ गया हूँ अब पिछले 2 दिनों के काम से खोज रहा हूँ। im एंड्रॉइड 9 का उपयोग कर रहा है
अहमद अर्सलान

49

अन्य समाधानों ने मेरे लिए मज़बूती से काम नहीं किया जब तक कि मैंने जोड़ा:

android:mimeType="*/*" 

इससे पहले यह कुछ अनुप्रयोगों में काम करता था, कुछ में नहीं ...

मेरे लिए पूर्ण समाधान:

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

1
वाह! इससे मुझे मदद मिली। ऐसा लगता है कि Android प्रलेखन गलत है। सभी (योजना, मेजबान, पथ [पैटर्न], MIMETYPE) काम करने के लिए घोषित किया जाना है
Gavriel

यदि आप पूर्ण होना चाहते हैं तो आपके पास एक और दोनों के साथ एक नियम होना चाहिए mimeType। देखें डेवलपर
एंड्रयू सन

1
यदि आप जीमेल से अपना फ़ाइल ऐप खोलना चाहते हैं तो क्या होगा?
इगोरगानापोलस्की

31

Phyrum Tea और yuku द्वारा दिए गए उत्तर पहले से ही बहुत जानकारीपूर्ण हैं।

मैं इसे एंड्रॉइड 7.0 नौगट के साथ जोड़ना शुरू करना चाहता हूं एप्लिकेशन के बीच फ़ाइल साझा करने के तरीके में बदलाव होता है:

आधिकारिक एंड्रॉइड 7.0 से परिवर्तन :

एंड्रॉइड 7.0 को लक्षित करने वाले ऐप के लिए, एंड्रॉइड फ्रेमवर्क, स्ट्रिक्टमोड एपीआई नीति को लागू करता है जो आपके ऐप के बाहर फ़ाइल: // URIs को प्रतिबंधित करता है। यदि कोई फ़ाइल URI वाली कोई मंशा आपके ऐप को छोड़ देती है, तो ऐप एक FileUriExposedException अपवाद के साथ विफल हो जाता है।

अनुप्रयोगों के बीच फ़ाइलों को साझा करने के लिए, आपको एक सामग्री भेजनी चाहिए: // URI और URI पर एक अस्थायी पहुँच की अनुमति दें। इस अनुमति देने का सबसे आसान तरीका FileProvider वर्ग का उपयोग करना है। अनुमतियों और साझाकरण फ़ाइलों के बारे में अधिक जानकारी के लिए, फ़ाइलें साझा करना देखें।

यदि आपके पास एक विशिष्ट के बिना अपनी खुद की कस्टम फ़ाइल समाप्त हो रही है mime-type(या मुझे एक के साथ भी अनुमान है) तो आपको schemeअपने लिए दूसरा मूल्य जोड़ना पड़ सकता हैintent-filter इसके साथ काम करने के लिएFileProviders

उदाहरण:

<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: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:host="*" />
    <data android:pathPattern=".*\\.sfx" />
    <data android:pathPattern=".*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\.sfx" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.sfx" />
    <!-- keep going if you need more -->

</intent-filter>

यहाँ महत्वपूर्ण बात इसके अतिरिक्त है

<data android:scheme="content" />

फ़िल्टर करने के लिए।

मुझे इस थोड़े से बदलाव के बारे में पता करने में मुश्किल समय था जिसने अपनी गतिविधि को एंड्रॉइड 7.0 डिवाइस पर खोलने से रोक दिया, जबकि पुराने संस्करणों पर सब कुछ ठीक था। मुझे उम्मीद है कि यह किसी की मदद करता है।


इस टिप और अतिरिक्त जानकारी के बिना मैं फ़ाइल खोजकर्ताओं के साथ पंजीकरण करने के लिए अपना ऐप प्राप्त नहीं कर सका। यह महत्वपूर्ण है और इसे
उत्क्रमित

आपने एक दिन बचा लिया! बड़ा tnx। यह स्वीकार किया जाना चाहिए जवाब!
एंड्रीस

Scheme यदि आप सामग्री योजना के माध्यम से प्रदान की गई फ़ाइल को प्राप्त करने का प्रयास करते हैं, जैसे File(uri.path), तो यह दुर्घटनाग्रस्त हो No such file or directoryजाएगा - को Nougat + का समर्थन करने के लिए अद्यतन करते समय उस परिदृश्य को अलग तरीके से संभालना होगा!
जॉर्डन एच

19

मेरे निष्कर्ष:

फ़ाइल पुनर्प्राप्त करने के विभिन्न तरीकों से निपटने के लिए आपको कई फ़िल्टर की आवश्यकता होती है। यानी, gmail अटैचमेंट द्वारा, फाइल एक्सप्लोरर द्वारा, HTTP द्वारा, FTP द्वारा ... वे सभी बहुत अलग-अलग इंटेंस भेजते हैं।

और आपको अपनी गतिविधि कोड में अपनी गतिविधि को ट्रिगर करने वाले इरादे को फ़िल्टर करने की आवश्यकता है।

नीचे दिए गए उदाहरण के लिए, मैंने एक नकली फ़ाइल प्रकार new.mrz बनाया। और मैंने इसे gmail अटैचमेंट और फ़ाइल एक्सप्लोरर से पुनर्प्राप्त किया।

गतिविधि कोड onCreate में जोड़ा गया ():

        Intent intent = getIntent();
        String action = intent.getAction();

        if (action.compareTo(Intent.ACTION_VIEW) == 0) {
            String scheme = intent.getScheme();
            ContentResolver resolver = getContentResolver();

            if (scheme.compareTo(ContentResolver.SCHEME_CONTENT) == 0) {
                Uri uri = intent.getData();
                String name = getContentName(resolver, uri);

                Log.v("tag" , "Content intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo(ContentResolver.SCHEME_FILE) == 0) {
                Uri uri = intent.getData();
                String name = uri.getLastPathSegment();

                Log.v("tag" , "File intent detected: " + action + " : " + intent.getDataString() + " : " + intent.getType() + " : " + name);
                InputStream input = resolver.openInputStream(uri);
                String importfilepath = "/sdcard/My Documents/" + name; 
                InputStreamToFile(input, importfilepath);
            }
            else if (scheme.compareTo("http") == 0) {
                // TODO Import from HTTP!
            }
            else if (scheme.compareTo("ftp") == 0) {
                // TODO Import from FTP!
            }
        }

जीमेल अटैचमेंट फ़िल्टर:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="content" />
            <data android:mimeType="application/octet-stream" />
        </intent-filter>
  • लॉग: सामग्री आशय का पता चला: android.intent.action.VIEW: सामग्री: //gmail-ls/l.foul@gmail.com/messages/2950/attachments/0.1/BEST/false: एप्लिकेशन / ऑक्टेट-स्ट्रीम - नया। MRZ

फ़ाइल एक्सप्लोरर फ़िल्टर:

        <intent-filter android:label="@string/app_name">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>
  • लॉग: फ़ाइल आशय का पता चला: android.intent.action.VIEW: फ़ाइल: ///storage/sdcard0/My%20Documents/new.mrz: null: new.mrz

HTTP फ़िल्टर:

        <intent-filter android:label="@string/rbook_viewer">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="http" />
            <data android:pathPattern=".*\\.mrz" />
        </intent-filter>

ऊपर इस्तेमाल किए गए निजी कार्य:

private String getContentName(ContentResolver resolver, Uri uri){
    Cursor cursor = resolver.query(uri, null, null, null, null);
    cursor.moveToFirst();
    int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
    if (nameIndex >= 0) {
        return cursor.getString(nameIndex);
    } else {
        return null;
    }
}

private void InputStreamToFile(InputStream in, String file) {
    try {
        OutputStream out = new FileOutputStream(new File(file));

        int size = 0;
        byte[] buffer = new byte[1024];

        while ((size = in.read(buffer)) != -1) {
            out.write(buffer, 0, size);
        }

        out.close();
    }
    catch (Exception e) {
        Log.e("MainActivity", "InputStreamToFile exception: " + e.getMessage());
    }
}

क्या गतिविधि को लॉन्चर या मुख्य प्रकार होना चाहिए? क्योंकि मैंने gmail अटैचमेंट फ़िल्टर की कोशिश की है और यह काम नहीं कर रहा है।
अमित

15

pathPattern

<data android:pathPattern=".*\\.pdf" />

फ़ाइल पथ में ".pdf" से पहले एक या अधिक डॉट्स होने पर काम नहीं करता है।

यह काम करेगा:

<data android:pathPattern=".*\\.pdf" />
<data android:pathPattern=".*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\.pdf" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />

यदि आप अधिक डॉट्स का समर्थन करना चाहते हैं तो और जोड़ें।


1
अब तक उप फ़ोल्डर में जाने के लिए यह एकमात्र विकल्प है
लोकीडायराइड

मैं उसी कोड का उपयोग कर रहा हूं, लेकिन IDE मुझे एक चेतावनी देता है, इस प्रश्न को देखें stackoverflow.com/questions/35833776/…
AndreaF

5

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

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

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

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

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


5

मार्कस Ressel सही है। Android 7.0 नूगट अब एक फ़ाइल URI का उपयोग करके ऐप्स के बीच फ़ाइल साझा करने की अनुमति नहीं देता है। एक सामग्री URI का उपयोग किया जाना चाहिए। हालाँकि, एक सामग्री URI फ़ाइल पथ को साझा करने की अनुमति नहीं देती है, केवल एक माइम प्रकार है। इसलिए आप अपने ऐप को अपनी फ़ाइल एक्सटेंशन के साथ जोड़ने के लिए एक सामग्री URI का उपयोग नहीं कर सकते।

एंड्रॉइड 7.0 पर ड्रोबपॉक्स का एक दिलचस्प व्यवहार है। जब यह एक अज्ञात फ़ाइल एक्सटेंशन को पूरा करता है तो यह एक फ़ाइल URI इरादे के रूप में प्रकट होता है, लेकिन इरादे को लॉन्च करने के बजाय यह ऑपरेटिंग सिस्टम को यह पता लगाने के लिए कहता है कि कौन से एप्लिकेशन इरादे को स्वीकार कर सकते हैं। यदि केवल एक ऐप है जो उस फ़ाइल को URI स्वीकार कर सकता है तो वह उस ऐप पर सीधे एक स्पष्ट सामग्री URI भेजता है। तो ड्रॉपबॉक्स के साथ काम करने के लिए आपको अपने ऐप पर इरादों के फिल्टर को बदलने की आवश्यकता नहीं है। इसके लिए कंटेंट URI इंट्रस्ट फिल्टर की जरूरत नहीं है। बस यह सुनिश्चित करें कि ऐप एक कंटेंट URI प्राप्त कर सकता है और आपका खुद का फाइल एक्सटेंशन वाला ऐप ड्रॉपबॉक्स के साथ उसी तरह काम करेगा जैसा कि एंड्रॉइड 7.0 से पहले किया था।

यहाँ एक सामग्री को स्वीकार करने के लिए संशोधित मेरी फ़ाइल लोडिंग कोड का एक उदाहरण है:

Uri uri = getIntent().getData();
if (uri != null) {
    File myFile = null;
    String scheme = uri.getScheme();
    if (scheme.equals("file")) {
        String fileName = uri.getEncodedPath();
        myFile = new File(filename);
    }
    else if (!scheme.equals("content")) {
        //error
        return;
    }
    try {
        InputStream inStream;
        if (myFile != null) inStream = new FileInputStream(myFile);
        else inStream = getContentResolver().openInputStream(uri);
        InputStreamReader rdr = new InputStreamReader(inStream);
        ...
    }
}

2

आप यह कोशिश करते हैं कि यह आपके लिए मदद करेगा। पीडीएफ के अंदर आप अन्य एक्सटेंशन का भी उपयोग कर सकते हैं। सबसे पहले आपको androidmanifest.xml फ़ाइल में रीड एक्सटर्नल स्टोरेज अनुमति को जोड़ना होगा

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

फिर गतिविधि टैग में Androidmanifest फ़ाइल में, आप नीचे दिखाए गए अनुसार एक आशय-फ़िल्टर जोड़ते हैं।

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

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

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

            <data android:mimeType= "application/pdf" />

            <data android:host="*" />

        </intent-filter>

अंत में आपके कोड में, आपको पीडीएफ फाइल का रास्ता मिलता है जैसा कि नीचे दिखाया गया है:

Intent intent=getIntent();

if(intent!=null) {          

        String action=intent.getAction();

        String type=intent.getType();

        if(Intent.ACTION_VIEW.equals(action) && type.endsWith("pdf")) {

            // Get the file from the intent object

            Uri file_uri=intent.getData();

            if(file_uri!=null)

                filepath=file_uri.getPath();

            else

                filepath="No file";

        }

        else if(Intent.ACTION_SEND.equals(action) && type.endsWith("pdf")){

            Uri uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);

            filepath = uri.getPath();

        }

इस Intent.ACTION_VIEW के लिए, फ़ाइल पथ को हथियाने में असमर्थ यह त्रुटि का कारण बनता है: java.io.FileNotFoundException: अनुमति से इनकार किया। केवल कुछ विशिष्ट अनुप्रयोगों से ही, हर बार नहीं। कोई समाधान?
हार्दिक जोशी

@HardikJoshi ऐप्स शायद GRANT_READ_URI_PERMISSION की अनुमति नहीं दे रहे हैं।
मीरा_कॉल

1

जोड़ने का प्रयास करें

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

अब जब फैक्ट्री सेट फ़ाइल प्रकारों जैसे कि एप्लीकेशन / पीडीएफ़ के साथ काम करती है, तो मैं अपनी फ़ाइल प्रकार कैसे घोषित करूँगा? और जब मैं फ़ाइल प्रकार कहता हूं, मेरा मतलब है mimeType;)
तामस

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

ब्राउज़र, मेल क्लाइंट, फ़ाइल मैनेजर, या कहीं से भी हो सकता है .. या मेरा अपना ऐप ofc :) फ़ाइल एक्सटेंशन कस्टम, क्लाइंट द्वारा निर्दिष्ट है।
तामस

खैर, मैं अभी भी फंस गया हूं ... क्या कोई कृपया मदद कर सकता है?
तामस

@ तमस ने तुम्हें हर तरह से छाँटा है। मैं इस पर अड़ा हुआ हूं!
स्टुइरलिंग

1

Gmail अनुलग्नक के लिए, आप इसका उपयोग कर सकते हैं:

<intent-filter android:label="@string/app_name">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="content" />
  <data android:mimeType="application/pdf" /> <!-- .pdf -->
  <data android:mimeType="application/msword" /> <!-- .doc / .dot -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <!-- .docx -->
  <data android:mimeType="application/vnd.ms-excel" />  <!-- .xls / .xlt / .xla -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />  <!-- .xlsx -->
  <data android:mimeType="application/vnd.ms-powerpoint" />  <!-- .ppt / .pps / .pot / .ppa -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <!-- .pptx -->
  <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" /> <!-- .ppsx -->
  <data android:mimeType="application/zip" /> <!-- .zip -->
  <data android:mimeType="image/jpeg" /> <!-- .jpeg -->
  <data android:mimeType="image/png" /> <!-- .png -->
  <data android:mimeType="image/gif" /> <!-- .gif -->
  <data android:mimeType="text/plain" /> <!-- .txt / .text / .log / .c / .c++ / ... -->

आवश्यकतानुसार कई माइम टाइप करें। मुझे केवल अपने प्रोजेक्ट के लिए उन की जरूरत है।


1
         <!--
            Works for Files, Drive and DropBox
        -->
        <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:host="*" />
            <data android:pathPattern=".*\\.teamz" />
        </intent-filter>

        <!--
            Works for Gmail
        -->
        <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:host="gmail-ls" android:scheme="content" android:mimeType="application/octet-stream"/>
        </intent-filter>

ध्यान दें कि यह आपके ऐप को सभी जीमेल फ़ाइल अटैचमेंट को खोल देगा, इसके आसपास काम करने का कोई तरीका नहीं है


यह उपयोगकर्ता को ईमेल की जाने वाली हर एक फ़ाइल को संभालता है
IgGanapolsky

1

जिनके पास @yuku और @ phyrum-tea के रूप में अन्य फ़ाइल प्रबंधक \ Explorer एप्लिकेशन के साथ समस्या है

यह एलजी डिफ़ॉल्ट फ़ाइल प्रबंधक ऐप के साथ काम करता है

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>

लेकिन ES फ़ाइल एक्सप्लोरर और अन्य फ़ाइल प्रबंधकों के साथ काम नहीं कर सका इसलिए मैंने जोड़ा

 android:mimeType="*/*"

तो यह ES एक्सप्लोरर के साथ काम करता है लेकिन एलजी फ़ाइल प्रबंधक फ़ाइल प्रकार का पता नहीं लगा सका इसलिए मेरा समाधान है

     <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>
        <intent-filter android:label="@string/app_name_decrypt">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="file"/>
            <data android:scheme="content" />
            <data android:mimeType="*/*" />
            <data android:pathPattern=".*\\.lock" />
            <data android:pathPattern=".*\\..*\\.lock" />
            <data android:pathPattern=".*\\..*\\..*\\.lock" />
        </intent-filter>

1

सामग्री URI ftw, और मैनिफ़ेस्ट में आशय फ़िल्टर के साथ ... यदि आपकी फ़ाइलों का कस्टम एक्सटेंशन .xyz है, तो मेल खाता समय जोड़ें:

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

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

            <data
                android:host="*"
                android:mimeType="application/xyz"
                android:scheme="content" />
        </intent-filter>

ईमेल जैसे कुछ ऐप एक्सटेंशन को माइम प्रकार में परिवर्तित करते हैं। अब मैं ईमेल में अटैचमेंट पर क्लिक कर सकता हूं और इसे मेरे ऐप में खोल सकता हूं।


1

कोटलिन में फ़ाइल खोलना पढ़ें:

private fun checkFileOpening(intent: Intent) {
    if (intent.action == Intent.ACTION_VIEW && (intent.scheme == ContentResolver.SCHEME_FILE
                    || intent.scheme == ContentResolver.SCHEME_CONTENT)) {

        val text = intent.data?.let {
            contentResolver.openInputStream(it)?.bufferedReader()?.use(BufferedReader::readText) 
        }
    }
}

-1

एक्टिविटी टैग के अंदर इस आशय के फिल्टर को प्रकट करें जिसे आप फ़ाइल को छूना चाहते हैं:

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

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

    <data android:host="*" />
    <data android:mimeType="application/octet-stream" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\.yourextension" />
    <data android:scheme="content" />
</intent-filter>

-1

// मैंने इस कोड की कोशिश की है। और यह अच्छी तरह से काम कर रहा है। आप पीडीएफ फाइल को स्वीकार करने के लिए इस कोड का उपयोग कर सकते हैं।

<intent-filter>
   <action android:name="android.intent.action.SEND" />
   <category android:name="android.intent.category.DEFAULT" />
   <data android:mimeType="application/pdf" />
   <data android:pathPattern=".*\\.pdf" />
   <data android:pathPattern=".*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\.pdf" />
   <data android:pathPattern=".*\\..*\\..*\\..*\\.pdf" />
</intent-filter>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.