특정 파일 확장자에 대한 Android 인 텐트 필터?


93

'net에서 특정 확장자를 가진 파일을 다운로드하고이를 처리하기 위해 내 애플리케이션으로 전달하고 싶지만 인 텐트 필터를 파악할 수 없었습니다. 파일 유형은 MIME 유형에 포함되어 있지 않으며

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

그러나 나는 그것을 작동시킬 수 없었다.

답변:


120

이 작업을 수행하기 위해 AndroidManifest.xml에서 내 활동을 정의한 방법은 다음과 같습니다.

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

scheme의는 file로컬 파일 (오히려 HTTP와 같은 프로토콜보다) 열 때 이런 일이되어야 함을 나타냅니다.

mimeType*/*모든 MIME 유형과 일치 하도록 설정할 수 있습니다 .

pathPattern일치시킬 확장자를 지정하는 위치입니다 (이 예에서는 .kdb). .*시작 부분에 문자의 squence 일치합니다. 이러한 문자열에는 이중 이스케이프가 필요하므로 \\\\.리터럴 마침표와 일치합니다. 그런 다음 파일 확장자로 끝납니다. pathPattern의 한 가지주의 사항 .*은 이것이 정규 표현식 인 경우 예상 할 수있는 욕심 많은 일치가 아니라는 것입니다. 이 패턴은 .앞에 가 포함 된 경로와 일치하지 않습니다 .kdb. 이 문제 및 해결 방법에 대한 자세한 내용은 여기를 참조 하십시오.

마지막으로 Android 문서에 따르면 속성이 작동 하려면 hostscheme속성이 모두 필요 pathPattern하므로 모든 항목과 일치하도록 와일드 카드로 설정하면됩니다.

이제 .kdbLinda File Manager와 같은 앱에서 파일 을 선택하면 내 앱이 옵션으로 표시됩니다. 이것만으로는 브라우저에서이 파일 형식을 다운로드 할 수 없다는 점에 유의해야합니다. 이것은 파일 체계에만 등록되기 때문입니다. 전화에 Linda File Manager와 같은 앱이 있으면 일반적으로 모든 파일 형식을 다운로드 할 수 있습니다.


3
여기서는 작동하지 않습니다. 먼저 mimeType = " "을 사용하면 패키지가 Android 2.1에 설치되지 않고 MalformedMimeTypeException이 발생합니다. "* / "를 사용하면 이 문제가 해결되지만이 필터는 효과가 없습니다. 저는 현재 표준 Android 브라우저처럼 MIME 유형의 다운로드를 보존하지 않는 Skyfire 브라우저로 테스트하고 있습니다. 그리고 Skyfire 다운로드 목록에서 파일을 클릭하면 단순한 VIEW 인 텐트가 파일 데이터와 함께 브로드 캐스트됩니다. 그리고이 인 텐트 필터는 일치하지 않습니다.
olivierg

@Brian Pellin : .kdbx이 게시물을봤을 때 ES 파일 탐색기가 kdbx 파일을 열 수 있도록 mime 유형을 확장에 바인딩하는 방법을 실제로 찾고 있었습니다. 인 텐트에 빈 MIME 유형이 있으면이 인 텐트 필터가 작동하지 않습니다 !! 또한 EMPTY 문자열을 작업으로 사용하고 URI 만있는 인 텐트를 가질 수도 있습니다. Google 문서는 그 의도에 응답 했으므로 유효해야합니다.
billc.cn 2011 년

2
그냥 명확하게하기 위해, mimeType를은 "*이 * /"나는 어떤 사람들은 자신의 *의 탈출하는 것을 잊었다 생각해야한다
브라이언 Pellin을

1
Android 4에서는 작동하지 않습니다 <data>. 태그에 4 개의 속성을 사용해야 합니다. 태그 4 개를 갖는 것은 논리적 OR (Android 2에서 작동 함)이지만 Android 4는 더 엄격합니다. 참조 stackoverflow.com/questions/20650378/…
Martin

3
경우 \\\\.리터럴 기간 일치, 당신은 왜 형성을 사용하지 않는 .kdb이 같은 확장 : \\\\.kdb?
Lealo

36

이 주제에 대한 많은 잘못된 정보가 있습니다. 특히 Google의 자체 문서에 있습니다. 이상한 논리를 감안할 때 가장 좋은 것은 소스 코드뿐입니다.

텐트 필터 구현 에는 설명을 거의 무시하는 논리가 있습니다. 파서 코드는 퍼즐의 다른 관련 작품이다.

다음 필터는 현명한 행동에 매우 가깝습니다. "file"스키마 의도에 대한 경로 패턴이 적용됩니다 .

전역 MIME 유형 패턴 일치는 파일 확장자가 일치하는 한 모든 유형과 일치합니다. 이것은 완벽하지는 않지만 ES 파일 탐색기와 같은 파일 관리자의 동작을 일치시키는 유일한 방법이며 URI / 파일 확장자가 일치하는 의도로 제한됩니다.

나는 "http"여기 와 같은 다른 구성표를 포함하지 않았지만 아마도 이러한 모든 필터에서 잘 작동 할 것입니다.

이상한 구성표는이며 "content", 필터에서 확장을 사용할 수 없습니다. 그러나 공급자가 MIME 유형을 명시하는 한 (예 : Gmail은 방해받지 않고 첨부 파일에 대해 MIME 유형을 전달합니다) 필터가 일치합니다.

주의해야 할 사항 :

  1. 필터에서 일관되게 작동하는 것은 없으며 특수한 경우의 미로이며 최소한의 놀라움 원칙 위반을 설계 목표로 취급합니다. 패턴 일치 알고리즘 중 어떤 것도 동일한 구문이나 동작을 따르지 않습니다. 필드의 부재는 때때로 와일드 카드이고 때로는 그렇지 않습니다. 데이터 요소 내의 속성은 때때로 함께 연결되어야하고 때로는 그룹화를 무시해야합니다. 정말 더 잘할 수있었습니다.
  2. scheme과는 host지정해야합니다 path규칙 (현재 구글의 API 가이드에 반하는)와 일치 할 수 있습니다.
  3. 최소한 ES 파일 탐색기는 MIME 유형이 ""인 인 텐트를 생성합니다.이 유형은와 매우 다르게 필터링 null되고 명시 적으로 일치하는 것이 불가능하며 위험한 "*/*"필터에 의해서만 일치 될 수 있습니다 .
  4. "*/*"필터는 함께 텐트를 일치하지 않습니다 null전혀 MIME 타입이 특정 사건에 대해 별도의 필터가 필요합니다 - MIME 타입.
  5. "content"원본 파일 이름 (적어도 Gmail을) 의도에서 사용할 수 없기 때문에 계획은, MIME 타입과 일치 할 수 있습니다.
  6. 별도의 속성 그룹화 "data"요소는 특정의의를 제외하고, 해석에 (거의) 무관 hostport- 함께 쌍을 할 수있다. 다른 모든 것은 "data"요소 내에서 또는 "data"요소 간에 특정 연관이 없습니다 .

