Belirli bir dosya uzantısı için Android amaç filtresi?


94

Belirli bir uzantıya sahip bir dosyayı 'net'ten indirebilmek ve bununla ilgilenmek için uygulamama geçmesini istiyorum, ancak amaç filtresini bulamadım. Dosya türü mime türlerine dahil değil ve kullanmayı denedim

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

ama bunu çalıştıramadım.

Yanıtlar:


121

Bunu çalıştırmak için AndroidManifest.xml dosyamdaki etkinliğimi şu şekilde tanımladım.

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

schemeAit fileyerel bir dosya (yerine HTTP gibi protokol yerine) açıldığında bunun gerektiğini gösterir.

mimeType*/*herhangi bir mime tipiyle eşleşecek şekilde ayarlanabilir .

pathPatterneşleştirmek istediğiniz uzantıyı belirttiğiniz yerdir (bu örnekte .kdb). .*Başında herhangi bir karakter squence eşleşir. Bu dizeler çift kaçış gerektirir, bu nedenle \\\\.gerçek bir noktayla eşleşir. Ardından, dosya uzantınızla bitirirsiniz. PathPattern ile ilgili bir uyarı, .*bu normal bir ifade olsaydı beklediğiniz gibi açgözlü bir eşleşme olmamasıdır. Bu desen, .öncesinde bir içeren yollarla eşleşemez .kdb. Bu konuyla ilgili daha ayrıntılı bir tartışma ve bir çözüm için buraya bakın

Son olarak, Android belgelere göre, her ikisi hostve schemenitelikleri için gerekli olan pathPatternyani sadece joker bir şey eşleştirmek için bu set, işe özniteliği.

Şimdi, .kdbLinda Dosya Yöneticisi gibi bir uygulamada bir dosya seçerseniz , uygulamam bir seçenek olarak görünür. Bunun tek başına bu dosya tipini bir tarayıcıya indirmenize izin vermediğini not etmeliyim, çünkü bu sadece dosya şemasına kaydolur. Telefonunuzda Linda Dosya Yöneticisi gibi bir uygulamaya sahip olmak, genel olarak herhangi bir dosya türünü indirmenize izin verir.


3
Bu burada çalışmıyor. İlk olarak mimeType = " " ile paket Android 2.1'e yüklenmiyor, MalformedMimeTypeException alıyorum. "* / " Kullanılması bunu düzeltir, ancak daha sonra bu filtrenin hiçbir etkisi olmaz. Şu anda, standart Android tarayıcısının yaptığı gibi, mime türlerini korumayan Skyfire tarayıcısıyla test ediyorum. Skyfire indirme listesindeki bir dosyaya tıklandığında, dosya verileriyle birlikte basit bir GÖRÜNÜM amacı yayınlanır. Ve bu amaç filtresi eşleşmiyor.
olivierg

@Brian Pellin: Aslında .kdbxbu yazıya işaret edildiğimde ES dosya gezgininin kdbx dosyalarını açmasına izin vermek için bir mime tipini uzantıya bağlamanın bir yolunu arıyordum . Görünüşe göre amaç boş bir MIME türüne sahipse, bu amaç filtresi çalışmayacaktır! Ayrıca, eylem olarak EMPTY dizesi ve yalnızca bir URI olan bir niyete sahip olmak mümkündür. Google Dokümanlar bu amaca yanıt verdi, bu nedenle geçerli olması gerekir.
billc.cn

2
Açıkça belirtmek gerekirse, mimeType "* / *" olmalıdır. Sanırım bazı insanlar *
lerinden

1
Bu, Android 4 ile çalışmaz. <data>Etikette dört özellik kullanmalısınız. 4 etikete sahip olmak mantıklı VEYA - Android 2 ile çalıştı - ancak Android 4 daha katı. Stackoverflow.com/questions/20650378/… sayfasına
Martin

3
eğer \\\\.bir hazır dönemin maçlarla, neden oluşturmak için kullanabilirsiniz gelmez .kdbböyle uzantısı: \\\\.kdb?
Lealo

38

Bu konuda pek çok yanlış bilgi var, en azından Google'ın kendi belgelerinden değil. En iyisi ve garip mantık göz önüne alındığında, muhtemelen tek gerçek dokümantasyon kaynak kodudur.

Niyet filtre uygulaması neredeyse tanımı aşıyor mantığı vardır. Ayrıştırıcı kod bulmacanın diğer ilgili parçasıdır.

Aşağıdaki filtreler mantıklı davranışa oldukça yaklaşıyor. Yol modelleri, "file"şema amaçları için geçerlidir .

Global mime türü kalıp eşleşmesi, dosya uzantısı eşleştiği sürece tüm türlerle eşleşecektir. Bu mükemmel değildir, ancak ES Dosya Gezgini gibi dosya yöneticilerinin davranışlarını eşleştirmenin tek yoludur ve URI / dosya uzantısının eşleştiği amaçlarla sınırlıdır.

"http"Buradaki gibi başka şemaları dahil etmedim , ancak muhtemelen tüm bu filtrelerde iyi çalışacaklar.

Garip şema "content", bunun için uzantı filtrede mevcut değildir. Ancak sağlayıcı MIME türünüzü belirttiği sürece (Örn. Gmail, ek için MIME türünü engelsiz olarak aktaracaktır), filtre eşleşecektir.

Dikkat edilmesi gereken noktalar:

  1. Filtrelerde hiçbir şeyin tutarlı davranmadığını, özel durumların bir labirenti olduğunu ve en az sürpriz ilkesinin ihlalini bir tasarım hedefi olarak ele aldığını unutmayın. Model eşleştirme algoritmalarının hiçbiri aynı sözdizimini veya davranışı izlemez. Alanın olmaması bazen bir joker karakterdir ve bazen değildir. Bir veri öğesi içindeki öznitelikler bazen birlikte hareket etmeli ve bazen gruplamayı yok saymalıdır. Gerçekten daha iyi yapılabilirdi.
  2. schemeVE hostyönelik belirtilmelidir pathkurallar (şu anda, Google'ın API kılavuzuna aykırı) eşleşecek.
  3. En azından ES Dosya Gezgini, MIME türünden ""çok farklı bir şekilde filtrelenen null, açıkça eşleşmesi imkansız olan ve yalnızca riskli "*/*"filtre ile eşleştirilebilen amaç üretir .
  4. "*/*"Filtre ile Amaçları maç ETMEYECEKTIR nullhiç yok MIME türüyle bu özel durum için ayrı bir süzgeç gerektirir - MIME türü.
  5. "content"Orijinal dosya adı (en azından Gmail ile) niyet mevcut değildir çünkü düzeni yalnızca MIME türüne göre eşleştirilebilir.
  6. Özniteliklerin ayrı "data"öğelerdeki gruplandırılması , yorumla (neredeyse) ilgisizdir, özel istisnası hostve port- bunlar birlikte eşleşir. Diğer her şeyin bir "data"öğe içinde veya "data"öğeler arasında belirli bir ilişkisi yoktur .

