ตัวกรองเจตนาของ Android: เชื่อมโยงแอปกับนามสกุลไฟล์


93

ฉันมีประเภทไฟล์ / นามสกุลที่กำหนดเองที่ต้องการเชื่อมโยงกับแอปของฉัน

เท่าที่ฉันรู้องค์ประกอบข้อมูลถูกสร้างขึ้นเพื่อจุดประสงค์นี้ แต่ฉันไม่สามารถใช้งานได้ 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: label = "@ string / app_name" ในตัวกรองความตั้งใจ
Prashant

คำตอบ:


117

คุณต้องมีตัวกรองความตั้งใจหลายรายการเพื่อจัดการกับสถานการณ์ต่างๆที่คุณต้องการจัดการ

ตัวอย่างที่ 1 จัดการคำขอ 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

1
@Phyrum Tea: มีวิธีใดในการเชื่อมโยงนามสกุลไฟล์กับแอปอื่นโดยใช้แอปของฉัน แอพของฉันสร้างไฟล์. list ที่ฉันต้องการบอก android ว่าเป็นไฟล์ข้อความและเปิดด้วยโปรแกรมแก้ไขข้อความ (แอพของฉันไม่ใช่โปรแกรมแก้ไขข้อความ)
Luis A. Florit

@ LuisA.Florit คุณพยายามโทรหาไฟล์ของคุณ * .txt หรือไม่? มันอาจได้ผล
Gavriel

ส่วนขยายที่กำหนดเองไม่ทำงานกับ MimeType หากฉันให้ mimetype เป็น/แอปของฉันแสดงเมื่อฉันคลิกการแจ้งเตือนของ Gmail ด้วย
madan V

1
ไม่ทำงาน .. ตอนนี้ฉันกำลังเบื่อการค้นหาจาก 2 วันที่ผ่านมาไม่ได้ผล ฉันใช้ Android 9
Ahmad Arslan

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และกฎหนึ่งโดยไม่ต้องการให้สมบูรณ์ ดูdeveloper.android.com/guide/components/…
Andrew อา.

1
ถ้าคุณต้องการเปิดแอปไฟล์จาก Gmail ล่ะ
IgorGanapolsky

32

คำตอบที่ได้รับจากPhyrum Teaและyukuนั้นเป็นข้อมูลที่ดีอยู่แล้ว

ฉันต้องการเพิ่มที่เริ่มต้นด้วยAndroid 7.0 Nougatมีการเปลี่ยนแปลงวิธีจัดการการแชร์ไฟล์ระหว่างแอพ:

จากการเปลี่ยนแปลงอย่างเป็นทางการของAndroid 7.0 :

สำหรับแอปที่กำหนดเป้าหมาย Android 7.0 เฟรมเวิร์กของ Android จะบังคับใช้นโยบาย StrictMode API ที่ห้ามไม่ให้เปิดเผยไฟล์: // URI ภายนอกแอปของคุณ หากเจตนาที่มีไฟล์ 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" />

ไปยังตัวกรอง

ฉันมีช่วงเวลาที่ยากลำบากในการค้นหาเกี่ยวกับการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ นี้ซึ่งทำให้กิจกรรมของฉันไม่สามารถเปิดได้บนอุปกรณ์ Android 7.0 ในขณะที่ทุกอย่างทำได้ดีในเวอร์ชันเก่า ฉันหวังว่ามันจะช่วยใครสักคน


หากไม่มีเคล็ดลับและข้อมูลเพิ่มเติมฉันไม่สามารถให้แอปลงทะเบียนกับนักสำรวจไฟล์ได้ นี่เป็นสิ่งสำคัญและควรได้รับการโหวต
u2tall

คุณประหยัดได้หนึ่งวัน! tnx ขนาดใหญ่ คำตอบนี้ควรได้รับการยอมรับ!
Andris

⚠️หากคุณพยายามรับไฟล์ที่ให้มาผ่านโครงร่างเนื้อหาเช่นFile(uri.path)มันจะขัดข้องเนื่องจากNo such file or directory- จะต้องจัดการสถานการณ์นั้นแตกต่างออกไปเมื่ออัปเดตเพื่อรองรับ Nougat +!
Jordan H

20

การค้นพบของฉัน:

คุณต้องมีตัวกรองหลายตัวเพื่อจัดการกับวิธีต่างๆในการดึงไฟล์ กล่าวคือโดยไฟล์แนบของ gmail โดย file explorer โดย HTTP โดย FTP ... พวกเขาทั้งหมดส่ง Intent ที่แตกต่างกันมาก

และคุณต้องกรองจุดประสงค์ที่ทำให้เกิดกิจกรรมของคุณในรหัสกิจกรรมของคุณ

สำหรับตัวอย่างด้านล่างฉันสร้างไฟล์ปลอมประเภท new.mrz และฉันดึงมันมาจากไฟล์แนบของ Gmail และ file explorer

เพิ่มรหัสกิจกรรมใน 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!
            }
        }