이 모든 것을 염두에두고 다음은 주석이있는 예입니다.

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

\\ .. 계속해서 그리고 다른 단점에 대한 많은 증거 된 필요에 맞설 수 있다는 것이 좋습니다. 구글은이 문제를 4.2로 고쳐야 만했다. 아아, 여전히 귀하의 예가 해결되지 않는 경우가 있습니다. 내 코드가 3 글자 이하로 잘 작동하는 ".gblorb"와 같은 6 개의 cha 확장자에 문제가 있습니까?
RoundSparrow hilltx

이 질문에 대한 최고의 답변과 내 의견으로는 비슷한 질문! 안타깝게도 파일 확장자로 콘텐츠 의도를 일치시킬 수없는 한 (5에서 지적했듯이) 잘못된 의도와 일치하지 않고 모든 올바른 의도를 안정적으로 필터링 할 수 없습니다. 이것은 사용자 정의 MIME 유형을 사용할 수없는 경우입니다. Android가 이에 대한 솔루션을 제공하지 않는 한 앱 내에서 파일 선택자가 될 것입니다. 사용자를 일관되지 않은 행동으로 혼동하고 싶지 않습니다.
Benjamin Bisinger 2017 년

1
고마워 .. 오늘 하루를 보내 셨군요 .. 제 경우에는 <data android:mimeType="*/*" /> 세 가지 옵션 모두 에서처럼 MimeType을 변경 해야했는데 Google 드라이브와 Gmail을 포함한 모든 앱에서 매력처럼 작동했습니다.
Rishabh Wadhwa

1
정말 감사합니다, @David Sainty. 당신은 그것을 처리하는 방법을 알아 내려는 나의 24 시간의 고뇌를 끝장 냈다. 나는 stackoverflow.com/q/18577860/6110285 , stackoverflow.com/a/8599921/6110285 및 유사한 더 많은 것을 시도했습니다 . 이것은 일한 유일한 사람입니다.
pittix