Tüm bunlar göz önünde bulundurularak, burada yorum içeren bir örnek verilmiştir:

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

\\ .. ve diğer tuhaflıklara karşı kanıtlanmış birçok ihtiyaca karşı koymanız harika. Google bunu 4.2'ye kadar düzeltmiş olmalıydı, neyse. Ne yazık ki, hala örneğinizin çözemediği durumlar var. Kodumun 3 veya daha az harfle sorunsuz çalıştığı ".gblorb" gibi 6 cha uzantısıyla ilgili bir sorun var mı?
RoundSparrow hilltx

Bu soruya ve bence benzer sorulara en iyi cevap! Ne yazık ki, içerik amaçlarını dosya uzantısına göre eşleştirmek mümkün olmadığı sürece (5.'de işaret ettiğiniz gibi), yanlış olanları da eşleştirmeden TÜM doğru amaçları güvenilir bir şekilde filtrelemek mümkün değildir. Bu, özel bir mime türü kullanamayacağınız durumlar içindir. Android bunun için bir çözüm sağlamadığı sürece, uygulama içinde benim için bir dosya seçici olacak ... Kullanıcıyı tutarsız davranışla karıştırmak istemiyorum.
Benjamin Bisinger

1
Çok teşekkürler .. Günümü yeni başardınız .. Benim durumumda <data android:mimeType="*/*" /> , her üç seçenekte olduğu gibi MimeType'ı değiştirmek zorunda kaldım ve Google Drive ve Gmail dahil tüm uygulamalar için cazip çalıştı.
Rishabh Wadhwa

1
Çok teşekkür ederim @David Sainty. Onunla nasıl başa çıkacağımı bulmaya çalışırken 24 saat süren acıma bir son verdin. Stackoverflow.com/q/18577860/6110285 , stackoverflow.com/a/8599921/6110285 ve benzer olan çok daha fazlasını denedim . Bu, işe yarayan tek kişi.
pittix

24

Android'deki dosya sisteminden e-postalardan ve dosyalardan ekleri açmanın basit görevinin şimdiye kadarki en çıldırtıcı deneyimlerden biri olduğunu itiraf etmeliyim. Çok fazla dosyayı veya çok azını işlemek kolaydır. Ama doğru yapmak zordur. Stackoverflow'da yayınlanan çözümlerin çoğu benim için doğru çalışmadı.

Gereksinimlerim şunlardı:

  • uygulamamın uygulamam tarafından paylaşılan eklerini işletir
  • uygulamamın, uygulamam tarafından oluşturulan ve belirli bir uzantıya sahip dosya deposundaki dosyaları işlemesini sağla

Muhtemelen bu görevi gerçekleştirmenin en iyi yolu, ekleriniz için özel bir MIME Türü belirlemektir. Ve muhtemelen özel bir dosya uzantısına sahip olmayı da seçeceksiniz. Diyelim ki uygulamamızın adı "Harika Uygulama" ve sonunda ".cool" olan dosya ekleri oluşturuyoruz.

Bu, hedefime ulaştığım en yakın nokta ve işe yarıyor ... tatmin edici.

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

Notlar:

  • pathPatternAz ya da çok ekleri (kullanılırken göz ardı gibi görünüyor android:scheme="content"). Birisi pathPattern'i yalnızca belirli kalıplara yanıt verecek şekilde alırsa, nasıl olacağını görmek beni heyecanlandırır.
  • Özelliği eklersem Gmail uygulaması uygulamamı seçicide listelemeyi reddetti android:host="*".
  • Bu intent-filterbloklar birleştirilirse muhtemelen hala çalışıyor ancak bunu doğrulamadım.
  • Bir dosya indirirken tarayıcıdan gelen istekleri işlemek android:scheme="http"için kullanılabilir. Bazı tarayıcıların android:mimeTypebu deneyi karıştırabileceğini android:mimeType="*/*"ve hata ayıklayıcıda gerçekte neyin geçtiğini kontrol edebileceğini ve ardından her şeyi işleyen o sinir bozucu uygulama olmamak için filtrelemeyi sıkılaştırabileceğini unutmayın .
  • Bazı Dosya Gezginleri, dosyalarınız için MIME Türlerini de bozacaktır. Yukarıdakiler intent-filter, Samsung'un "Dosyalarım" uygulamasıyla Galaxy S3'te test edildi. FX Explorer hala dosyayı düzgün bir şekilde açmayı reddediyor ve ayrıca uygulama simgesinin dosyalar için kullanılmadığını fark ettim. Yine, eğer biri bunu işe yararsa lütfen aşağıya yorum yapın.

Umarım bunu faydalı bulursunuz ve tüm olası kombinasyonlardan geçerek günlerinizi boşa harcamak zorunda kalmazsınız. İyileştirme için yer var, bu nedenle yorumlarınızı bekliyoruz.


Bu benim için çalışan bir çözüm. Content-Scheme ve File-Scheme için ayrı bir <intent-filter> kaydetmek hile yaptı! Teşekkürler!
Mehlyfication

Teşekkürler! Benim için çalıştı. Hem Gmail uygulaması hem de Galaxy S6'daki Samsung Dosyalarım uygulaması, çözümünüzü kullanarak uygulamamla dosya açabildi!
Haris

"Uygulama adı" tam olarak nedir? (Benim durumumda, insan tarafından okunabilir uygulama adında boşluklar var.)
William Jockusch

@WilliamJockusch @DavidSainty sadece uygulama adını string kaynak dosyasında saklıyor gibi görünüyor. Boşluklar iyi olmalı. İçin kullanılan dize android:labelniyet filtre için kullanıcı seçici menüsünde görecek dizedir. Varsayılan olarak uygulama adı kullanılır.
omahena

"Google Drive" uygulaması için ne kullanmalıyım?
android geliştiricisi

9

Brian'ın yukarıdaki cevabı bana oranın% 90'ını getirdi. Bitirmek için, kullandım mime türü için

android:mimeType="*/*"

Önceki posterlerin aynı ayrıntıyı göndermeye çalıştığından şüpheleniyorum, ancak yıldız eğik çizgi yıldızını kod olarak seçmemek, stackoverflow onu sadece bir eğik çizgi olarak gösteriyor.


2
Bununla TÜM dosya türlerini idare edeceksiniz ve bu gerçekten can sıkıcı (tabi, uygulamanızın gerçekten her şeyi ele alması dışında) ...
Tim Autin

Bu kötü. Lütfen bunu uygulamalarınızın içinde yapmayın.
Mars

8

Bunun yerine , bu belirli içerik parçasının MIME türünün bir değeriyle android:pathdeneyin android:mimeType. Ayrıca, android:pathjoker karakterleri kabul etmez - android:pathPatternbunun için kullanın .


"Dosya türü mime türlerine dahil değil" mi? Aynı kelimeyi kullanmasa bile, indirdiğiniz içerik türü için yine de bir mime türü olmalıdır.
Eric Mill

İçerik türü için bir mime türü var, ancak dosya, üzerine farklı bir uzantı koyan üçüncü taraf bir uygulama tarafından üretiliyor, bu yüzden bu mimetip olarak tanınacağını sanmıyorum.
Curyous

7

Bunu uzun zamandır çalıştırmaya çalışıyorum ve temel olarak önerilen tüm çözümleri denedim ve yine de Android'in belirli dosya uzantılarını tanımasını sağlayamıyorum. "*/*"Mime türüne sahip bir amaç filtrem var, bu çalışan tek şey ve dosya tarayıcıları artık uygulamamı dosyaları açmak için bir seçenek olarak listeliyor, ancak uygulamam artık HER TÜR dosyayı açmak için bir seçenek olarak gösteriliyor. PathPattern etiketini kullanarak belirli dosya uzantıları belirledim. Bu o kadar ileri gidiyor ki, kişi listemdeki bir kişiyi görüntülemeye / düzenlemeye çalıştığımda bile Android, kişiyi görüntülemek için uygulamamı kullanmak isteyip istemediğimi soruyor ve bu, bunun meydana geldiği birçok durumdan sadece biri, ÇOK ÇOK can sıkıcı.

Sonunda, gerçek bir Android çerçeve mühendisinin yanıtladığı benzer bir soruyla bu Google grupları gönderisini buldum. Android'in dosya uzantıları hakkında hiçbir şey bilmediğini, yalnızca MIME türlerini ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ) bildiğini açıklıyor .

Gördüğüm, denediğim ve okuduğum kadarıyla, Android dosya uzantılarını ayırt edemiyor ve pathPattern etiketi temelde devasa bir zaman ve enerji kaybı. Yalnızca belirli bir mime türündeki dosyalara (örneğin metin, video veya ses) ihtiyaç duyacak kadar şanslıysanız, mime türünde bir amaç filtresi kullanabilirsiniz. Belirli bir dosya uzantısına veya Android tarafından bilinmeyen bir mime türüne ihtiyacınız varsa, o zaman şansınız kalmaz.

Bunlardan herhangi biri hakkında yanılıyorsam lütfen bana söyleyin, şimdiye kadar her yazıyı okudum ve bulabildiğim önerilen her çözümü denedim ama hiçbiri işe yaramadı.

Bu tür şeylerin Android'de ne kadar yaygın göründüğü ve geliştirici deneyiminin ne kadar berbat olduğu hakkında bir veya iki sayfa daha yazabilirim, ancak sizi kızgın sözlerimden kurtaracağım;). Umarım birini biraz dertten kurtardım.


1
Size olumlu oy verdi çünkü cevabınız faydalı bir bağlantı veriyor ve olumsuz oy veren bir yorum bırakmadı. Üzgünüm SO bazen bu şekilde düşmanca olabilir, ama bundan vazgeçme.
John Hatton

4

2020 Güncellemesi

Android, amaç filtreleri için içerik URI'lerine ve MIME Türlerine yöneldi.

Sorun

Bir içerik URI'sinin dosyanın uzantısını veya adını içermesi gerekmez ve içeriği / dosyayı sağlayan farklı uygulamalar arasında farklı olacaktır.

Aynı e-posta eki için farklı e-posta uygulamalarından bazı örnek içerik URI'leri :

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

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

Samsung E-posta Uygulaması -> content://com.samsung.android.email.attachmentprovider/1/1/RAW

Görüldüğü gibi hepsi farklıdır ve gerçek dosyanızla ilgili herhangi bir şey içermeleri garanti edilmez. Bu nedenle, android:pathPatternçoğunun önerdiği gibi kullanamazsınız .

E-posta ekleri için bir geçici çözüm

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

Test ederek Gmail, Outlook ve Samsung Email'in kullandığı MIME Türlerini buldum ve bunları amaç filtreme ekledim.

Uyarılar / Gotchas

  • Yukarıdaki çözümümle, ikili türdeki herhangi bir dosyayı açarsam, uygulamamı otomatik olarak başlatacağını öğrendim. Dosyayı ayrıştıramazsak başarısız bir durumu göstererek bunu faaliyetimde hallettim. Bunun oldukça nadir bir olay olduğunu düşündüm, bu yüzden kabul edilebilir.

  • <data android:mimeType="*/*"/>Amaç filtreme eklemeden uygulamamı dosya tarayıcısı üzerinden başlatmanın herhangi bir yolunu bulamadım . Bunu kullanamadım çünkü daha sonra kullanıcı telefonundaki herhangi bir dosyayı tıkladığında (yalnızca özel dosya uzantıları değil) uygulamamı başlatacaktı . Bunu amaç filtrenize eklemenizi tavsiye etmem.

Son düşünceler

  • Şu anda uygulamanızı Android'de belirli bir uzantı türüyle ilişkilendirmek için zarif bir çözüm yoktur. Bu benim durumumda yapabileceğimin en iyisiydi.

çok teşekkürler, işe yarıyor, Ekim 2020'de test edildi, android 7'den
Harsh

3

Brian'ın cevabı çok yakın, ancak kendi özel uzantınızla bir dosyayı açmaya çalışırken uygulamanızı çalıştırmanın temiz ve hatasız bir yolu var (şemaya veya ana bilgisayara gerek yoktur):

<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 belgeleri, pathPattern özniteliğinin yalnızca bir şema ve ana bilgisayar belirtildiğinde anlamlı olduğunu ve bunu doğruladığımı belirtir: developer.android.com/guide/topics/manifest/data-element.html
Brian Pellin

4
-1; bu herhangi bir dosya ile eşleşecektir ; Brian'ın yorumu doğru ve mimeType = " / " üzerindeki küçük değişiklikle orijinal örneği mükemmel.
Nick

Bu gönderi uzun zaman öncesine aitse, ancak "/" yüklenmiyorsa. Herhangi bir dosya türüyle eşleşecek "* / *" gerekir (bunu söylemek istiyorsan emin değilsin). Bu nedenle programınızdan videolar veya mp3'ler açması istenebilir. Buna henüz bir çözüm bulamadım.
Rene

<data>Dört özniteliğe sahip bir etiket kullanmalısınız . Çözümünüz Android 2 ile çalışabilir - ancak kurallar daha katı hale geldi: stackoverflow.com/questions/20650378/…
Martin

Tuhaf pathPattern'e ne oldu ? Ve hostve schemegerekli!
IgorGanapolsky

3

Android 4'te kurallar eskiden olduğundan daha katı hale geldi. Kullanım:

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

3

Kendim için özel bir dosya uzantısı için bununla biraz uğraşıyorum. Çok fazla araştırmadan sonra , posterin Android'in patternMatcher sınıfının (Intent-Filters'da pathPattern eşleşmesi için kullanılan) yolunuz yolun başka bir yerinde eşleşme modelinizin ilk karakterini içerdiğinde beklenmedik davranışlar sergilediğini keşfettiği bu web sayfasını buldum. ("* .xyz" ile eşleştirmeye çalışıyorsanız, yolunuzun başında bir "x" varsa patternMatcher sınıfı durur). İşte bir geçici çözüm olarak bulduğu ve biraz hack olsa da benim için çalıştığı şey:

