ファイルを受け取る方法 (HTML)
[ この記事は、Windows ランタイム アプリを作成する Windows 8.x および Windows Phone 8.x 開発者を対象としています。Windows 10 向けの開発を行っている場合は、「最新のドキュメント」をご覧ください]
ファイルを共有する場合は、テキストなどの単純なデータの種類に比べると、準備に少し時間がかかります。ファイルを共有するときは、ファイルの処理にかかる時間を考慮する必要があります。
ユーザーが共有するファイルの処理に時間がかかることが予想される場合は、処理を開始する前に reportStarted を呼び出します。このメソッドを使うと、処理が完了するまで、アプリが起動された状態のままになります。アプリでの処理が完了したら、reportCompleted を呼び出して共有操作を終了します。詳しくは、「クイック スタート: 共有コンテンツの受信」の「"長時間共有状態の報告"」をご覧ください。
理解しておく必要があること
テクノロジ
必要条件
- Visual Studio と関連するテンプレートについて理解している必要があります。
- JavaScript について理解している必要があります。
手順
ステップ 1: 共有コントラクトをサポートする。
アプリで共有コンテンツを受け取るには、事前に共有コントラクトのサポートを宣言する必要があります。このコントラクトを使うと、アプリがコンテンツを受け取れることをシステムに通知できます。Microsoft Visual Studio テンプレートを使ってアプリを作る場合は、次の手順に従って共有ターゲット コントラクトをサポートします。
- マニフェスト ファイル (package.appxmanifest) を開きます。
- [宣言] タブを開きます。
- [使用可能な宣言] ボックスの一覧の [共有ターゲット] を選びます。
- [追加] をクリックして、アプリに共有ターゲット コントラクトのサポートを追加します。
ステップ 2: アプリでサポートするファイルの種類を指定します。
アプリでサポートするファイルの種類を指定するには、アプリ マニフェストでそれらの拡張子を指定します。
- マニフェスト ファイルを開きます。
- [データ形式] セクションで、[新規追加] をクリックします。
- 「.txt」などのように、ファイル名拡張子を入力します。
- 追加するファイルの種類ごとに、前の手順を繰り返します。
ここまでの手順によって、マニフェストに次のセクションが追加されます。
<Extensions>
<Extension Category="windows.shareTarget">
<ShareTarget>
<SupportedFileTypes>
<FileType>.txt</FileType>
</ShareTarget>
</Extension>
</Extensions>
注 [データ形式] セクションで、StorageItems を指定する必要はありません。このサポートは、マニフェストの SupportedFileTypes セクションから推論されます。アプリですべてのファイルの種類をサポートする場合、それを指定するには、マニフェストで [すべてのファイルの種類をサポートする] をオンにします。
注 共有ターゲット コントラクト用にアプリがアクティブ化されている場合は、別のエントリ ポイントを指定できます。そのためには、パッケージ マニフェストの [共有ターゲット] 宣言の [アプリ] 設定セクションで [スタート] ページ エントリを変更します。このページのアクティブ化を処理する別の JavaScript ファイルも使うことを強くお勧めします。例については、コンテンツ共有ターゲット アプリ サンプルをご覧ください。
ステップ 3: アプリがどのような状況でアクティブ化されたかを検出するイベント ハンドラーを追加する。
ユーザーがアプリでコンテンツを共有することを選ぶと、システムによってアプリがアクティブ化されます。アクティブ化はさまざまな状況で発生する可能性があるため、アクティブ化が行われた理由を検出するコードを追加する必要があります。これは、kind プロパティの値を調べることで確認できます。
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The application has been launched. Initialize as appropriate.
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
...
}
};
ステップ 4: ShareOperation オブジェクトを取得する。
ShareOperation オブジェクトには、ユーザーが共有するコンテンツをアプリが取得するために必要なすべてのデータが含まれています。
shareOperation = args.detail.shareOperation;
ステップ 5: activated イベント ハンドラーからすばやく戻る。
activated イベント ハンドラーは、すばやく戻る必要があります。activated イベント ハンドラーからの非同期イベントをキューに入れ、activated イベントから戻った後に共有データの処理が行われるようにします。
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
残りの手順では、shareReady
関数を実装します。
ステップ 6: DataPackageView に StorageItems が含まれているか確認する。
ShareOperation オブジェクトには DataPackageView オブジェクトが含まれています。このオブジェクトは、ソース アプリがデータの作成に使った DataPackage オブジェクトを読み取り専用にしたものです。このオブジェクトを使って共有されたコンテンツに StorageItems が含まれているか確認します。
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.storageItems)) {
// Data being shared contains one or more StorageItem. Code to process the StorageItems goes here.
}
アプリで 1 つの形式しかサポートしていないとしても、目的のデータ形式が DataPackage に含まれているかどうかをチェックすることをお勧めします。 これにより、後で他のデータ形式をサポートするのが簡単になります。
ステップ 7: ファイルを処理する。
ファイルを取り出すために DataPackageView.GetStorageItemsAsync メソッドを呼び出します。
shareOperation.data.getStorageItemsAsync().then(function (storageItems) {
var fileList = "";
for (var i = 0; i < storageItems.size; i++) {
fileList += storageItems.getAt(i).name;
if (i < storageItems.size - 1) {
fileList += ", ";
}
}
// In this example, we only display the file names. To do this, you need
// a <div> element with an id of "output" in your HTML page.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = "Files: " + fileList;
});
注
ファイルの処理には時間がかかることがあります。アプリでのデータの読み込みや処理が完了するまで、ユーザーを待たせないことが重要です。Windows 8.1 では、reportStarted メソッドを呼び出すことで、アプリが共有するコンテンツの処理を開始したことをシステムに通知できます。これにより、ユーザーがアプリを終了してソース アプリに戻った場合でも、reportCompleted— を呼び出すまではアプリが起動された状態のままになります。詳しくは、「クイック スタート: 共有コンテンツの受信」の「長時間共有状態の報告」をご覧ください。
ステップ 8: reportCompleted を呼び出す。
アプリでコンテンツの共有が正常に完了したら、reportCompleted を呼び出します。このメソッドを呼び出すと、システムによってアプリが閉じられます。
shareOperation.reportCompleted();
注釈
コンテンツ共有ターゲット アプリ サンプルのコード例を調べると、共有の一部としてテキストを受け取るアプリのエンド ツー エンドのエクスペリエンス全体を把握できます。
完全な例
var shareOperation = null;
function shareReady(args) {
if (shareOperation.data.contains(Windows.ApplicationModel.DataTransfer.StandardDataFormats.storageItems)) {
shareOperation.data.getStorageItemsAsync().then(function (storageItems) {
var fileList = "";
for (var i = 0; i < storageItems.size; i++) {
fileList += storageItems.getAt(i).name;
if (i < storageItems.size - 1) {
fileList += ", ";
}
}
// In this example, we only display the file names. To do this, you need
// a <div> element with an id of "output" in your HTML page.
// In your app, replace this with whatever is appropriate for your scenario.
document.getElementById("output").innerText = "Files: " + fileList;
});
}
}
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
// The app has been launched.
args.setPromise(WinJS.UI.processAll());
} else if (args.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.shareTarget) {
// This app was activated for the Share contract.
args.setPromise(WinJS.UI.processAll());
// We receive the ShareOperation object as part of the eventArgs.
shareOperation = args.detail.shareOperation;
// We queue an asychronous event so that working with the ShareOperation
// object does not block or delay the return of the activation handler.
WinJS.Application.addEventListener("shareready", shareReady, false);
WinJS.Application.queueEvent({ type: "shareready" });
}
};
関連トピック
Windows.ApplicationModel.DataTransfer