24

Android의 파일 시스템에서 이메일과 파일의 첨부 파일을 여는 간단한 작업이 그 어느 때보 다 미친 경험 중 하나 였다는 것을 인정해야합니다. 너무 많은 파일을 처리하거나 너무 적은 파일을 처리하기 쉽습니다. 하지만 제대로하는 것은 어렵습니다. stackoverflow에 게시 된 대부분의 솔루션이 제대로 작동하지 않았습니다.

내 요구 사항은 다음과 같습니다.

  • 내 앱이 내 앱에서 공유 한 첨부 파일을 처리하도록합니다.
  • 내 앱이 내 앱에서 생성하고 특정 확장자를 가진 filestorage의 파일을 처리하도록합니다.

아마도이 작업을 수행하는 가장 좋은 방법은 첨부 파일에 대한 사용자 지정 MIME 유형을 지정하는 것입니다. 또한 사용자 정의 파일 확장자를 사용하도록 선택할 수도 있습니다. 따라서 우리 앱이 "Cool App"이고 끝에 ".cool"가있는 첨부 파일을 생성한다고 가정 해 보겠습니다.

이것은 내가 내 목표에 가장 가깝고 작동합니다 ... 만족 스럽습니다.

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

메모:

  • pathPattern첨부 파일에 대해 다소 무시 되는 것 같습니다 (사용시 android:scheme="content"). 누군가가 특정 패턴에만 응답하는 pathPattern을 얻는다면 나는 그 방법을보고 기뻐할 것입니다.
  • android:host="*"속성을 추가하면 Gmail 앱이 선택기에 내 앱을 나열하는 것을 거부했습니다 .
  • intent-filter블록이 병합 되면 여전히 작동 하지만 이것을 확인하지 않았습니다.
  • 파일을 다운로드 할 때 브라우저의 요청을 처리하려면를 android:scheme="http"사용할 수 있습니다. 특정 브라우저는 android:mimeType실험을 엉망 android:mimeType="*/*"으로 만들고 디버거에서 실제로 전달 된 내용을 확인한 다음 필터링을 강화하여 모든 것을 처리하는 성가신 앱이되지 않도록합니다 .
  • 특정 파일 탐색기는 파일의 MIME 유형도 엉망으로 만듭니다. 위의 내용 intent-filter은 Galaxy S3에서 삼성의 "내 파일"앱으로 테스트되었습니다. FX Explorer는 여전히 파일을 제대로 열지 못하며 앱 아이콘이 파일에 사용되지 않는 것으로 나타났습니다. 다시 말하지만, 누군가가 작동하게된다면 아래에 의견을 말하십시오.

이 기능이 유용하고 가능한 모든 조합을 통해 하루를 낭비하지 않아도되기를 바랍니다. 개선의 여지가 있으므로 의견을 환영합니다.


이것은 나를 위해 작동하는 솔루션입니다. Content-Scheme 및 File-Scheme에 대해 별도의 <intent-filter>를 등록하는 것이 트릭이었습니다! 감사!
Mehlyfication 2015 년

감사! 나를 위해 일했습니다. Galaxy S6의 Gmail 앱과 Samsung My Files 앱 모두 솔루션을 사용하여 내 앱으로 파일을 열 수있었습니다!
Haris 2015 년

"앱 이름"이 정확히 무엇입니까? (내 경우, 사람이 읽을 수있는 응용 프로그램의 이름은 공백이 있습니다.)
윌리엄 Jockusch

@WilliamJockusch @DavidSainty는 단순히 문자열 리소스 파일에 응용 프로그램 이름을 저장하는 것처럼 보입니다. 공백은 괜찮을 것입니다. 인 android:label텐트 필터에 사용되는 문자열은 사용자가 선택기 메뉴에서 볼 수있는 문자열입니다. 기본적으로 응용 프로그램 이름이 사용됩니다.
omahena

"Google 드라이브"앱은 무엇을 사용해야합니까?
안드로이드 개발자

9

위의 Brian의 대답은 저에게 90 %를 얻었습니다. 끝내기 위해 MIME 유형에 대해

android:mimeType="*/*"

나는 이전 포스터가 동일한 세부 사항을 게시하려고 시도했지만 별표 슬래시 별을 코드로 표시하지 않아도 stackoverflow는 단순히 슬래시로 표시합니다.