PatternMatcher, IntentFilter'da pathPattern için kullanılıyor. Ancak PatternMatcher'in algoritması bana oldukça tuhaf geliyor. İşte Android PatternMatcher'ın algoritması.

Dizenin ortasında '. *' Kalıbının 'sonraki karakteri' varsa, PatternMatcher bu noktada döngüyü durdurur. (Android çerçevesinin PatternMatcher.java bölümüne bakın.)

Örn. string: "bu benim ekimdir" pattern: ". att. ". Android PatternMatcher eşleşecek döngüyü girin '. 'kalıbın bir sonraki karakterini karşılayana kadar kalıp (bu örnekte' a ') Öyleyse,'. 'eşleşen döngü dizin 8'de durur -' a 'arasında' eşittir 've' benim '. Bu nedenle, bu eşleşmenin sonucu 'yanlış' döndürür.

Oldukça tuhaf, değil mi? Bunu çözmek için - aslında olasılığı azaltmak - geliştirici sinir bozucu aptal pathPattern kullanmalıdır.

Örn. Hedef: "mesaj" ı içeren eşleşen uri yolu.

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

Bu, özellikle özel dosya uzantısıyla eşleşirken verilir.


İlgilenen herkes için, code.google.com'da
benjamin davis

3

Sonek Android'in sistem = geniş MIME veritabanında bir MIME türü ile kaydedilmemişse, GÖRÜNÜM veya GÖNDER eylemleri için yukarıdakilerin hiçbiri düzgün çalışmaz. Belirtilen son ek için yangını bulduğum tek ayar android:mimeType="*/*", ancak daha sonra eylem TÜM dosyalar için tetikleniyor. Açıkçası ne istediğini DEĞİL!

