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

Xamarin 日本語情報

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

【小ネタ】Mac OS X でファイルパス/フォルダパスをクリップボードにコピーする

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

f:id:ytabuchi:20170222195948p:plain:w600

例えばこんな時、別のフォルダのパスをシュッとクリップボードに取得したいなと思っていました。

結論から言うと、右クリックした後で「option」ボタンを押すと、ファイルコピーの項目がパス名をコピーに変わります。そんなん分かるかい!!ww 対象のフォルダ、ファイルを選択し、「⌘+option+C」で一発でパスがコピーできるみたい。すごい。

f:id:ytabuchi:20170222195650p:plain:w600

f:id:ytabuchi:20170222195644p:plain:w600

見つける前に呟いたところ、「パスバー」なるものを教えてもらいました。これも便利そう。ありがとうございます!!

f:id:ytabuchi:20170222195629p:plain:w300

Finder のメニューから[表示>パスバーを表示]です。

f:id:ytabuchi:20170222201612p:plain:w600

こんなのが出てパスがわかるのでこれも便利ですね。

以上です。

Visual Studio/Xamarin Studio でコードスニペットを活用しよう

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

PropertyChanged 用のコードスニペットや BindableProperty 用のコードスニペットはあるとないとではかなり開発効率に差がありそうです。@ticktackmobile さんのトレーニング中に BindableProperty はコードスニペットで。というお話をもらい、PropertyChanged 用は作ってましたが BindableProperty 用は無かったなと思い、エントリーを書きました。一つ新発見もありましたので、感謝です。

今回は BindableProperty 用のスニペットを作ってみましょう。

Visual Studio の場合

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Bindable Property</Title>
            <Shortcut>binp</Shortcut>
            <Description>Code Snippet for Bindable Property</Description>
            <Author>Yoshito Tabuchi</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>type</ID>
                    <ToolTip>property type</ToolTip>
                    <Default>double</Default>
                </Literal>
                <Literal>
                    <ID>property</ID>
                    <ToolTip>property name</ToolTip>
                    <Default>MyProperty</Default>
                </Literal>
                <Literal default="true" Editable="false">  
                    <ID>classname</ID>
                    <ToolTip>Class name</ToolTip>
                    <Function>ClassName()</Function>
                    <Default>ClassNamePlaceholder</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[public static readonly BindableProperty $property$Property =
                  BindableProperty.Create(nameof($property$), typeof($type$), typeof($classname$), default($type$));

              public $type$ $property$
              {
                  get { return ($type$)GetValue($property$Property); }
                  set { SetValue($property$Property, value); }
              }
          ]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

Bindable Property の沢山ある引数のうち、必須項目を含む最初の4項目を用意しました。

上記ファイルを xxxx.snippet と任意の名前で Visual Studio 2015 フォルダ\Code Snippets\Visual C#\My Code Snippets フォルダに配置しましょう。

後は <Shortcut> に登録した短縮文字で呼び出すだけです。

f:id:ytabuchi:20170221205249p:plain:w600

こんな感じで2ヶ所入力すれば完成です。ポイントは、コード スニペットの関数 にあるように、ClassName() を使うと「挿入されたスニペットが格納されているクラスの名前を返します。」というところですね。

<Literal default="true" Editable="false">  
    <ID>classname</ID>
    <ToolTip>Class name</ToolTip>
    <Function>ClassName()</Function>
    <Default>ClassNamePlaceholder</Default>
</Literal>

の部分です。

Xamarin Studio の場合

f:id:ytabuchi:20170221205436p:plain:w600

Xamarin Studio はファイルではなく、設定で行います。設定を開き、[テキストエディター>コードテンプレート]の[追加]ボタンをクリックします。

f:id:ytabuchi:20170221211525p:plain:w600

上記のような感じで、[ショートカット]に任意の短縮文字、[グループ]は C#、[説明]に任意の説明、[Mime]に text/x-csharp を指定し、[拡張可能なテンプレート]にチェックを入れます。

[テンプレートテキスト]の部分は VS と同じで大丈夫です。

public static readonly BindableProperty $property$Property = 
    BindableProperty.Create(nameof($property$), typeof($type$), typeof($classname$), default($type$));

public $type$ $property$
{
    get { return ($type$)GetValue($property$Property); }
    set { SetValue($property$Property, value); }
}

右側のドロップダウンでテキスト内で指定したリテラルの仕様を決められます。クラス名を取ってくる Function が VS と異なり、GetCurrentClassName() となりますのでご注意ください。

f:id:ytabuchi:20170221211849p:plain:w300

後は呼び出すだけ。

f:id:ytabuchi:20170221211835p:plain:w600

便利ですね。どんどん使っていきましょう。

XAML 用のコードスニペットの記事は以下で以前書きましたので合わせてどうぞ

ytabuchi.hatenablog.com

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 も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。

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 も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。

Xamarin.iOS で CFBundleDocumentTypes で指定したファイルを受け取れるようにするには

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

本当は Share Extension を使わないといけないんです。テキストの共有をしたい場合は。でも、今回はテキスト「ファイル」を他のアプリから共有する方法をメモします。

公式ドキュメントはこれかな?

developer.apple.com

Share Extensions については以下が詳しいです。

qiita.com

blog.asobicocoro.com

次回以降にちゃんと Share Extensions でテキスト共有したいと思います。

メール添付されたテキストファイルを受け取りたい

