ブラウザからのインテントの送信について

July 22, 2015

Androidにおいて、インテントをブラウザ上のリンクから送信する際の、その指定方法についてのメモ。

インテントの構造の基本 (1 (2

この分類は私個人の考えによるものですので、正確ではありません。ご注意下さい。

インテントが持つ情報は大きく分けて、主に次のような物で構成される。
(送信側からの視点)

  • データ、MIMEタイプ
    データとファイル形式。データは主にURIのhost + path部で表される部分。
    インテントの場合、データは実体ではなく、場所を示すリンクにしておく事が多い。

  • スキーム(ハンドラ)、動作(action)など
    インテントの受け手の動作を規定する。受け手を限定する場合にも使われる。

  • 分類(category)、componentなどのメタ情報
    インテントの受け手を、受動的に限定する(選択させる余地あり)。インテントフィルタを参照。

  • 追加データ
    用途がはっきりしている場合に、受け手に直接受け渡す追加データ。

  • 送信元(sourceBounds)
    受け手に自分のメタ情報を渡す。ない事が多い。

  • セレクタ、パッケージ(package)*
    インテントの受け手を、能動的に限定する(選択させる余地を無くさせる目的)。

*セレクタとパッケージは、排他的にしか設定できない。

インテント送信リンク

intentスキームを持つURI(intent://...)のリンクを生成し、ユーザーに開いてもらう、あるいはスクリプトで直接そのリンクに移動させることで、ブラウザからインテントが送信される。

このリンクは、例えば、パッケージ指定でのVIEWアクション(既定)なら、

<a href="intent://host/path#Intent;package=pkg.example.ns;end">インテント送信</a>

といったものになる。(3 (4

インテント呼び出しURIの基本構成

上述のURIに指定できる、各値の意味は以下。

  • host/path
    URI(Data)の一部として渡される。

  • #Intent;
    インテントの追加の指定の始まり。

  • package=[namespace];
    送信先のアプリケーションパッケージを限定する。

  • action=[action];
    action:動作の種類を指定する。(e.g. android.intent.action.VIEW)

  • category=[category];
    category:受け取る相手の種類を指定する。

  • scheme=[string]; 受け渡し時のハンドラを指定する。例えば、"intent://...;scheme=myapp;.../"の場合、"myapp://.../"と指定したものと同様になる。

  • end;
    追加の指定の終了。

Extra追加データの指定

putExtra...API等によるような、追加のデータを受け渡す場合、更に下記のような指定を加える。

...;S.extraData=mystring;B.extraFlag=true;...;end

この 'S' や 'B'は、データ種別(型)を表し、'.'の後はその識別子、'='の後はその値と続く。 [=.#:/]など、値にURI上で意味のある文字を含む場合、URIエンコード形式(%xx)にして渡す。

データ種別の記号は以下。

記号 S B b c d f i l s
String Boolean Byte Character Double Float Integer Long Short

解析側実装の詳細

標準ブラウザの実装では、以下の手順でURIが解析される。(5

  1. ハッシュ(#)の位置を確認
    (なければURI全体をデータとしてインテント送信)

  2. 最初が"#Intent;"で始まっているか確認
    (さもなくば旧形式として解析)

  3. データ設定のループ (end;が見つかるまで)
    基本: action category type launchFlags package component scheme sourceBounds
    追加: S B b c d f i l s
    他: SEL (以降をセレクタの設定に切り替える)

  4. セレクタ(SEL)指定があった場合、セレクタを設定

  5. dataを設定

参考文献

  1. Intent | Android Developers (#IntentStructure)

  2. Intent | Android Developers (#setSelector)

  3. Android Intents with Chrome

  4. How do I pass parameters to android Intent in new scheme on chrome? - Stack Overflow

  5. parseUri() in core/java/android/content/Intent.java - Android Source