Mime ve son eki Android mime veritabanına eklemeden uygun bir çözüm bulamıyorum, şimdiye kadar bunu yapmanın bir yolunu bulamadım. Bilen biri varsa, bir işaretçi harika olur.


2

Bir Niyet a'yı karşıladığında intent-filter, intent-filtergereksinimler şunlardır : (bir kontrol listesi hayal edin).

  • Herhangi bir eşleşen <action>
  • Herhangi bir eşleşen <category>
  • Herhangi bir eşleşme <data mimeType>(kolay düzeltme: " / ")
  • Opsiyonel olarak:

    • Herhangi eşleştirme <data scheme>(kolay düzeltme: <data android:scheme="file" /> <data android:scheme="content" />)

    • Herhangi bir eşleşme <data host>(kolay düzeltme: "*")

    • Herhangi bir eşleşme <data pathPattern/etc.>(örneğin .*\\.0cc)

Birden çok <data $type="">eleman tanımlamak , herhangi <data $type=>biri Intent.

MimeType'ın çıkarılması intent-filter, görünüşte fazlalık olsa bile, sizi bozar . Atlamak <data scheme/host/pathPattern>, filtrenizin her şeyle eşleşmesine neden olur.

https://f-droid.org/en/packages/de.k3b.android.intentintercept/ , tüm niyetleri almak için tasarlanmış bir uygulamadır ve amacı incelemenizi sağlar. Basit Dosya Yöneticisi aracılığıyla açılan tanınmayan dosya uzantılarının MIME türü ile teslim edildiğini öğrendim application/octet-stream.