2
이것으로 모든 파일 형식을 처리하고, 그 (앱이 참으로 모든 것을 처리하는 경우를 제외하고도) 정말 짜증나
팀 Autin

이것은 나쁘다. 앱 내에서이 작업을 수행하지 마십시오.
Mars

8

대신 이 특정 콘텐츠의 MIME 유형 값으로 android:pathtry android:mimeType. 또한 android:path와일드 카드를 허용하지 않습니다 android:pathPattern.이를 위해 사용하십시오 .


"파일 유형이 MIME 유형에 포함되어 있지 않습니다"? 동일한 단어를 사용하지 않더라도 다운로드중인 콘텐츠 유형에 대한 MIME 유형이 있어야합니다.
Eric Mill

콘텐츠 유형에 대한 MIME 유형이 있지만 파일은 다른 확장자를 사용하는 타사 응용 프로그램에서 생성되므로 해당 MIME 유형으로 인식되지 않을 것입니다.
Curyous

7

나는 이것이 오랫동안 작동하도록 노력해 왔으며 기본적으로 모든 제안 된 솔루션을 시도했지만 여전히 Android가 특정 파일 확장자를 인식하도록 할 수 없습니다. 나는 "*/*"작동하는 것처럼 보이는 유일한 MIME 유형을 가진 인 텐트 필터를 가지고 있으며 파일 브라우저는 이제 파일 열기 옵션으로 내 앱을 나열하지만 이제 내 앱은 모든 종류의 파일을 여는 옵션으로 표시됩니다. pathPattern 태그를 사용하여 특정 파일 확장자를 지정했습니다. 지금까지 연락처 목록에서 연락처를 보거나 편집하려고 할 때도 Android에서 내 앱을 사용하여 연락처를 볼 것인지 묻는 메시지가 표시되며, 이는 이러한 상황이 발생하는 여러 상황 중 하나 일뿐입니다.

결국 나는 실제 Android 프레임 워크 엔지니어가 답변 한 비슷한 질문이있는이 Google 그룹 게시물을 발견했습니다. 그녀는 Android는 파일 확장자에 대해 아무것도 모르고 MIME 유형 ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ) 만 알 수 있다고 설명합니다 .

그래서 제가보고 시도하고 읽은 것에서 안드로이드는 단순히 파일 확장자를 구별 할 수 없으며 pathPattern 태그는 기본적으로 엄청난 시간과 에너지 낭비입니다. 운 좋게도 특정 MIME 유형 (예 : 텍스트, 비디오 또는 오디오)의 파일 만 필요하면 MIME 유형이있는 인 텐트 필터를 사용할 수 있습니다. 그러나 Android에서 알지 못하는 특정 파일 확장자 또는 MIME 유형이 필요하면 운이 좋지 않습니다.

내가 이것에 대해 틀렸다면 지금까지 모든 게시물을 읽고 내가 찾을 수있는 모든 제안 된 솔루션을 시도했지만 아무것도 작동하지 않았습니다.

이런 종류의 일들이 Android에서 얼마나 흔한 지, 개발자 경험이 얼마나 망가 졌는지에 대해 한두 페이지 더 쓸 수는 있지만, 제 분노한 외침을 구해 드리겠습니다.). 누군가 문제를 해결했으면 좋겠습니다.


1
답변이 유용한 링크를 제공하고 반대 투표자가 댓글을 남기지 않았기 때문에 찬성했습니다. 미안해서 가끔 그렇게 비우호적 일 수 있지만 그만 두지 마십시오.
John Hatton

4

2020 업데이트

Android는 인 텐트 필터 용 콘텐츠 URI 및 MIME 유형으로 이동했습니다.

문제

콘텐츠 URI는 반드시 파일의 확장자 나 이름을 포함 할 필요는 없으며 콘텐츠 / 파일을 제공하는 다른 응용 프로그램간에 다릅니다.

다음은 동일한 이메일 첨부 파일에 대한 여러 이메일 애플리케이션의 콘텐츠 URI 예입니다 .

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

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

삼성 이메일 앱-> content://com.samsung.android.email.attachmentprovider/1/1/RAW

보시다시피 그들은 모두 다르며 실제 파일과 관련된 내용을 포함한다고 보장하지 않습니다. 따라서 android:pathPattern대부분이 제안한 것처럼 사용할 수 없습니다 .

이메일 첨부 파일에 대한 해결 방법

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

테스트를 통해 Gmail, Outlook 및 Samsung Email에서 사용하는 MIME 유형을 찾아서 인 텐트 필터에 추가했습니다.

