Filter maksud Android untuk ekstensi file tertentu?

93

Saya ingin dapat mengunduh file dengan ekstensi tertentu dari 'net, dan mengirimkannya ke aplikasi saya untuk menanganinya, tetapi saya belum dapat menemukan filter maksud. Jenis file tidak termasuk dalam mimetype, dan saya mencoba menggunakan

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

tapi aku tidak bisa membuatnya bekerja.

Curyous
sumber

Jawaban:

120

Berikut adalah cara saya mendefinisikan aktivitas saya di AndroidManifest.xml saya untuk membuatnya berfungsi.

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

The schemeof filemenunjukkan bahwa ini harus terjadi ketika file lokal dibuka (bukan protokol seperti HTTP).

mimeTypedapat diatur */*agar cocok dengan semua jenis pantomim.

pathPatternadalah tempat Anda menentukan ekstensi apa yang ingin Anda cocokkan (dalam contoh ini .kdb). The .*di awal cocok dengan sembarang pangkat karakter. String ini membutuhkan pelolosan ganda, jadi \\\\.cocok dengan periode literal. Kemudian, Anda mengakhiri dengan ekstensi file Anda. Satu peringatan dengan pathPattern adalah bahwa .*ini bukan pertandingan serakah seperti yang Anda harapkan jika ini adalah ekspresi reguler. Pola ini akan gagal untuk mencocokkan jalur yang berisi .sebelum .kdb. Untuk pembahasan lebih rinci tentang masalah ini dan solusinya, lihat di sini

Terakhir, menurut dokumentasi Android, atribut hostdan keduanya schemediperlukan agar pathPatternatribut berfungsi, jadi setel saja ke karakter pengganti untuk mencocokkan apa pun.

Sekarang, jika Anda memilih .kdbfile di aplikasi seperti Linda File Manager, aplikasi saya muncul sebagai opsi. Saya harus mencatat bahwa ini saja tidak memungkinkan Anda untuk mendownload jenis file ini di browser, karena ini hanya mendaftar dengan skema file. Memiliki aplikasi seperti Linda File Manager di ponsel Anda menolak secara umum memungkinkan Anda untuk mengunduh semua jenis file.

Brian Pellin
sumber
3
Ini tidak berhasil di sini. Pertama dengan mimeType = " ", paket tidak diinstal di Android 2.1, saya mendapatkan MalformedMimeTypeException. Menggunakan "* / " akan memperbaikinya, tetapi kemudian, filter ini tidak berpengaruh. Saat ini saya menguji dengan browser Skyfire, yang tidak mempertahankan jenis unduhan pantomim, seperti yang dilakukan browser Android standar. Dan saat mengklik file dalam daftar unduhan Skyfire, maksud VIEW yang sederhana disiarkan dengan data file. Dan filter maksud ini tidak cocok.
olivierg
@ Brian Pellin: Saya sebenarnya sedang mencari cara untuk mengikat tipe pantomim ke .kdbxekstensi untuk memungkinkan penjelajah file ES membuka file kdbx ketika saya diarahkan ke posting ini. Rupanya jika maksud memiliki tipe MIME kosong, filter maksud ini tidak akan berfungsi !! Selain itu, mungkin saja memiliki maksud dengan string KOSONG sebagai tindakan dan hanya URI. Google Docs menanggapi maksud itu, jadi itu pasti valid.
billc.cn
2
Hanya untuk memperjelas, mimeType harus "* / *" Saya pikir beberapa orang lupa melarikan diri dari * s
Brian Pellin
1
Itu tidak akan bekerja dengan Android 4. Anda harus menggunakan <data>tag dengan empat atribut. Memiliki 4 tag logis ATAU - Yang berfungsi dengan Android 2 - tetapi Android 4 lebih ketat. Lihat stackoverflow.com/questions/20650378/…
Martin
3
jika \\\\.cocok dengan periode literal, mengapa Anda tidak menggunakannya untuk membentuk .kdbekstensi seperti ini \\\\.kdb:?
Lealo
36

Ada banyak informasi yang salah tentang topik ini, paling tidak dari dokumentasi Google sendiri. Yang terbaik, dan mengingat logika yang aneh, mungkin satu-satunya dokumentasi nyata adalah kode sumbernya.

The pelaksanaan maksud filter memiliki logika yang hampir menentang deskripsi. The kode parser adalah bagian terkait lainnya dari teka-teki.

Filter berikut sangat mirip dengan perilaku yang masuk akal. Pola jalur berlaku, untuk "file"maksud skema.

Pencocokan pola jenis pantomim global akan cocok dengan semua jenis selama ekstensi file cocok. Ini tidak sempurna, tetapi satu-satunya cara untuk mencocokkan perilaku pengelola file seperti ES File Explorer, dan ini terbatas pada maksud yang cocok dengan URI / ekstensi file.

Saya belum menyertakan skema lain seperti di "http"sini, tetapi mereka mungkin akan berfungsi dengan baik pada semua filter ini.

Skema ganjil adalah "content", yang ekstensi tidak tersedia untuk filter. Namun selama penyedia menyatakan jenis MIME Anda (Misalnya, Gmail akan meneruskan jenis MIME untuk lampiran tanpa hambatan), filter akan cocok.

Harus diperhatikan:

  1. Ketahuilah bahwa tidak ada yang berperilaku secara konsisten di filter, ini adalah labirin kasus khusus, dan menganggap pelanggaran prinsip paling tidak mengejutkan sebagai tujuan desain. Tak satu pun dari algoritme pencocokan pola mengikuti sintaks atau perilaku yang sama. Tidak adanya bidang terkadang merupakan karakter pengganti dan terkadang tidak. Atribut dalam elemen data terkadang harus digabungkan dan terkadang mengabaikan pengelompokan. Itu benar-benar bisa dilakukan dengan lebih baik.
  2. The schemeDAN hostharus ditentukan untuk pathaturan untuk mencocokkan (bertentangan dengan panduan API Google, saat ini).
  3. Setidaknya ES File Explorer menghasilkan maksud dengan tipe MIME "", yang difilter dengan sangat berbeda null, tidak mungkin dicocokkan secara eksplisit, dan hanya dapat dicocokkan oleh "*/*"filter berisiko .
  4. The "*/*"Filter TIDAK akan cocok Niat dengan nulltipe MIME - yang membutuhkan filter terpisah untuk kasus khusus ini tanpa tipe MIME sama sekali.
  5. The "content"Skema hanya bisa ditandingi oleh tipe MIME, karena nama file asli tidak tersedia di maksud (setidaknya dengan Gmail).
  6. Pengelompokan atribut dalam "data"elemen terpisah (hampir) tidak relevan dengan interpretasi, dengan pengecualian khusus dari hostdan port- yang berpasangan bersama. Segala sesuatu yang lain tidak memiliki asosiasi khusus dalam suatu "data"elemen atau antar "data"elemen.