https://stackoverflow.com/a/4621284/2683842 raporları <data pathPattern=> .*xyzilk başta iptal xgördüğü ve ardından değilse derhal başarısız olur yz. Onun yerine denemedikçe /sdcard/.hidden/foo.0ccgeçmeyecek ..*\\.0cc.*\\..*\\.0cc

  • Bu geçici çözümün gerekli olup olmadığını doğrulamadım.

Sonuç:

<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

Dosyaların doğrudan Gmail, dropbox veya herhangi bir yerleşik android dosya aracından açılmasını istiyorsanız, aşağıdaki kodu kullanın (dosyayı gmail için erişilemez yapan 'android: host = "*"' silin):

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

Veri filtresi, Android sürüm 4.x'e göre tek bir ifadede yazılmalıdır.


Android tarayıcı indirme ve açma işlemlerinin düzgün çalışmasını sağlamaya çalışan her şeyi deniyorum. Çözümünüz android yerel tarayıcı ve android chrome için iyi çalışıyor, ancak android firefox dosyamı hala bir metin penceresinde açıyor gibi görünüyor. Özel bir mime türü ve özel bir uzantıdır. Daha önce sadece uzantı ile sadece firefox'ta çalışıyordu. Artık firefox (gmail dahil) dışında her yerde çalışıyor. Hala test ediyorum, ancak burada yeni bir dizi çapraz tarayıcı sorunu olduğu gerçeğini işaretlemek istedim.
Damon Smith

1

Tarayıcı, gmail ve dosya tarayıcısından açmak için aşağıdaki gibi filtreyi kullanma (Test Edildi). NOT: Lütfen tarayıcının uygulamanızı yok saymasına neden olacak iki filtreyi birleştirmeyin (Test Edildi).

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

Bu yanıtı Gmail ekleriyle test ettiniz mi?
IgorGanapolsky

0

Https://developer.android.com/training/sharing/receive adresini okuyun , bu, başlamanıza yardımcı olabilir. daha sonra, manifest dosyasında, alıcıyı açılacak etkinliğe kaydederken aşağıdaki amaç filtresini deneyin

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

uzantının "." olmadan sağlandığından emin olun . içinde

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.