ตัวกรองไฟล์แนบของ 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/octet-stream" />
        </intent-filter>
  • บันทึก: ตรวจพบเจตนาของเนื้อหา: android.intent.action.VIEW: content: //gmail-ls/l.foul@gmail.com/messages/2950/attachments/0.1/BEST/false: application / octet-stream: new mrz

ตัวกรอง File explorer:

        <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: file: ///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 แล้วมันไม่ทำงาน
Amit

15

pathPattern

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

จะไม่ทำงานหากเส้นทางของไฟล์มีจุดอย่างน้อยหนึ่งจุดก่อน ".pdf"

สิ่งนี้จะได้ผล:

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

เพิ่มมากขึ้นหากคุณต้องการรองรับจุดเพิ่มเติม


1
ณ ตอนนี้นี่เป็นทางเลือกเดียวสำหรับการเข้าสู่โฟลเดอร์ย่อย
LokiDroid

ฉันใช้รหัสเดียวกัน แต่ IDE ให้คำเตือนดูคำถามนี้stackoverflow.com/questions/35833776/…
AndreaF

5

ฉันพยายามทำให้สิ่งนี้ใช้งานได้มานานแล้วและได้ลองใช้วิธีแก้ปัญหาที่แนะนำทั้งหมดโดยพื้นฐานแล้วและยังไม่สามารถให้ Android จดจำนามสกุลไฟล์เฉพาะได้ ฉันมีตัวกรองความตั้งใจด้วย"*/*"mimetype ซึ่งเป็นสิ่งเดียวที่ดูเหมือนว่าจะใช้งานได้และตอนนี้เบราว์เซอร์ไฟล์แสดงรายการแอปของฉันเป็นตัวเลือกสำหรับการเปิดไฟล์อย่างไรก็ตามแอปของฉันแสดงเป็นตัวเลือกสำหรับการเปิดไฟล์ประเภทใดก็ได้แม้ว่า ฉันได้ระบุนามสกุลไฟล์โดยใช้แท็ก pathPattern สิ่งนี้ไปได้ไกลถึงแม้ในขณะที่ฉันพยายามดู / แก้ไขผู้ติดต่อในรายชื่อผู้ติดต่อของฉัน Android ถามฉันว่าฉันต้องการใช้แอพของฉันเพื่อดูผู้ติดต่อหรือไม่และนั่นเป็นเพียงหนึ่งในหลาย ๆ สถานการณ์ที่เกิดเหตุการณ์นี้ขึ้นซึ่งน่ารำคาญมาก

ในที่สุดฉันก็พบว่ากลุ่ม Google นี้โพสต์พร้อมคำถามที่คล้ายกันซึ่งวิศวกรกรอบงาน Android ตอบกลับ เธออธิบายว่า Android ไม่รู้อะไรเลยเกี่ยวกับนามสกุลไฟล์มีเพียงประเภท MIME เท่านั้น ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 )

ดังนั้นจากสิ่งที่ฉันได้เห็นลองและอ่าน Android ไม่สามารถแยกความแตกต่างระหว่างนามสกุลไฟล์และแท็ก pathPattern ได้โดยพื้นฐานแล้วเป็นการเสียเวลาและพลังงานอย่างมาก หากคุณโชคดีพอที่จะต้องการเฉพาะไฟล์ประเภทละครใบ้บางประเภท (เช่นข้อความวิดีโอหรือเสียง) คุณสามารถใช้ตัวกรองความตั้งใจกับประเภทละครใบ้ หากคุณต้องการนามสกุลไฟล์เฉพาะหรือประเภทละครใบ้ที่ Android ไม่รู้จักอย่างไรก็ตามคุณก็โชคไม่ดี

หากฉันผิดเกี่ยวกับสิ่งนี้โปรดบอกฉันจนถึงตอนนี้ฉันได้อ่านทุกโพสต์และลองวิธีแก้ปัญหาที่เสนอทั้งหมดที่ฉันพบ แต่ไม่มีใครได้ผล

ฉันสามารถเขียนอีกหนึ่งหน้าหรือสองหน้าเกี่ยวกับความธรรมดาของสิ่งเหล่านี้ใน Android และประสบการณ์ของนักพัฒนาซอฟต์แวร์ที่แย่ลง แต่ฉันจะช่วยคุณไม่ให้โกรธ;) หวังว่าฉันจะช่วยใครบางคนได้


5

Markus Ressel ถูกต้อง Android 7.0 Nougat ไม่อนุญาตให้แชร์ไฟล์ระหว่างแอพโดยใช้ไฟล์ URI อีกต่อไป ต้องใช้ URI เนื้อหา อย่างไรก็ตาม URI เนื้อหาไม่อนุญาตให้แชร์พา ธ ไฟล์เฉพาะประเภท mime เท่านั้น ดังนั้นคุณจึงไม่สามารถใช้ URI เนื้อหาเพื่อเชื่อมโยงแอปของคุณกับนามสกุลไฟล์ของคุณเอง

