2012/10/06

[android]intent-filterのマッチング(URI)

intent-filterがよくわからなくなったので、昔の記事を見直していると、2年前に書いたのがあった。
今も当てはまるのかわからんが、載せておこう。

どうやら、EjectSDを作るときの調査のようで、SDのマウントを見つつ、intent-filterの実装を読んでいたようだ。
当時の私は、やる気があったなぁ。


(2010/08/21)

intent-filterのマッチングは複雑だが、Uriだけのマッチングはもう少しシンプルで、hostやportの一致を見ている。

つまり、こう言えよう。
intent-filterの比較は、intent-filterごとに行われる、と。
今回でいえば、

<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="jp.typepad.hirokumaEjectSD.WIDGET_CONTROL"/>
</intent-filter>


と、

<intent-filter>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<action android:name="android.intent.action.MEDIA_EJECT"/>
<action android:name="android.intent.action.MEDIA_REMOVED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTABLE"/>
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<data android:scheme="file" />
</intent-filter>


だ。
前者はactionのみのため、match()はどれかのactionと一致し(matchAction)、dataはないのでMATCH_CATEGORY_EMPTY+MATCH_ADJUSTMENT_NORMALとなり(matchData)、categoryもないのでmatchData()の結果がそのまま戻り値となる。
MATCH_ADJUSTMENT_MASK でANDとって非0だからマッチした、となるのかな。
後者はactionとschemeがあるので、まずactionがどれかと一致し(matchAction)、schemeがあるのでどれかと一致してMATCH_CATEGORY_SCHEMEとなり(matchData)、categoryはないのでmatchData()の結果がそのまま戻り値となる。
これは MATCH_CATEGORY_MASK でANDするのか?
match()の戻り値をどう使うか、よくわからん。
が、そこはいいとしよう。
intent-filterの分け方としては、
actionのみのintentを受け付けるのであれば、同じintent-filterにまとめてよい
actionとschemeがあるintentを受け付けるのであれば、同じintent-filgerにまとめてよい
categoryを含む場合は完全一致となるので注意すべし
ということになるだろうか。
試していないので、そうなるかわからんが、そうなるんではないかね。
--------------------------------------------------------------------------------
MOUNT/UNMOUNTなどのintentは、schemeとして"file"が付加されている。
送信されるintentはこんな感じだ。

in = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + path));

むむ、ということは、schemeだけでなくpathもあることになる。
しかしご安心を。
matchData()でpathが比較されるのは、addDataAuthority()した場合のみだ。
XMLだと、<auth>タグがそれに該当するはずなのだが・・・ドキュメントにはないな。
ちなみに、IntentFilterクラスには、writeToXml()というメソッドがある。
試してないけど、どうやらXMLに吐きだしてくれるみたいだ。
何か使えるかな?
--------------------------------------------------------------------------------
なお、MOUNT/UNMOUNTを受け付けるには許可が必要となる。
AndroidManifest.xmlに、


<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

がいるのだ。
まあ、忘れていてもlogcatで例外を投げてくれるので、わかりやすいがね。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。