How did intent-filter change from Android 2 to And

2019-02-28 07:04发布

问题:

I have the following intent-filter in my AndroidManifest.xml which works perfectly well in Android 2.x.x and does not do anything in Android 4.x.x:

  <intent-filter
    android:icon="@drawable/ic_fx_603p_pf"
    android:label="FX-603P Program File"
    android:priority="1"
  >
    <category
      android:name="android.intent.category.DEFAULT"
    ></category>
    <action
      android:name="android.intent.action.VIEW"
    ></action>
    <data
      android:host="*"
      android:pathPattern=".*\\.pf"
      android:scheme="file"
    ></data>
  </intent-filter>

The question is: What has changes and how can I make the intent work again?

The expected behaviour: In selecting a file with *.pf extension in a file-manger (like Astro) my application should be started and the file should be opened. Also the file-manger should use us the provided icon to visualize the file.

回答1:

Well after some experimenting I found out that android:mimeType is not mandatory. Therefore the solution is:

  <intent-filter
    android:icon="@drawable/ic_fx_602p_pf"
    android:label="FX-602P Program File"
    android:priority="1"
  >
    <category
      android:name="android.intent.category.DEFAULT"
    ></category>
    <action
      android:name="android.intent.action.VIEW"
    ></action>
    <data
      android:host=""
      android:mimeType="*/*"
      android:pathPattern=".*\\.pf"
      android:scheme="file"
    ></data>
    <data
      android:host="*"
      android:mimeType="application/x-fx-602p.program"
    ></data>
  </intent-filter>

As a little extra I found out that an <intent-filter> can have two ore more <data> tags. If either match the intent is called (logical OR)

Inside a tag all attributes must match (logical AND).

However there is a problem with this solution: It seems there is a bug in Android 2.x and the attributes of the <data> are not strictly treated logical AND resulting in all files being matched when the android:mimeType attribute is set. Ah well, you can't have it both ways and will go with the future if that is the case.