주의 사항 / Gotchas

  • 위의 솔루션으로 바이너리 유형의 파일을 열면 자동으로 앱이 실행된다는 것을 알았습니다. 파일을 구문 분석 할 수없는 경우 실패 상태를 표시하여 내 활동에서 이것을 처리했습니다. 나는 이것이 매우 드문 이벤트라고 생각했기 때문에 받아 들일 것입니다.

  • <data android:mimeType="*/*"/>텐트 필터를 추가하지 않고는 파일 브라우저를 통해 내 앱을 실행할 수있는 방법을 찾을 수 없습니다 . 사용자가 휴대폰에서 파일을 클릭 때마다 내 앱이 실행되기 때문에 사용할 수 없었습니다 (사용자 지정 파일 확장 파일뿐만 아니라). 나는 이것을 의도 필터에 추가하지 않는 것이 좋습니다.

마지막 생각들

  • 현재 Android의 특정 확장 유형과 앱을 연결하는 우아한 솔루션은 없습니다. 제 상황에서 할 수있는 최선의 방법이었습니다.

고마워요, 그것은 작동하고, 안드로이드 7에서 2020 년 10 월 테스트
가혹한

3

Brian의 대답은 매우 비슷하지만 자체 사용자 지정 확장으로 파일을 열려고 할 때 앱을 호출 할 수있는 깨끗하고 오류없는 방법이 있습니다 (체계 나 호스트 필요 없음).

<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 문서에 따르면 pathPattern 속성은 스키마와 호스트가 지정된 경우에만 의미가 있으며이를 확인했습니다. developer.android.com/guide/topics/manifest/data-element.html
Brian Pellin

4
-1; 이것은 모든 파일 과 일치 합니다. Brian의 의견은 정확하고 mimeType = " / " 의 사소한 수정으로 그의 원래 예제는 완벽합니다.
Nick

이 게시물은 오래 전부터 있지만 "/"가 설치되지 않은 경우입니다. 모든 파일 유형과 일치하는 "* / *"가 필요합니다 (이 말을하려는 경우 확실하지 않음). 따라서 프로그램은 비디오 또는 mp3를 열도록 요청받을 수 있습니다. 나는 이것에 대한 해결책을 아직 찾지 못했습니다.
Rene

<data>4 개의 속성이있는 하나의 태그를 사용해야 합니다. 귀하의 솔루션은 안드로이드 2 작동 할 수 -하지만 규칙은 더 엄격하게되었다 : stackoverflow.com/questions/20650378/...
마틴

이상한 pathPattern은 무엇입니까? 그리고 hostscheme필요합니다!
IgorGanapolsky

3

Android 4에서는 규칙이 예전보다 더 엄격 해졌습니다. 사용하다:

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

3

나는 사용자 정의 파일 확장자를 위해 이것으로 꽤 어려움을 겪었습니다. 많은 검색 끝에 Android의 patternMatcher 클래스 (인 텐트 필터에서 pathPattern 일치에 사용됨)가 경로의 다른 위치에있는 일치 패턴의 첫 번째 문자를 포함 할 때 예상치 못한 동작이 있다는 것을 포스터가 발견 한이 웹 페이지 를 발견했습니다. (예를 들어 "* .xyz"를 일치시키려는 경우 경로에 "x"가 있으면 patternMatcher 클래스가 중지됩니다). 다음은 그가 해결 방법을 찾았고 저를 위해 일한 것입니다.

PatternMatcher는 IntentFilter에서 pathPattern에 사용됩니다. 그러나 PatternMatcher의 알고리즘은 저에게 상당히 이상합니다. 다음은 Android PatternMatcher의 알고리즘입니다.

문자열 중간에 '. *'패턴의 '다음 문자'가 있으면 PatternMatcher는 해당 지점에서 루프를 중지합니다. (Android 프레임 워크의 PatternMatcher.java를 참조하십시오.)

전의. string : "이것은 내 첨부 파일입니다"패턴 : ". att. ". Android PatternMatcher는 '. '패턴의 다음 문자를 만날 때까지 패턴 (이 예에서는'a ') 그래서'. '일치하는 루프는 인덱스 8에서 멈 춥니 다-'is '와'my '사이의'a '. 따라서이 일치의 결과는 'false'를 반환합니다.

아주 이상하지 않습니까? 이 문제를 해결하려면-실제로 가능성을 줄이려면-개발자는 성가신 멍청한 pathPattern을 사용해야합니다.

