Mokelab Blog

#34 Android 11の新機能:動的インテントフィルタ

Android 11で、インテントフィルタのMIMEタイプを動的に設定するAPIが追加されました。

インテントフィルタ

インテントフィルタとは、アクティビティなどのコンポーネントがどのような種類のインテントを受け取りたいかを記述したものです。 MainActivityに次のようなインテントフィルタがついているのを見たことがあると思います。

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

特に、アクティビティが暗黙的インテントを受け取れるようにする場合、次のようにdata要素で データの種類(MIMEタイプ)を指定する必要があります。

<activity android:name=".ViewerActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/jpeg"/>
    </intent-filter>
</activity>

AndroidManifest.xmlに記述するので、Android 10以前ではMIMEタイプ部分を動的に設定することができませんでした。

動的インテントフィルタ

Android 11では、このMIMEタイプ部分をアプリ側で動的に設定できるようになりました。

mimeGroupを設定する

まず、data要素のmimeGroup属性で、グループ名をつけます。アプリ本体の場合は任意の文字列でよいのですが、 ライブラリで指定する場合は、他のライブラリとグループ名が衝突するのを避けるため、ドメイン名を逆にしたものに:を付け、その後にグループ名を記述するようにします。 例えばmokelab.comの場合、com.mokelab:myGroupのような指定をします。

<activity android:name=".ViewerActivity">
  <intent-filter>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.DEFAULT"/>
      <data android:mimeGroup="myGroup"/>
  </intent-filter>
</activity>

グループに対し、MIMEタイプを設定する

次に、PackageManagersetMimeGroup()で、グループに対しMIMEタイプを設定します。

val pm = requireContext().packageManager
val types = setOf("image/jpg", "image/jpeg")
pm.setMimeGroup("myGroup", types)

この方法で設定したMIMEタイプは、観測した範囲ではアプリをアンインストールするか、別の値をセットするまで有効です。

設定したMIMEタイプを削除する

何らかの事情で設定したMIMEタイプを削除したい場合は、次のように空のSetを渡します。

val pm = requireContext().packageManager
val types = setOf()
pm.setMimeGroup("myGroup", types)

setMimeGroup()は、引数で受け取ったMIMEタイプのセットで上書きします。そのため、MIMEタイプを一度設定した後、さらに追加したい場合は 差分ではなく、最初にセットしたものまで含める必要がある点に注意しましょう。

まとめ

Android 11の新機能を使って動的にMIMEタイプを設定する方法を紹介しました。この機能が必要となる アプリは少ないと思いますが、使い方を覚えておきましょう。

本サイトではサービス向上のため、Google Analyticsを導入しています。分析にはCookieを利用しています。