Windows 10 Mobile中UWP分享功能无法正常工作

4
我创建了一个非常简单的UWP应用程序,只有一个按钮。点击它应该显示内置的共享弹出窗口以共享PDF文件

事实是,我已经在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
也许这个答案对您有用:https://dev59.com/Aorda4cB1Zd3GeqPNH8t#30203936 - Tóth Tibor
嗨,在我的应用程序中,我也使用了共享功能。它可以在桌面和移动设备上运行。不同之处在于:我使用了 new List<IStorageItem> list = new List<IStorageItem>(); list.Add(File); 替代了 new IStorageItem[] { si },其中 File 是一个 StorageFile。还要检查您的程序集,是否已添加移动扩展?! - thezapper
3个回答

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写入大量数据,则最好在初始化应用程序时清除它,以避免系统或用户采取行动来释放存储空间。您可以通过调用以下内容来完成此操作:

await ApplicationData.ClearAsync(ApplicationDataLocality.Temporary);

我不明白OnDataRequested何时以及如何被调用。只有在使用ShowShareUI()时才会被调用,但是这会打开一个对话框,持续1/2秒钟,然后立即关闭。对话框中显示的消息是“This app can't share at the moment.”。对话框关闭后,我的OnDataRequested被调用,但什么也没有发生。我在这里详细解释了 https://stackoverflow.com/questions/46555117/uwp-datatransfermanager-showshareui-opens-sharing-dialog-with-this-app-cant - pixel

0

我遇到了同样的问题,我的共享在桌面应用程序中运行良好,但在移动设备上却不行。经过长时间的努力,我发现延迟在Windows 10移动版中无法正常工作。

因此最好删除这些代码并尝试。它可以正常工作。

var deferral = args.Request.GetDeferral();
deferral.Complete();

0

你遇到了我曾经遇到的类似问题

你尝试过更改吗?

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);
}

我还没有检查过这段代码,所以它可能无法编译,但是我发现我的问题看起来与你的类似,如果涉及到线程。在这里看看我的问题UWP DataTransferManager ShowShareUI() Opens Sharing Dialog with "This app can't share right now" and Closes it Immediately After


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接