Dengan mengingat semua ini, berikut adalah contoh dengan komentar:

<!--
     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>
David Sainty
sumber
Hebat bahwa Anda berdiri untuk banyak kebutuhan yang terbukti untuk \\ .. berulang-ulang dan kebiasaan lainnya. Google seharusnya sudah memperbaikinya dengan 4.2, apa-apaan ini. Sayangnya, saya masih memiliki kasus yang tampaknya tidak diperbaiki oleh contoh Anda. Apakah ada masalah dengan 6 ekstensi cha seperti ".gblorb" sehingga kode saya berfungsi dengan baik dengan 3 huruf atau kurang?
RoundSparrow hilltx
Jawaban terbaik untuk pertanyaan ini dan pertanyaan serupa menurut saya! Sayangnya, selama tidak memungkinkan untuk mencocokkan maksud konten dengan ekstensi file (seperti yang Anda tunjukkan di 5.), tidak mungkin untuk memfilter SEMUA maksud yang benar tanpa juga mencocokkan maksud yang salah. Ini untuk kasus di mana Anda tidak dapat menggunakan jenis pantomim khusus. Jadi selama Android tidak memberikan solusi untuk ini, itu akan menjadi pemilih file dalam aplikasi untuk saya ... Saya tidak ingin membingungkan pengguna dengan perilaku yang tidak konsisten.
Benjamin Bisinger
1
Terima kasih banyak .. Anda baru saja membuat hari saya menyenangkan .. Dalam kasus saya, saya harus mengubah MimeType seperti <data android:mimeType="*/*" /> di ketiga opsi dan berfungsi seperti pesona untuk semua aplikasi termasuk Google Drive dan Gmail.
Rishabh Wadhwa
1
Saya ingin mengucapkan terima kasih banyak, @David Sainty. Anda mengakhiri penderitaan selama 24 jam saya mencoba mencari cara untuk menanganinya. Saya mencoba stackoverflow.com/q/18577860/6110285 , stackoverflow.com/a/8599921/6110285 dan banyak lagi yang serupa. Yang ini satu-satunya yang berhasil.
pittix
24