Drobpox มีพฤติกรรมที่น่าสนใจใน Android 7.0 เมื่อตรงตามนามสกุลไฟล์ที่ไม่รู้จักดูเหมือนว่าจะสร้างเจตนา URI ของไฟล์ แต่แทนที่จะเรียกใช้เจตนามันจะเรียกระบบปฏิบัติการเพื่อค้นหาว่าแอปใดสามารถยอมรับเจตนาได้ หากมีเพียงแอปเดียวที่สามารถยอมรับ URI ไฟล์นั้นได้ระบบจะส่ง URI เนื้อหาที่โจ่งแจ้งไปยังแอปนั้นโดยตรง ดังนั้นในการทำงานกับ Dropbox คุณไม่จำเป็นต้องเปลี่ยนตัวกรองเจตนาในแอปของคุณ ไม่ต้องการตัวกรองเจตนา URI ของเนื้อหา ตรวจสอบให้แน่ใจว่าแอปสามารถรับ URI เนื้อหาได้และแอปของคุณที่มีนามสกุลไฟล์ของคุณเองก็จะทำงานร่วมกับ Dropbox ได้เช่นเดียวกับที่เคยเป็นมาก่อน Android 7.0

นี่คือตัวอย่างโค้ดโหลดไฟล์ของฉันที่แก้ไขเพื่อยอมรับ URI เนื้อหา:

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

คุณลองสิ่งนี้จะช่วยคุณได้แทนที่จะใช้ pdf คุณสามารถใช้ส่วนขยายอื่น ๆ ได้เช่นกัน ก่อนอื่นคุณต้องเพิ่มสิทธิ์ในการอ่านที่เก็บข้อมูลภายนอกในไฟล์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>

สุดท้ายในรหัสของคุณคุณจะได้รับเส้นทางของไฟล์ pdf ดังที่แสดงด้านล่าง:

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: Permission ถูกปฏิเสธ จากแอปพลิเคชั่นเฉพาะบางตัวไม่ใช่ทุกครั้ง วิธีแก้ปัญหาใด ๆ
Hardik Joshi

@HardikJoshi แอปอาจไม่ได้ตั้งค่าการอนุญาต GRANT_READ_URI_PERMISSION
Mira_Cole

1

ลองเพิ่ม

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

ตอนนี้ใช้งานได้กับประเภทไฟล์ที่ตั้งค่าจากโรงงานเช่น application / pdf แล้วฉันจะประกาศประเภทไฟล์ของตัวเองได้อย่างไร และเมื่อฉันพูดประเภทไฟล์ฉันหมายถึง mimeType;)
Tamas

คุณต้องการให้ mimetype นี้จับไฟล์ประเภทใด นอกจากนี้ไฟล์นี้เปิดจากเบราว์เซอร์หรือตัวจัดการไฟล์หรือส่งมาจากแอปพลิเคชันอื่นที่คุณสร้างขึ้น?
magaio

อาจมาจากเบราว์เซอร์ไคลเอนต์เมลตัวจัดการไฟล์หรือที่ใดก็ได้ .. หรือนามสกุลไฟล์แอป ofc :) ของฉันเองเป็นแบบกำหนดเองที่ไคลเอนต์ระบุ
Tamas

ฉันยังติดอยู่ ... มีใครช่วยได้ไหม
Tamas

@Tamas คุณทุกคนได้รับการจัดเรียงนี้ ฉันติดอยู่!
StuStirling

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>

สังเกตว่าสิ่งนี้จะทำให้แอปของคุณเปิดไฟล์แนบของ gmail ทั้งหมดไม่มีวิธีแก้ไข


สิ่งนี้จะจัดการทุกไฟล์ที่ส่งถึงผู้ใช้ทางอีเมลไม่ใช่แค่. teamz
IgorGanapolsky

1

ผู้ที่มีปัญหากับแอป File Manager \ Explorer อื่น ๆ ตามที่ @yuku และ @ phyrum-tea ตอบ

ใช้งานได้กับแอปจัดการไฟล์เริ่มต้นของ LG

     <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 File Explorer และตัวจัดการไฟล์อื่น ๆ ได้ดังนั้นฉันจึงเพิ่ม

 android:mimeType="*/*"

จากนั้นใช้งานได้กับ ES Explorer แต่ตัวจัดการไฟล์ LG ไม่สามารถตรวจพบประเภทไฟล์ได้ดังนั้นทางออกของฉันคือ

     <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

อ่านเปิดไฟล์ใน kotlin:

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

ใส่ตัวกรองความตั้งใจนี้ไว้ในแท็กกิจกรรมในไฟล์ Manifest ที่คุณต้องการเปิดโดยแตะไฟล์:

<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

// ฉันลองใช้รหัสนี้แล้ว และทำงานได้ดี คุณสามารถใช้รหัสนี้เพื่อยอมรับไฟล์ pdf

<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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.