テキストファイル、画像ファイル(png, jpg など)など、ファイルを処理したい場合は、Share Extensions を使わなくてもなんとかなります。

safx-dev.blogspot.jp

にもある、

CFBundleDocumentTypes

です。

準備

info.plist を編集します。

Xamarin Studio では Info.plist を開き、[詳細]タブの[ドキュメントの種類]から[ドキュメントタイプの追加]ボタンをクリックして、適切な「Types」を指定してあげれば大丈夫です。

f:id:ytabuchi:20170206221148p:plain:w450

ドキュメントタイプは公式の以下のサイトを参考にしてください。

developer.apple.com

今回は LSItemContentTypespublic.textpublic.png を指定してみました。

Visual Studio では、GUI では設定できないので、右クリックから[ファイルを開くアプリケーションの選択]をクリックし、[自動エディター付きセレクター]を選択して XML の最後に以下を追加します。

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>TEXT</string>
        <key>LSHandlerRank</key>
        <string>Alternate</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.text</string>
        </array>
    </dict>
    <dict>
        <key>CFBundleTypeName</key>
        <string>PNG</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>public.png</string>
        </array>
    </dict>
</array>

PNG の方は Xamarin Studio の GUI で設定したもので LSHandlerRank の記述がありませんが、問題なく共有リストには出て来ました。

こんな感じ

f:id:ytabuchi:20170206225117p:plain:w300

 受け取った後は

AppDelegate クラスの OpenUrl(UIApplication app, NSUrl url, NSDictionary options) メソッドをオーバーライドして受け取り時の処理を追加します。受け取り後、専用の ViewController を呼ぶことも出来ると思います。

f:id:ytabuchi:20170206222446p:plain:w450

NSUrl 型の url に共有されたデータの情報が含まれています。

url.Scheme でデータのスキーマが取得できます。今回はファイルの共有なので「file」です。App Link で独自スキーマを設定した場合は、ここで処理を分岐してください。

file スキーマの場合は、url.AbsoluteString で string 型を取得できるので、今回はファイル名のみ LINQ で抜き出して Static な string のプロパティに格納しました。

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    try
    {
        if (url.Scheme == "file")
        {
            FileData.FileName = url.AbsoluteString.Split('/').Last();
        }
        else if (url.Scheme == "MyApp")
        {
            // CustomUrlSchemeの対応
        }
        return true;
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.InnerException);
    }
    return false;
}

ファイルを受け取ると、アプリ内の Documents/Inbox にファイルが保存されます。

後は、ViewController で

var dir = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var file = Path.Combine(dir, "Inbox", FileData.FileName);
var text = File.ReadAllText(file);

で、Documents/Inbox のファイルを読み込めます。Environment.GetFolderPath(Environment.SpecialFolder.Personal)Documents フォルダなので、後は Combine するだけですね。

Environment.SpecialFolder で取れる各種フォルダは、id:ch3cooh393 酢酸先生の

blog.ch3cooh.jp

が参考になるかと思います。

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 も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。

【レポ】JXUGC #22 最新事例&お前のアプリを説明してもらおうの会 を開催しました

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

すっかり遅くなってしまいましたが、2017/01/28(土) に JXUGC #22 を開催しました。そのレポートです。

まずはご参加くださった皆様、登壇/LTをしてくださった皆様、スタッフをやってくださった皆様、会場を貸してくださったMSさん、ありがとうございました。また、司会を担当してくださった @kazuyukimiyake さん@BEACH_SIDE さん、ありがとうございました!

所感

f:id:ytabuchi:20170205163330p:plain:w450

参加者の皆様のアンケートです。かなり良い満足度だったと思います。登壇者の方々のセッションがすごく面白かったですからね。またいらしてください。

f:id:ytabuchi:20170205164509j:plain:w450

会場の様子

セッションの様子と登壇者の皆様の写真は facebook のグループの写真 にアップしていますのでよろしければご覧ください。

f:id:ytabuchi:20170128145544j:plain:w450

配信の様子。今回は私と@AyaseSH さんで配信を担当しました。実際セッティングからやるのは初めてだったので、手間取ってしまい、開始が遅れてしまいすみませんでした。スタッフで共有している手順書をアップデートしていきますので、なるべく沢山の方に配信担当を経験してもらいたいと思っています。

また、配信用ソフトウェアで Wirecast を使っているんですが、バージョンアップで評価版の仕組みが変わり、ちょいちょい Wirecast のロゴが全面に出てきて嫌ですね。5万円するのでどうしようか悩んでいます。

セッション動画です。

jxug.connpass.com

セッション資料です。

今後の予定

jxug.connpass.com

もう埋まってしまっていますが、Dev Days でやったハンズオンをやります。キャンセル待ちに登録しておくと参加できるかも!

jxug.connpass.com

フェンリルさんの会場をお借りしてのハンズオンがあります。メンターとしてお強い方々も参加されますので、気になることがある方は是非参加してください。

jxug.connpass.com

名古屋では @amay077 さん 作の Xamarin.Forms.GoogleMaps にプルリクを送ってみよう!の会が開催されます。後2名!

これ以降の東京での JXUG はちょっと私の仕事が忙しいのと大阪で Xamarin Dev Days Osaka をやりたいなーと思っているので、私主体でやるやつは暫くお休みするかもですが、メンバーの方々発案の JXUG はあると思うので期待して待っていてくださいね。

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 も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば 弊社ページ を覗いてみてください。

以上です。