KatsuYuzuのブログ

.NET の開発をメインとした日記です。

ストアアプリで自分のアプリからデータを共有する #win8dev_jp #wpdev_jp

f:id:KatsuYuzu:20140801004303j:plain
前回は共有を呼び出すまででしたので、今回は実際にデータを共有します。

データを共有する

共有できるデータはタイトルやテキスト、URL、ファイルなど様々で、共有操作を行うと対応している(そのデータ受け取れるよ!と宣言してくれている)アプリが一覧に表示されます。
ここで注意しないといけないのは、その場面にもっとも適切なデータのみを共有してください。共有したデータがどのように使われるかは相手のアプリ次第です。例えば、画像のみを渡すとアルバムに保管してくれるのに、URLも一緒に渡すと、画像には一切触れられずにURLのみを処理されるなんてことも起こりえます。

  1. ユニバーサルアプリプロジェクトを準備
  2. DataTransferManagerを利用して共有を行う

ユニバーサルアプリプロジェクトを準備

プロジェクトを作成します。前回と同じものです。
f:id:KatsuYuzu:20140730234130p:plain:w400
f:id:KatsuYuzu:20140730234433p:plain:h300

DataTransferManagerを利用して共有を行う

イベントのハンドル
// 任意の場所で購読
DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;

これは画面毎ではなく、どこで記述しても構いません。逆に、一度購読すると、解除するまでは一番最初に購読した処理が動作し続けます。画面毎に共有するデータが違う場合は画面遷移の前後で購読と解除を行うと簡単です。

/// <summary>
/// このページがフレームに表示されるときに呼び出されます。
/// </summary>
/// <param name="e"></param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
}

/// <summary>
/// Page がアンロードされて親 Frame の現在のソースではなくなった直後に呼び出されます。
/// </summary>
/// <param name="e"></param>
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    DataTransferManager.GetForCurrentView().DataRequested -= OnDataRequested;
}

アプリの状態管理がきちんと行えているのであれば、起動時に一度購読して、あとはアプリの状態に合わせてセットする共有データを切り替えれば良いでしょう。

データのセット

DataRequestedEventArgs.Request.Dataのたくさんあるプロパティに対して任意のデータをセットします。

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs e)
{
    e.Request.Data.Properties.Title = "データのタイトル";
    e.Request.Data.Properties.Description = "データの説明";
    e.Request.Data.SetText("共有するテキスト!");
}

ただし、タイトルは必須です。タイトルがない場合やデータがない場合はエラーになります(Windows Phoneはうんともすんとも言わなくなります)。
f:id:KatsuYuzu:20140801002345p:plain

時間がかかるデータやリソースを消費するデータのセット

時間がかかるデータやリソースを消費するデータを共有する場合は、デリゲートを共有して、必要に応じて処理することができます。例えば、ファイルを共有するときに、ファイルが共有できることだけ(デリゲートのみ)を伝えて(ファイルを受け取れるアプリを含む)相手のアプリ一覧を表示し、ファイルが使われる場合はデリゲートの実行、ファイルが使われない場合は時間やリソースがかかるデータを扱わずに済むといったことができます。

// ファイルをデリゲートで共有するサンプル

// 共有データの拡張子
e.Request.Data.Properties.FileTypes.Add(".jpg");

// デリゲートの共有
e.Request.Data.SetDataProvider(
    StandardDataFormats.StorageItems,
    this.OnDeferredImageRequestedHandler);

// 実際の処理
async void OnDeferredImageRequestedHandler(DataProviderRequest request)
{
    // 非同期処理の開始(非同期の場合に必要)
    var deferral = request.GetDeferral();
    try
    {
        // マニフェストの[機能]で[画像ライブラリ]の指定が必要
#if WINDOWS_APP
        // 適当なファイルを用意
        var files = (await KnownFolders.PicturesLibrary.GetFilesAsync())
            .Where(x => Path.GetExtension(x.Name) == ".jpg")
            .Take(1);
#else
        // 適当なファイルを用意
        var files = (await KnownFolders.CameraRoll.GetFilesAsync())
            .Where(x => Path.GetExtension(x.Name) == ".jpg")
            .Take(1);
#endif
        // 共有データをセット
        request.SetData(files);
    }
    finally
    {
        // 非同期処理の終了(非同期の場合に必要)
        deferral.Complete();
    }
}

