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

Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin.Android で暗黙的インテントを受け取るには

Xamarin Xamarin.Android

こんにちは。エクセルソフトの田淵です。

iOS ではアプリ間のデータ共有に CFBundleDocumentType か Share Extensions を使います。Android はどうなんでしょう?Android は Activity 間もアプリ間も Intent という仕組みを使ってデータのやり取りをします。

準備

暗黙的インテントを受け取る Activity を用意して(MainActivity でも良いですが)、以下のような IntentFilter を設定します。

[Activity(Label = "XXXに追加")]
[IntentFilter (new []{ Intent.ActionSend }, 
               Categories = new []{ Intent.CategoryDefault },
               DataMimeType = "text/plain" )]
[IntentFilter(new[] { Intent.ActionSend },
               Categories = new[] { Intent.CategoryDefault, Intent.Category },
               DataMimeType = "image/*")]

Intent.ActionSend, Intent.ActionSendMultiple が基本でしょうか。Intent の Category については以下が詳しそうです。

hyoromo.hatenablog.com

インテントインテント フィルタの公式ドキュメントはこちら

developer.android.com

ビルドすると、テキストや画像を共有すると一覧に出てくるようになります。

f:id:ytabuchi:20170209165550p:plain:w150

受け取り後の処理

例えば Intent.ActionIntent.ActionSendIntent.ActionSendMultiple かを確認して、その後で、MIME Type に応じて処理を分けることになります。

if (Intent.Action == Intent.ActionSend)
{
    if (Intent.Type.Contains("text/"))
    {
        //テキスト処理
        foreach (var key in Intent.Extras.KeySet())
        {
            System.Diagnostics.Debug.WriteLine($"KEY:{key}, VALUE:{Intent.Extras.Get(key)}");
        }
    }
    else if (Intent.Type.Contains("image/"))
    {
        //画像処理(調べ中。ごめんなさい。)
    }
}

MIME Type についての公式ドキュメントはこちら。

developer.android.com

Android では MIME Type がケースセンシティブでマッチングされるので注意。だそうです。この MIME Type は RFC で規定されている MIME Type と同じようです。

Activity で受け取ったデータを処理したら、MainActivity に移動するなり閉じるなりしてください。

未解決

画像の共有を試していたのは、標準の「フォト」アプリなんですが、そこから共有した画像を上記の Activity で受け取ると、android.intent.extra.STREAM のキーに content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F137/REQUIRE_ORIGINAL/NONE/1995203343 が含まれています。型は Java.Lang.Object です。

これを受け取り側の Activity で Stream をハンドルして、BitmapFactory.DecodeStreamAsync() 的なメソッドでファイルに落とし込んだりしたいんですよね。やり方をご存知の方がいたら教えてください。(Teratail 案件?)

Xamarin 気になった方は

是非 ダウンロード して触ってみてください。Visual Studio 2015 をご利用の方は Update 3 にアップデートする際にカスタムインストールで Xamarin を追加しましょう。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の導入支援サービスを始めました。ベースは基本的なアプリを一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは田淵までお問い合わせください(^^)

有償セミナー、トレーニング | Xamarin : XLsoft エクセルソフト

Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。

私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。おなじみの ReSharper (JetBrains)、 や Atlassian の JIRA, Confluence、Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)Windows アプリ、Web ページ、iOS/Android アプリの UI テストができる TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。