Có rất nhiều thông tin sai lệch về chủ đề này, đặc biệt là từ tài liệu của chính Google. Điều tốt nhất, và dựa trên logic kỳ lạ, có thể là tài liệu thực duy nhất là mã nguồn.
Việc triển khai bộ lọc ý định có logic gần như bất chấp mô tả. Các đang phân tích cú pháp là mảnh khác có liên quan của các câu đố.
Các bộ lọc sau đây khá gần với hành vi hợp lý. Các mẫu đường dẫn được áp dụng cho ý định lược đồ "tệp".
Đối sánh kiểu kịch câm toàn cục sẽ khớp với tất cả các loại miễn là phần mở rộng tệp phù hợp. Đây không phải là hoàn hảo, nhưng là cách duy nhất để phù hợp với hành vi của trình quản lý tệp như ES File Explorer và nó bị giới hạn ở các ý định mà phần mở rộng tệp / URI khớp với nhau.
Tôi chưa bao gồm các lược đồ khác như "http" ở đây, nhưng chúng có thể sẽ hoạt động tốt trên tất cả các bộ lọc này.
Lược đồ kỳ lạ ngoài là "nội dung", mà phần mở rộng không có sẵn cho bộ lọc. Nhưng miễn là nhà cung cấp cho biết kiểu MIME của bạn (Ví dụ: Gmail sẽ chuyển kiểu MIME cho tệp đính kèm không bị cản trở), bộ lọc sẽ khớp.
Những điều cần lưu ý:
- Lưu ý rằng không có gì hoạt động nhất quán trong các bộ lọc, đó là một mê cung của các trường hợp cụ thể và coi việc vi phạm nguyên tắc ít gây bất ngờ nhất làm mục tiêu thiết kế. Không có thuật toán đối sánh mẫu nào tuân theo cùng một cú pháp hoặc hành vi. Sự vắng mặt của một trường đôi khi là một ký tự đại diện và đôi khi không phải. Các thuộc tính trong một phần tử dữ liệu đôi khi phải đi cùng nhau và đôi khi bỏ qua việc nhóm. Nó thực sự có thể được thực hiện tốt hơn.
- Lược đồ VÀ máy chủ phải được chỉ định để các quy tắc đường dẫn phù hợp (trái với hướng dẫn API của Google, hiện tại).
- Ít nhất ES File Explorer tạo ra các ý định với kiểu MIME là "", được lọc rất khác với null, không thể đối sánh rõ ràng và chỉ có thể được đối sánh bằng bộ lọc "* / *" đầy rủi ro.
- Bộ lọc "* / *" sẽ KHÔNG đối sánh Ý định với kiểu MIME rỗng - yêu cầu bộ lọc riêng cho trường hợp cụ thể này không có kiểu MIME nào cả.
- Lược đồ "nội dung" chỉ có thể được đối sánh theo kiểu MIME, vì tên tệp gốc không có sẵn trong ý định (ít nhất là với Gmail).
- Việc nhóm các thuộc tính trong các phần tử "dữ liệu" riêng biệt (hầu như) không liên quan đến việc diễn giải, ngoại trừ máy chủ và cổng cụ thể - chúng kết hợp với nhau. Mọi thứ khác không có liên kết cụ thể trong phần tử "dữ liệu" hoặc giữa các phần tử "dữ liệu".
Với tất cả những điều này, đây là một ví dụ với các nhận xét:
<!--
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>