Saya harus mengakui bahwa tugas sederhana membuka lampiran dari email dan file dari sistem file di Android telah menjadi salah satu pengalaman yang lebih menjengkelkan. Sangat mudah untuk menangani terlalu banyak atau terlalu sedikit file. Tapi melakukannya dengan benar itu sulit. Sebagian besar solusi yang diposting di stackoverflow tidak berfungsi dengan benar untuk saya.

Persyaratan saya adalah:

  • minta apl saya menangani lampiran yang dibagikan oleh apl saya
  • membuat aplikasi saya menangani file di penyimpanan file yang dibuat oleh aplikasi saya dan memiliki ekstensi tertentu

Mungkin cara terbaik untuk melakukan tugas ini adalah menentukan Jenis MIME khusus untuk lampiran Anda. Dan Anda mungkin juga akan memilih untuk memiliki ekstensi file khusus. Jadi katakanlah aplikasi kita disebut "Aplikasi Keren" dan kita menghasilkan lampiran file yang memiliki ".cool" di akhir.

Ini adalah waktu terdekat saya untuk mencapai tujuan saya dan berhasil ... memuaskan.

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

Catatan:

  • The pathPatterntampaknya lebih atau kurang diabaikan untuk lampiran (bila menggunakan android:scheme="content"). Jika seseorang mendapatkan pathPattern untuk merespons hanya pada pola tertentu, saya akan senang melihat caranya.
  • Aplikasi Gmail menolak untuk mencantumkan aplikasi saya di pemilih jika saya menambahkan android:host="*"atribut.
  • Mungkin masih berfungsi jika intent-filterblok - blok ini digabungkan tetapi saya belum memverifikasi ini.
  • Untuk menangani permintaan dari browser saat mengunduh file, android:scheme="http"dapat digunakan. Perhatikan bahwa browser tertentu mungkin mengacaukan android:mimeTypeeksperimen android:mimeType="*/*"dan memeriksa debugger apa yang sebenarnya dilalui dan kemudian memperketat pemfilteran agar tidak berakhir menjadi aplikasi yang mengganggu yang menangani semuanya .
  • Penjelajah File tertentu akan mengacaukan Jenis MIME untuk file Anda juga. Di atas intent-filtertelah diuji dengan aplikasi "File Saya" Samsung di Galaxy S3. FX Explorer masih menolak untuk membuka file dengan benar dan saya juga memperhatikan bahwa ikon aplikasi tidak digunakan untuk file tersebut. Sekali lagi, jika ada yang berhasil, silakan beri komentar di bawah.