このコードでは、Windows ストアアプリではピクチャライブラリから、Windows Phoneではカメラロールから、それぞれ写真を1枚取得して共有しています。シナリオが適当ですが、共有の雰囲気。雰囲気、大事。

ストアアプリで自分のアプリから共有を呼び出す #win8dev_jp #wpdev_jp

使っている人は使っている共有チャームを呼び出す方法(呼び出すだけ!共有する方法はまた今度)。
共有チャームとは、Windows 8の右側からでてくる共有ボタンを押したときのアレ。Windows Phoneでは以前は自由に作りこめなかったのですが、現在の最新の電話ではもちろん対応されています。※
ユニバーサルアプリプロジェクトを利用して双方について説明します。

共有を呼び出す

  1. ユニバーサルアプリプロジェクトを準備
  2. Windows ストアアプリ編
  3. Windows Phone編

ユニバーサルアプリプロジェクトを準備

プロジェクトを作成します。
f:id:KatsuYuzu:20140730234130p:plain:w400
今回は凝った画面は必要ないので、MainPage.xamlSharedプロジェクトに移動して共通の画面を使います。
f:id:KatsuYuzu:20140730234433p:plain:h300

<Page x:Class="ShowShare.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d"
      Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid>
        <Button x:Name="showShareButton"
                Content="共有を表示"
                Click="ShowShareButton_OnClick"></Button>
    </Grid>
</Page>

準備が完了しました。

Windows ストアアプリ編

特に難しいことはありません。1行でズバリ。

/// <summary>
/// 「共有を表示」ボタンをクリックされたときに呼び出されます。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void ShowShareButton_OnClick(object sender, RoutedEventArgs e)
{
    DataTransferManager.ShowShareUI();
}

何も共有していないので共有できるものはありませんと言われちゃっていますが、今回の目的は達成!
f:id:KatsuYuzu:20140730235656p:plain:h300
ちなみに、このメソッドはガイドライン的には推奨されていないみたいです。

このメソッドは、絶対に必要な場合以外は使用しないでください。ユーザーは、共有チャームを使用して共有ユーザー インターフェイスを起動する必要があります。プログラムでユーザー インターフェイスを起動すると、ユーザー エクスペリエンスに混乱をきたす可能性があります。

DataTransferManager.ShowShareUI | showShareUI method - Windows app development

とはいっても、実際にはチャーム類があまり浸透していないので、「自分のアプリが共有に対応している」「この画面から共有させたい」なんて時には、共有を呼び出すGUIを明示的に配置したほうが親切だと思いますね。個人的に。

Windows Phone編

同じコードで行けますが、共有できるものがない状態ではボタンを連打してもうんともすんとも。
f:id:KatsuYuzu:20140731000026p:plain:h300
仕方ないので、説明は省きますが何か共有してみます。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    DataTransferManager.GetForCurrentView().DataRequested -= OnDataRequested;
}

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs e)
{
    e.Request.Data.Properties.Title = "アプリケーションタイトル!";
    e.Request.Data.Properties.Description = "アプリケーションの説明!";

    e.Request.Data.SetText("共有するテキスト!");
}

これで、ボタンを押すと共有画面に遷移します。
f:id:KatsuYuzu:20140731000822p:plain:h300
ちなみに、OneNoteを選択するとこんな感じ。
f:id:KatsuYuzu:20140731000935p:plain:h300

Windows PhoneのLumia 520と一緒にアクセサリーを買ったよ #wpjp

先日買ったLumia 520と一緒にアクセサリー買ってました。

慣れてきたのでレビュー。

保護シート

みんな大好き保護シート。

Super Protector EX (スーパークリア) NOKIA Lumia 520 液晶保護シート

Super Protector EX (スーパークリア) NOKIA Lumia 520 液晶保護シート

Lumia 520は何も貼ってないと滑りが悪かったので何らかのシートは貼ったほうがいいですね。
この保護シートは特につまむシールもなくペロンと貼るタイプでしたが、なんとか一切のミスもなく貼れました。問題の滑りですがとてもよくなりました。グレアタイプで、貼ってるのか貼ってないのかどっちなんだいってくらい綺麗です。
昔はノングレア派でしたがSurfaceの液晶の触り心地が好きでグレアも悪くないな、と今はどちらでも気にしなくなりました。

保護ケース

