近年、Web アプリケーション(以下Web)とネイティブアプリケーション(以下アプリ)の連携は当たり前になってきました。
Webからアプリを呼び出すときは、URL スキームを使います。
実装も簡単なので便利です。

アプリの起動

Web 側の実装

Android の URL スキームは通常、未インストールの場合 Play Store に遷移しませんが、 Play Store に遷移させる事のできる URL スキームの記述方法があります。


今回紹介する URL スキームのフォーマットは、以下の通りです。
例では見やすいように改行と空白をいれていますが、実際にはひとつなぎの文字列として書いてください。

intent:
  HOST/URI-path // Optional host
  #Intent;
  package=[string];
  action=[string];
  category=[string];
  component=[string];
  scheme=[string];
  end;

Android の URL スキームは本来、Intent を発行するために記述します。
そのため、package、action、category、component などは Intent 作成時と同じように設定できます。

では、今回の記述方法を実際にどう使うのかというと、従来の方法で

myapp://detail

という URL スキームを使っていた場合、新しい URL スキームでは以下のようになります。

intent://detail
  #Intent;
  scheme=myaap;
  package=jp.gaprot.android;
  end;

ここで設定している package に対応するアプリが未インストールの場合、package 名から自動的に Play Store への遷移を行ってくれます。
未インストール時の挙動の例として以下に、Twitter のクライアントアプリの URL スキームを貼っておきます。
Android 端末で以下のリンクを開くと Play Store へ遷移します。

intent://post?message=Gaprot#Intent;scheme=twitter;package=com.twitter.android;end;

Android での受け取り

アプリの起動に関して、Android 側での設定方法に違いはありません。
Intent-filter に今まで通りのやり方で設定してください。

値の受け渡し

Web 側の実装

値の受け渡しの仕方ですが、こちらも記述方法が違います。

従来の方法で gaprot という文字列を渡そうとすると、

myapp://detail?id=gaprot

という URL となり、Android アプリ側では Uri をパースして id の値を得ていました。

しかし、今回の記述方法では、

intent://detail
  #Intent;
  scheme=detail;
  package=jp.gaprot.android;
  S.id=gaprot;
  end;

と記述することができます。

ここで重要なのは、S.id=gaprot;という部分です。
これは、String 型の id というパラメータに文字列 gaprot を渡すという意味になります。
この URL スキームでは値を渡す際、型を指定することができます。
そのため、整数値なども以下のように指定することができます。

i.age=13;

ここで気づいた方もいると思いますが、先ほど String 型を指定した際は大文字の S を、Integer 型を指定した際は小文字の i を用いたと思います。
これは、型を指定する際に大文字で記述するのか小文字で記述するのかがそれぞれの型で決まっているからです。
以下に表としてまとめましたので、ぜひご活用ください。

型名 指定する時の文字列
String S
Boolean B
Byte b
Char c
Double d
Float f
Integer i
Long l
Short s

複数の値を渡す際は、以下のように書きます。

intent://detail
  #Intent;
  scheme=detail;
  package=jp.gaprot.android;
  S.id=gaprot;
  i.age=13;
  end;

Android での受け取り

Web での実装方法で、 URL スキーム側にて型を指定して値を渡しました。
つまり、受け取る側は型がきちんと決まった状態で受け取ることができます。

従来の方法では、一度値を取得するために型変換をする必要がありました。
また、実際に情報を持っているのは Intent が持つ Uri クラスのオブジェクトだったため、Uri クラスからクエリパラメータとして取得していました。

しかし、今回の記述方法では、Intent から直接取得することができます。
以下のように取得します。

Intent intent = getIntent();

// id 変数には、"gaprot"が入る
String id = intent.getStringExtra("id");

// age 変数には、13 が入る
Integer age = intent.getIntegerExtra("age");

値の受け渡しにおける注意

今回紹介している URL スキームと従来の書き方とでは、Android 側の値の取得処理も違いました。
つまり、URL スキームの書き方によって Android 側の実装も変える必要が出てきます。
しかし、Twitter のクライアントアプリなど、自分以外の人が作ったアプリに対しその変更を行うことはできません。
そこで、今回の URL スキームの書き方に対して従来の値の渡し方のようにパラメーターをつけることで、従来の値の取得処理をしているアプリにもきちんと値を渡せるようにします。

intent://detail?id=gaprot
  #Intent;
  scheme=detail;
  package=jp.gaprot.android;
  S.id=gaprot;
  end;

まとめ

いかがだったでしょうか。
以上のように、URL スキームもより便利になっています。
より詳しい情報は、以下の公式サイトをご参照ください。
Android intent with Chrome – Google Chrome

公式サイトを見ると今回の記述方法は、Chrome と標準ブラウザでのみ有効となっていますが、こちらで検証したところ Opera ブラウザ、FireFox ブラウザ(FireFox のバージョンが43以上)でも、動作を確認できました。
他のブラウザでも対応しているかもしれませんが、それはまた別の機会にご紹介できればと思います。
それでは皆さん、良き Android ライフを!