Saya harap ini berguna bagi Anda dan Anda tidak perlu membuang-buang waktu untuk mempelajari semua kemungkinan kombinasi. Ada ruang untuk perbaikan jadi kami mohon komentarnya.

omahena
sumber
Ini adalah solusi yang berhasil untuk saya. Mendaftarkan <intent-filter> terpisah untuk Skema-Konten dan Skema File berhasil! Terima kasih!
Mehlyfication
Terima kasih! Bekerja untuk saya. Baik aplikasi Gmail dan aplikasi Samsung My Files di Galaxy S6 dapat membuka file dengan aplikasi saya menggunakan solusi Anda!
Haris
Apa sebenarnya yang dimaksud dengan "nama aplikasi?" (Dalam kasus saya, nama aplikasi yang dapat dibaca manusia memiliki spasi di dalamnya.)
William Jockusch
@WilliamJockusch sepertinya @DavidSainty hanya menyimpan nama aplikasi dalam file sumber daya string. Spasi seharusnya bagus. String yang digunakan untuk android:labelfilter maksud adalah string yang akan dilihat pengguna di menu pemilih. Secara default nama aplikasi digunakan.
omahena
Apa yang harus saya gunakan untuk aplikasi "Google Drive"?
Pengembang android
9

Jawaban Brian di atas memberi saya 90% perjalanan ke sana. Untuk menyelesaikannya, saya menggunakan tipe pantomim

android:mimeType="*/*"

Saya curiga bahwa poster sebelumnya telah mencoba untuk memposting detail yang sama, tetapi dengan tidak memasukkan tanda bintang sebagai kode, stackoverflow menganggapnya hanya sebagai garis miring.

Dawson
sumber
2
Dengan ini Anda akan menangani SEMUA jenis file, dan itu benar-benar menjengkelkan (yah, kecuali jika aplikasi Anda benar-benar menangani semuanya) ...
Tim Autin
Ini buruk. Tolong jangan lakukan ini di dalam aplikasi Anda.
Mars
8

Daripada android:path, coba android:mimeType, dengan nilai tipe MIME dari konten khusus ini. Juga, android:pathtidak menerima wildcard - gunakan android:pathPatternuntuk itu.

CommonsWare
sumber
"Jenis file tidak termasuk dalam mimetypes"? Harus tetap ada mimetype untuk jenis konten yang Anda unduh, meskipun tidak menggunakan kata yang sama.
Eric Mill
Ada mimetype untuk jenis konten, tetapi file tersebut dibuat oleh aplikasi pihak ketiga yang menempatkan ekstensi berbeda di atasnya, jadi menurut saya itu tidak akan dikenali sebagai mimetype itu.
Curyous
7

Saya sudah mencoba membuat ini berfungsi selama berabad-abad dan pada dasarnya telah mencoba semua solusi yang disarankan dan masih tidak bisa membuat Android mengenali ekstensi file tertentu. Saya memiliki filter maksud dengan file"*/*" mimetype yang merupakan satu-satunya hal yang tampaknya berfungsi dan browser file sekarang mencantumkan aplikasi saya sebagai opsi untuk membuka file, namun aplikasi saya sekarang ditampilkan sebagai opsi untuk membuka JENIS file apa pun meskipun Saya telah menentukan ekstensi file tertentu menggunakan tag pathPattern. Sejauh ini bahkan ketika saya mencoba untuk melihat / mengedit kontak di daftar kontak saya, Android bertanya apakah saya ingin menggunakan aplikasi saya untuk melihat kontak, dan itu hanya salah satu dari banyak situasi di mana ini terjadi, SANGAT SANGAT mengganggu.

Akhirnya saya menemukan posting grup google ini dengan pertanyaan serupa yang dijawab oleh insinyur kerangka Android yang sebenarnya. Dia menjelaskan bahwa android sama sekali tidak tahu apa-apa tentang ekstensi file, hanya jenis MIME ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ).

