ストアアプリで自分のアプリからデータを共有する #win8dev_jp #wpdev_jp
前回は共有を呼び出すまででしたので、今回は実際にデータを共有します。
データを共有する
共有できるデータはタイトルやテキスト、URL、ファイルなど様々で、共有操作を行うと対応している(そのデータ受け取れるよ!と宣言してくれている)アプリが一覧に表示されます。
ここで注意しないといけないのは、その場面にもっとも適切なデータのみを共有してください。共有したデータがどのように使われるかは相手のアプリ次第です。例えば、画像のみを渡すとアルバムに保管してくれるのに、URLも一緒に渡すと、画像には一切触れられずにURLのみを処理されるなんてことも起こりえます。
- ユニバーサルアプリプロジェクトを準備
- DataTransferManagerを利用して共有を行う
ユニバーサルアプリプロジェクトを準備
プロジェクトを作成します。前回と同じものです。
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はうんともすんとも言わなくなります)。
時間がかかるデータやリソースを消費するデータのセット
時間がかかるデータやリソースを消費するデータを共有する場合は、デリゲートを共有して、必要に応じて処理することができます。例えば、ファイルを共有するときに、ファイルが共有できることだけ(デリゲートのみ)を伝えて(ファイルを受け取れるアプリを含む)相手のアプリ一覧を表示し、ファイルが使われる場合はデリゲートの実行、ファイルが使われない場合は時間やリソースがかかるデータを扱わずに済むといったことができます。
// ファイルをデリゲートで共有するサンプル // 共有データの拡張子 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では以前は自由に作りこめなかったのですが、現在の最新の電話ではもちろん対応されています。※
ユニバーサルアプリプロジェクトを利用して双方について説明します。
共有を呼び出す
- ユニバーサルアプリプロジェクトを準備
- Windows ストアアプリ編
- Windows Phone編
ユニバーサルアプリプロジェクトを準備
プロジェクトを作成します。
今回は凝った画面は必要ないので、MainPage.xaml
をShared
プロジェクトに移動して共通の画面を使います。
<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(); }
何も共有していないので共有できるものはありませんと言われちゃっていますが、今回の目的は達成!
ちなみに、このメソッドはガイドライン的には推奨されていないみたいです。
このメソッドは、絶対に必要な場合以外は使用しないでください。ユーザーは、共有チャームを使用して共有ユーザー インターフェイスを起動する必要があります。プログラムでユーザー インターフェイスを起動すると、ユーザー エクスペリエンスに混乱をきたす可能性があります。
DataTransferManager.ShowShareUI | showShareUI method - Windows app development
とはいっても、実際にはチャーム類があまり浸透していないので、「自分のアプリが共有に対応している」「この画面から共有させたい」なんて時には、共有を呼び出すGUIを明示的に配置したほうが親切だと思いますね。個人的に。
Windows Phone編
同じコードで行けますが、共有できるものがない状態ではボタンを連打してもうんともすんとも。
仕方ないので、説明は省きますが何か共有してみます。
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("共有するテキスト!"); }
これで、ボタンを押すと共有画面に遷移します。
ちなみに、OneNoteを選択するとこんな感じ。
Windows PhoneのLumia 520と一緒にアクセサリーを買ったよ #wpjp
先日買ったLumia 520と一緒にアクセサリー買ってました。
慣れてきたのでレビュー。
保護シート
みんな大好き保護シート。
Super Protector EX (スーパークリア) NOKIA Lumia 520 液晶保護シート
- 出版社/メーカー: ポケットシステムズ
- メディア: エレクトロニクス
- この商品を含むブログを見る
この保護シートは特につまむシールもなくペロンと貼るタイプでしたが、なんとか一切のミスもなく貼れました。問題の滑りですがとてもよくなりました。グレアタイプで、貼ってるのか貼ってないのかどっちなんだいってくらい綺麗です。
昔はノングレア派でしたがSurfaceの液晶の触り心地が好きでグレアも悪くないな、と今はどちらでも気にしなくなりました。
保護ケース
ガラケー勢には画面が出てるなんて信じられない。
MOONCASE Nokia Lumia 520 専用 PUレザースタンドケース カード入れ 合成革 / 横開き+スタイラスペン 静電容量式
- 出版社/メーカー: MOONCASE
- メディア: エレクトロニクス
- この商品を含むブログを見る
↑の画像にもあるように留め具が青に見えるのがかわいいなと思ってたんですが、ただのビニールでした。金属の留め具にフィルムのようなビニールがペロンとついてるだけで、ビニールに傷もついてるしアレすぎて剥がしました。さっさと剥がした方が綺麗に見えるので満足度上がると思います。縁が若干水色でかわいいですね。
全体的に状態が新品感はあまりしませんでしたが、海外だしまあそんなもんかな程度です。
2014/07/24 追記
少し浮いてくるのが気になっているかも。ケースが裏蓋をがっちりホールドしているのですが、裏蓋から本体が浮いてくる。つまり、電池パックこんにちは状態になりそう。気づいたら押し込んでみてるけども……。これはケースというよりもLumia 520自体の問題かな。これ系の話は個体差が大きい気もする。
microSDカード
安心の大容量。
【Amazon.co.jp限定】Transcend microSDHCカード 32GB Class10 (無期限保証) Newニンテンドー3DS 動作確認済み TS32GUSDHC10E (FFP)
- 出版社/メーカー: トランセンド・ジャパン
- メディア: Personal Computers
- 購入: 6人 クリック: 5回
- この商品を含むブログを見る
電気屋さんだと半分の容量でこれよりも高く、下手したらClass10でもないかもしれません。記憶媒体は価格差が激しい。
SIM
Lumia 520は日本ではフライトモードで使いましょう。
OCN モバイル ONE【SMS対応】マイクロSIM 月額1,020円(税抜)~
- 出版社/メーカー: NTTコミュニケーションズ
- 発売日: 2013/12/17
- メディア: エレクトロニクス
- この商品を含むブログ (7件) を見る
ひとつ注意なのが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で待機することが出来ず、切り替え式のようです。
Lumia 630 Dual SIM色々試してるんだが、今の所3Gの同時待ち受けは無理っぽい。2枚刺しといて設定から切り替えは出来るけど。🍭
— まつも A11 (@sardinej) June 16, 2014
この辺、なにか情報をお持ちの方がいらっしゃったら教えてください。