読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

Xamarin (Android) アプリをブラウザから起動する

Xamarin Advent Calendar 2016 7日目の記事です。

概要

Xamarin で作った Android アプリをブラウザから起動できるようにしてみます。
プロジェクト自体は Xamarin.Forms で作っていますが、筆者の環境の都合上、Android にしか対応してません。すまぬ。

サンプルプロジェクト

本記事のサンプルプロジェクトは以下にあげてあります。Visual Studio 2015 (要 Xamarin) で動くはず。

対応の仕方:Activity に IntentFilter 属性を付ける

Xamarin.Forms の Droid プロジェクトの中にある Activity クラスの定義が以下のようになっていると思いますが、

[Activity(....)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    ....


こんな感じに IntentFilter を入れてあげると "{任意スキーム}://{名前}" のような URI 指定でアプリを開けるようになります。

....
using Android.OS;
using Android.Content;
....
[Activity(....)]
[
    // この IntentFilter 指定により、
    // "hogeapp://main?param1=aaa&param2=bbb" のような URI でアプリを開くことができるようになる.
    IntentFilter(
        new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
        DataScheme = "hogeapp",
        DataHost = "main"
    )
]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    ....

HTML 側

以下のようなリンクを作ってあげれば良いだけです。これをクリックすると該当アプリが立ち上がります。

<a href="hogeapp://main">Launch</a>


以下のようにパラメータを付けることもできます。

<a href="hogeapp://main?param1=aabbcc&hoge=fuga&xyz=1000">Launch</a>

アプリ側でのパラメータ受け取り

これも今回は Android 側の対応しか書けず恐縮ですが、以下のようにして起動時のパラメータを取得することができます。

if (Intent.ActionView.Equals(Intent.Action))
{
    Android.Net.Uri uri = Intent.Data;
    if (uri != null)
    {
        // "hogeapp://main?param1=aabbcc&hoge=fuga&xyz=1000" で起動されていれば
        // ここでは "aabbcc" という文字列が取得できる。
        string param1 = uri.GetQueryParameter("param1");
    }
}

実行結果

今回は http://dev.clock-up.jp/hoge.html にサンプル HTML を設置して実験を行いました。


このページ内の2番目のリンクをクリックすると、
f:id:kobake:20161206224144p:plain:w300


こんな感じに🍣パラメータを受け取った状態のアプリが開きます。
f:id:kobake:20161206224150p:plain:w300

おしまい

この仕組みは OAuth 認証でブラウザからアプリに戻るとき等にも活躍したりします。そのあたりの解説についてはまた別の機会にでも。

});