Jadi dari apa yang saya lihat, coba dan baca, Android tidak bisa membedakan antara ekstensi file dan tag pathPattern pada dasarnya adalah pemborosan waktu dan energi yang sangat besar. Jika Anda cukup beruntung karena hanya membutuhkan file dari jenis mime tertentu (misalnya teks, video atau audio), Anda bisa menggunakan filter-maksud dengan jenis mime. Jika Anda memerlukan ekstensi file tertentu atau jenis mime yang tidak dikenal oleh Android, maka Anda kurang beruntung.

Jika saya salah tentang semua ini, tolong beri tahu saya, sejauh ini saya telah membaca setiap posting dan mencoba setiap solusi yang diusulkan yang dapat saya temukan tetapi tidak ada yang berhasil.

Saya dapat menulis satu atau dua halaman lagi tentang seberapa umum hal-hal semacam ini tampaknya ada di Android dan betapa mengacaukan pengalaman pengembang, tetapi saya akan menyelamatkan Anda dari kata-kata kasar saya;). Semoga saya menyelamatkan seseorang dari masalah.

PeeGee85
sumber
1
Memberikan suara positif karena jawaban Anda memberikan tautan yang berguna dan pemberi suara negatif tidak memberikan komentar. Maaf SO terkadang tidak ramah seperti itu, tetapi jangan berhenti begitu saja.
John Hatton
4

Perbarui 2020

Android telah beralih ke URI konten dan Jenis MIME untuk filter maksud.

Masalah

URI konten tidak harus berisi ekstensi atau nama file dan akan berbeda di antara berbagai aplikasi yang menyediakan konten / file.

Berikut beberapa contoh URI konten dari aplikasi email yang berbeda untuk lampiran email yang sama :

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

Outlook -> content://com.microsoft.office.outlook.fileprovider/outlookfile/data/data/com.microsoft.office.outlook/cache/file-download/file--2146063402/filename.customextention

Aplikasi Email Samsung -> content://com.samsung.android.email.attachmentprovider/1/1/RAW

Seperti yang dapat dilihat, semuanya berbeda dan tidak dijamin berisi apa pun yang terkait dengan file Anda yang sebenarnya. Jadi, Anda tidak dapat menggunakan android:pathPatternseperti yang kebanyakan disarankan.

Solusi solusi untuk lampiran email

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

Melalui pengujian saya menemukan Jenis MIME yang digunakan Gmail, Outlook, dan Samsung Email dan menambahkannya ke filter maksud saya.

Peringatan / Gotchas

  • Saya menemukan bahwa dengan solusi saya di atas, jika saya membuka file apa pun yang merupakan tipe biner, itu akan secara otomatis meluncurkan aplikasi saya. Saya menangani ini dalam aktivitas saya dengan menampilkan status gagal jika kami tidak dapat mengurai file. Saya pikir ini adalah acara yang sangat langka sehingga dapat diterima.

  • Saya tidak dapat menemukan cara untuk meluncurkan aplikasi saya melalui file browser tanpa menambahkan <data android:mimeType="*/*"/>ke filter maksud saya. Saya tidak dapat menggunakan ini karena ia akan meluncurkan aplikasi saya setiap kali pengguna mengklik file apa pun di ponsel mereka (bukan hanya file-ekstensi khusus). Saya tidak akan merekomendasikan menambahkan ini ke filter-maksud Anda.

Pikiran Akhir

  • Saat ini tidak ada solusi elegan untuk mengaitkan aplikasi Anda dengan jenis ekstensi tertentu di Android. Ini adalah yang terbaik yang bisa saya lakukan dalam situasi saya.
alexander antaya
sumber
terima kasih banyak, ini berfungsi, diuji pada Oktober 2020, dari Android 7
Harsh
3