ガラケー勢には画面が出てるなんて信じられない。

本体の裏蓋をつけたまま包み込むように装着するタイプです。
↑の画像にもあるように留め具が青に見えるのがかわいいなと思ってたんですが、ただのビニールでした。金属の留め具にフィルムのようなビニールがペロンとついてるだけで、ビニールに傷もついてるしアレすぎて剥がしました。さっさと剥がした方が綺麗に見えるので満足度上がると思います。縁が若干水色でかわいいですね。
f:id:KatsuYuzu:20140618235729j:plain
全体的に状態が新品感はあまりしませんでしたが、海外だしまあそんなもんかな程度です。

2014/07/24 追記

少し浮いてくるのが気になっているかも。ケースが裏蓋をがっちりホールドしているのですが、裏蓋から本体が浮いてくる。つまり、電池パックこんにちは状態になりそう。気づいたら押し込んでみてるけども……。これはケースというよりもLumia 520自体の問題かな。これ系の話は個体差が大きい気もする。

microSDカード

安心の大容量。

Lumia 520に8.1入れても4.5GBくらい残ってるのですが、せっかく写真とかアプリとか保存先を変更できるので大容量、高速なものを用意しておいた方が気兼ねなく使えます。写真を撮っていて、もたつく感じなどもないです。
電気屋さんだと半分の容量でこれよりも高く、下手したらClass10でもないかもしれません。記憶媒体は価格差が激しい。

SIM

Lumia 520は日本ではフライトモードで使いましょう。

OCN モバイル ONE【SMS対応】マイクロSIM 月額1,020円(税抜)~

OCN モバイル ONE【SMS対応】マイクロSIM 月額1,020円(税抜)~

先日のLumia 520と一緒にfreetelも買ってました。最近話題のいわゆる格安スマホ、格安SIMの類です。1万ちょっとのAndroid端末で月額1000円でネットが見れる。携帯電話の運用的には、IP電話アプリに移行してもいいし、パケホだけやめて2台持ちにしてもいいし、月額1000~2000円で電話、ネット問題なしになります。また、家庭でOCNの光を使っているなら200円引きです。
ひとつ注意なのがSMSが不要な方でもSMS付きにするといいです。SMSがないと圏外表示になって電波を探し続けてバッテリーが消費されてしまうセルスタンバイ問題が発生することがあります。大体の端末でそのような感じみたいなのでよく調べてから購入するか、最初からSMS付きにしてしまうかです。SMS付きはSMS無しと比べて月額120円くらい高いです。

freetel

ちなみにfreetelですが、容量が苦しいです。
宣伝的にはSDカードにアプリが入るので低スペックで問題なしと謳われていますが、実はアプリをSDカードに保存した場合でも本体側に若干の容量が必要で、それはアプリによって違います。SDカードに収まりきってくれるアプリもありますが、ChromeやFacebookなどは本体側にも30MBくらい入っていました。これらの他にアプリを5つくらいいれたら、容量がいっぱいでインストールできませんとエラーがでるようになってしまいました。
また、液晶が携帯のカラー液晶初期の頃くらいな感じです。少しギラギラ見えるような感じ。画面も小さいし、タッチ感度も悪いし、日本のスマートフォンユーザーにマッチするものではありません。レビューの多くに書かれてる通り、海外に行った際にdual SIMが活躍するとか、値段を理由に割り切って使える方とかにマッチするものです。
結局、元々持っていたキャリアのSIMをfreetelに挿して電話専用にしました。この使い方だとfreetelのストレスを感じることも少なく、バッテリーも3日くらいいけてるので、よいかもしれません。格安SIMはXperiaに挿しました。XperiaはSIMフリー端末ではないのでドコモショップで3000円でSIMロック解除してもらいました。

dual SIM

dual SIMだとSIMを2枚挿すことができます。しかし、いま手に入るものの大体はfreetelのように片方が日本では使えず、海外に行った際に現地のプリペイドSIMを挿せるので便利という感じです。
さて、Lumia 630もdual SIMです。しかも、両方が3G対応?そうすると今のキャリアSIMで電話して、格安SIMでネットしてみたいな夢のようなことが出来るんじゃないかって思ったりもしたけど、dualで待機することが出来ず、切り替え式のようです。


この辺、なにか情報をお持ちの方がいらっしゃったら教えてください。