전의. 목표 : '메시지'가 포함 된 매칭 uri ​​경로.

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

이것은 특히 사용자 정의 파일 확장과 일치 할 때 발생합니다.


관심있는 사람을 위해 code.google.com에
benjamin davis

3

Android의 system = wide MIME 데이터베이스에서 접미사가 MIME 유형으로 등록되지 않은 경우 위의 어느 것도 VIEW 또는 SEND 작업에 대해 제대로 작동하지 않습니다. 지정된 접미사에 대해 발생하는 유일한 설정은를 포함 android:mimeType="*/*"하지만 모든 파일에 대해 작업이 발생합니다. 분명히 당신이 원하는 것이 아닙니다!

Android MIME 데이터베이스에 MIME과 접미사를 추가하지 않고는 적절한 솔루션을 찾을 수 없습니다. 지금까지 그렇게 할 방법을 찾지 못했습니다. 누구나 알고 있다면 포인터가 훌륭 할 것입니다.


2

인 텐트가를 충족하는 intent-filter경우 intent-filter요구 사항 은 다음과 같습니다 (체크리스트를 상상해보십시오).

  • 모든 일치 <action>
  • 모든 일치 <category>
  • 모든 일치 <data mimeType>(쉬운 수정 : " / ")
  • 선택적으로 :

    • 일치하는 <data scheme>(쉽게 수정 : <data android:scheme="file" /> <data android:scheme="content" />)

    • 모든 일치 <data host>(쉬운 수정 : "*")

    • 모든 일치 <data pathPattern/etc.>(예 .*\\.0cc:)

여러 <data $type="">요소를 정의 하면 $ type 상자 <data $type=>Intent.

mimeType을 생략 intent-filter하면 중복되는 것처럼 보이지만. 생략 <data scheme/host/pathPattern>하면 필터가 모든 항목과 일치합니다.

https://f-droid.org/en/packages/de.k3b.android.intentintercept/모든 인 텐트 를 수신하도록 설계된 앱으로 인 텐트를 검사 할 수 있습니다. Simple File Manager를 통해 열린 인식 할 수없는 파일 확장자가 MIME 유형으로 제공된다는 것을 알게되었습니다 application/octet-stream.

https://stackoverflow.com/a/4621284/2683842는 것을보고 <data pathPattern=> .*xyz처음에 중단한다을 x가보고하고, 다음에하지 않을 경우 즉시 실패합니다 yz. 그래서 /sdcard/.hidden/foo.0cc통과하지 않습니다 .*\\.0cc당신이 시도하지 않는 .*\\..*\\.0cc대신.

  • 이 해결 방법이 필요한지 확인하지 않았습니다.

최종 결과 :

<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

파일을 Gmail, Dropbox 또는 내장 Android 파일 도구에서 직접 열려면 다음 코드를 사용하십시오 (Gmail에서 파일에 연결할 수 없도록 만든 'android : host = "*"'삭제).

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

데이터 필터는 Android 버전 4.x에 따라 하나의 문으로 작성되어야합니다.


나는 안드로이드 브라우저 다운로드 및 열기가 올바르게 작동하도록 모든 것을 시도했습니다. 귀하의 솔루션은 Android 기본 브라우저 및 Android Chrome에서 잘 작동하지만 android firefox는 여전히 텍스트 창에서 내 파일을 여는 것 같습니다. 사용자 지정 MIME 유형 및 사용자 지정 확장입니다. 이전에는 확장 기능 만 사용했지만 파이어 폭스에서만 작동했습니다. 이제 Firefox (gmail 포함)를 제외한 모든 곳에서 작동합니다. 아직 테스트 중이지만 여기에 새로운 크로스 브라우저 문제가 있다는 사실을 알리고 싶었습니다.
Damon Smith

1

아래 필터를 사용하여 브라우저, Gmail 및 파일 브라우저에서 엽니 다 (테스트 됨). 참고 : 두 개의 필터를 병합하지 마십시오. 그러면 브라우저에서 앱이 무시됩니다 (테스트 됨).

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

Gmail 첨부 파일로이 답변을 테스트 했습니까?
IgorGanapolsky

0

https://developer.android.com/training/sharing/receive를 읽으십시오 . 시작하는 데 도움이 될 수 있습니다. 그런 다음 매니페스트 파일에서 열릴 활동에 수신자를 등록 할 때 아래 의도 필터를 시도하십시오.

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

확장자가 "."없이 제공되었는지 확인하십시오 . 그것에

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.