Jawaban Brian sangat dekat, tetapi berikut adalah cara yang bersih dan bebas kesalahan agar aplikasi Anda dipanggil saat mencoba membuka file dengan ekstensi khusus Anda sendiri (tidak perlu skema atau host):

<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>
Kon
sumber
2
Dokumentasi Android menyatakan bahwa atribut pathPattern hanya berarti jika skema dan host ditentukan, dan saya telah memverifikasi ini: developer.android.com/guide/topics/manifest/data-element.html
Brian Pellin
4
-1; ini akan cocok dengan file apapun ; Komentar Brian benar dan dengan sedikit modifikasi pada mimeType = " / " contoh aslinya sempurna.
Nick
Posting ini jika dari waktu yang lama, tetapi tidak ada "/" yang tidak diinstal. Anda memerlukan "* / *", yang cocok dengan semua jenis file (tidak yakin, apakah Anda bermaksud mengatakan ini). Jadi program Anda mungkin diminta untuk membuka video atau mp3. Saya belum menemukan solusi untuk ini.
Rene
Anda harus menggunakan satu <data>tag dengan empat atribut. Solusi Anda mungkin berfungsi dengan Android 2 - tetapi aturan menjadi lebih ketat: stackoverflow.com/questions/20650378/…
Martin
Ada apa dengan pathPattern yang aneh ? Dan hostdan schemedibutuhkan!
IgorGanapolsky
3

Di Android 4, aturan menjadi lebih ketat dari sebelumnya. Menggunakan:

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

Saya telah berjuang dengan ini cukup banyak untuk ekstensi file khusus, saya sendiri. Setelah banyak mencari, saya menemukan halaman web ini di mana poster menemukan bahwa kelas patternMatcher Android (yang digunakan untuk pencocokan pathPattern di Intent-Filters) memiliki perilaku yang tidak terduga ketika jalur Anda berisi karakter pertama dari pola pencocokan Anda di tempat lain di jalur (seperti jika Anda mencoba mencocokkan "* .xyz", kelas patternMatcher berhenti jika sebelumnya ada "x" di jalur Anda). Inilah yang dia temukan untuk mengatasinya, dan berhasil untuk saya, meskipun ini sedikit hack:

PatternMatcher digunakan untuk pathPattern di IntentFilter Tapi, algoritma PatternMatcher cukup aneh bagi saya. Berikut adalah algoritma Android PatternMatcher.

Jika ada pola 'karakter berikutnya' dari '. *' Di tengah string, PatternMatcher menghentikan loop pada titik itu. (Lihat PatternMatcher.java dari framework Android.)

Ex. string: "ini adalah keterikatan saya" pola: ". att. ". Android PatternMatcher memasukkan putaran untuk mencocokkan '. 'pola sampai bertemu dengan karakter pola berikutnya (pada contoh ini,' a ') Jadi,'. 'loop yang cocok berhenti di indeks 8 -' a 'between' is 'dan' my '. Oleh karena itu, hasil pertandingan ini mengembalikan 'salah'.

Cukup aneh, bukan. Untuk mengatasinya - sebenarnya mengurangi kemungkinan - pengembang harus menggunakan pathPattern bodoh yang mengganggu.

Ex. Sasaran: Mencocokkan jalur uri yang mencakup 'pesan'.

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

Ini terutama dikeluarkan saat mencocokkan dengan ekstensi file kustom.

benjamin davis
sumber
Bagi siapa pun yang tertarik, sebuah Masalah telah dicatat di code.google.com
benjamin davis
3

Tak satu pun dari yang di atas berfungsi dengan baik, untuk tindakan VIEW atau SEND, jika sufiks tidak terdaftar dengan jenis MIME dalam database system = wide MIME Android. Satu-satunya pengaturan yang saya temukan bahwa api untuk sufiks yang ditentukan termasuk android:mimeType="*/*", tetapi kemudian tindakan tersebut diaktifkan untuk SEMUA file. Jelas BUKAN yang Anda inginkan!

