2017-03-17 21 views
3

私は単一のボタンで非常に単純なUWPアプリケーションを作成しました。 をクリックすると、組み込まれた共有ポップアップのPDFファイルを共有するように表示されます。Windows 10 MobileでUWP共有機能が動作しない

実際、Windows 10(デスクトップ)では動作していますが、モバイルでは機能しません(画面にポップアップは表示されません)。

PDFファイルは、(リモートサービスに由来するため)バイト配列として提供されます。

これはMainPage.xaml.cs

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested; 
    } 

    protected override async void OnNavigatedTo(NavigationEventArgs e) 
    { 
     // This should come from a service 
     PdfBytes = await Microsoft.Toolkit.Uwp.StorageFileHelper.ReadBytesFromPackagedFileAsync("Document.pdf"); 
    } 

    public byte[] PdfBytes { get; set; } 

    private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args) 
    { 
     var deferral = args.Request.GetDeferral(); 

     var si = await StorageFile.CreateStreamedFileAsync("Document.pdf", stream => 
     { 
      var writeStream = stream.AsStreamForWrite(); 
      writeStream.Write(PdfBytes, 0, PdfBytes.Length); 
      stream.Dispose();     
     }, null); 

     args.Request.Data.Properties.Title = "PDF Document"; 
     args.Request.Data.Properties.Description = "Some description"; 
     args.Request.Data.SetStorageItems(new IStorageItem[] { si }); 
     deferral.Complete(); 
    } 

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     DataTransferManager.ShowShareUI(); 
    } 
} 

内のコードでは、それは正しいですか?そうでない場合は、どのようにPDFを(バイトから)共有するべきですか?

+1

多分この答えはあなたのために便利です:http://stackoverflow.com/a/30203936/1406798 –

+0

こんにちは、私のアプリケーションでも共有を使用しました。それはデスクトップとモービルで動作します。違いは、新しいIStorageItem [] {si}新しいList list =新しいList ()を使用しました。 list.Add(ファイル); FileはStorageFileです。あなたのアセンブリもチェックしてください。モバイルエクステンションを追加しましたか? – thezapper

答えて

1

フィードバックいただきありがとうございます。 CreateStreamedFileAsyncメソッドがモバイルで契約を共有すると正しく動作しないようです。私たちはこの問題を内部的に記録しました。進歩があればここで更新します。

今のところ、回避策として、あなたが最初のTemporaryFolderにファイルを保存することができますし、次のようにそれを共有するには:

private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args) 
{ 
    var deferral = args.Request.GetDeferral(); 

    var tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("Document.pdf", CreationCollisionOption.ReplaceExisting); 
    await FileIO.WriteBytesAsync(tempFile, PdfBytes); 

    args.Request.Data.Properties.Title = "PDF Document"; 
    args.Request.Data.Properties.Description = "Some description"; 
    args.Request.Data.SetStorageItems(new IStorageItem[] { tempFile }); 

    deferral.Complete(); 
} 

一時的なアプリデータストアは、あなたがしたくないデータのための適切な場所であります現在のアプリケーションセッションの後に保持されます。システムは、必要に応じてこの場所に格納されたデータを削除してスペースを解放することができます。任意の中間ファイルまたは一時ファイルに使用できます。大量のデータをTempに書き込んでいる場合は、アプリを初期化したときにシステムを消去するか、ユーザーがストレージを解放するための操作を行わないようにすることをお勧めします。私は

あなたは、私はこのコードをチェックし、それはおそらくコンパイルが、文句を言わないhaventは

private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args) 
{ 
    var deferral = args.Request.GetDeferral(); 

    var si = await StorageFile.CreateStreamedFileAsync("Document.pdf", stream => 
    { 
     var writeStream = stream.AsStreamForWrite(); 
     writeStream.Write(PdfBytes, 0, PdfBytes.Length); 
     stream.Dispose();  

     args.Request.Data.Properties.Title = "PDF Document"; 
     args.Request.Data.Properties.Description = "Some description"; 
     args.Request.Data.SetStorageItems(new IStorageItem[] { si }); 
     deferral.Complete(); 

    }, null); 
} 

を変更しようとしたことがありと信じていた

await ApplicationData.ClearAsync(ApplicationDataLocality.Temporary); 
+0

OnDataRequestedがいつ、どのように呼び出されているのかわかりません。私はShowShareUI()を使用する場合にのみ呼び出されますが、それは1/2秒間ダイアログを開き、それを直ちに閉じます。ダイアログのメッセージに「このアプリは現時点では共有できません。」と表示されます。ダイアログが閉じ、私のOnDataRequestedが呼び出されますが、何も起こりません。私は正確にここで説明したhttps://stackoverflow.com/questions/46555117/uwp-datatransfermanager-showshareui-opens-sharing-dialog-with-this-app-cant – pixel

関連する問題