Saya tidak dapat menemukan solusi yang tepat tanpa menambahkan mime dan sufiks ke database Android mime, sejauh ini, saya belum menemukan cara untuk melakukannya. Jika ada yang tahu, penunjuk akan sangat bagus.

Glenn Widener
sumber
2

Saat Intent memenuhi a intent-filter, ini adalah intent-filterpersyaratannya: (bayangkan daftar periksa).

  • Semua yang cocok <action>
  • Semua yang cocok <category>
  • Semua pencocokan <data mimeType>(perbaikan mudah: " / ")
  • Opsional:

    • Setiap pencocokan <data scheme>(mudah memperbaiki: <data android:scheme="file" /> <data android:scheme="content" />)

    • Semua yang cocok <data host> (perbaikan mudah: "*")

    • Semua yang cocok <data pathPattern/etc.>(misalnya .*\\.0cc)

Mendefinisikan beberapa <data $type="">elemen centang kotak $ type iff ada yang <data $type=>cocok denganIntent .

Menghilangkan mimeType akan merusak Anda intent-filter, meskipun tampaknya berlebihan. Menghilangkan <data scheme/host/pathPattern>menyebabkan filter Anda cocok dengan semuanya.

https://f-droid.org/en/packages/de.k3b.android.intentintercept/ adalah aplikasi yang dirancang untuk menerima semua maksud, dan memungkinkan Anda untuk memeriksa maksud tersebut. Saya mengetahui bahwa ekstensi file tidak dikenal yang dibuka melalui Simple File Manager dikirimkan dengan tipe MIME application/octet-stream.

https://stackoverflow.com/a/4621284/2683842 melaporkan yang <data pathPattern=> .*xyzdibatalkan pada saat pertama kali xdilihat, dan akan langsung gagal jika tidak diikuti oleh yz. Jadi /sdcard/.hidden/foo.0cctidak akan lulus .*\\.0cckecuali Anda mencobanya .*\\..*\\.0cc.

  • Saya tidak memverifikasi apakah solusi ini perlu.

Hasil akhir:

<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>
nyanpasu64
sumber
1

Jika Anda ingin file dibuka langsung dari Gmail, dropbox, atau alat file android buildin apa pun, gunakan kode berikut (hapus 'android: host = "*"' yang membuat file tidak dapat dijangkau untuk 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: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>

Filter data harus ditulis dalam satu pernyataan sesuai Android versi 4.x

AndreasReiff
sumber
Saya telah mencoba segalanya untuk mencoba agar unduhan dan buka browser Android berfungsi dengan benar. Solusi Anda berfungsi dengan baik untuk browser asli android dan android chrome, namun firefox android sepertinya masih membuka file saya di jendela teks. Ini adalah jenis pantomim khusus dan ekstensi khusus. Sebelumnya hanya dengan ekstensi, ini hanya berfungsi di firefox. Sekarang berfungsi di mana-mana kecuali firefox (termasuk gmail). Saya masih mengujinya tetapi saya hanya ingin menandai fakta bahwa ada serangkaian masalah lintas browser baru di sini.
Damon Smith
1

Menggunakan filter seperti di bawah ini untuk membuka dari browser, gmail & file browser (Diuji). CATATAN: Harap jangan menggabungkan dua filter, yang akan membuat browser mengabaikan aplikasi Anda (Teruji).

        <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>
Tran Hieu
sumber
Sudahkah Anda menguji jawaban ini dengan lampiran Gmail?
IgorGanapolsky
0

Baca https://developer.android.com/training/sharing/receive ini , ini dapat membantu untuk memulai. lalu dalam file manifes coba filter maksud di bawah ini saat mendaftarkan penerima dalam aktivitas yang akan dibuka

<intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="content"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="application/your_extension" />
</intent-filter>

pastikan ekstensi diberikan tanpa "." di dalamnya

Keras
sumber