【问题标题】:UWP DataTransferManager ShowShareUI() Opens Sharing Dialog with "This app can't share right now" and Closes it Immediately AfterUWP DataTransferManager ShowShareUI() 打开共享对话框并显示“此应用现在无法共享”并立即关闭
【发布时间】:2017-10-03 23:57:20
【问题描述】:

我正在尝试从在 Windows 10 桌面上运行的 UWP 应用沙箱共享文件。

按照此页面上的 MS 文档,实现似乎相当简单;但是,我遇到了问题https://docs.microsoft.com/en-us/windows/uwp/app-to-app/share-data

根据文章中的说明,我在班级的 c-tor 中创建了 DataTransferManager 并附加了 DataRequested 事件:

DataTransferManager dataTransferManager;

public MainPage()
{
  this.InitializeComponent();
  ...
    dataTransferManager = DataTransferManager.GetForCurrentView(); 
    dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 
}

接下来,在从后台线程调用的方法中,我调用 ShowShareUI 确保它在主线程上执行

Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
    DataTransferManager.ShowShareUI(); //THIS CALL SHOWS A POPUP AND IMMEDIATELLY CLOSES IT
}).AsTask().Wait();

然后在我的 OnDataRequested 事件中,添加我要共享的文件:

private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    // get the file from application sandbox
    StorageFile attachmentFile = await StorageFile.GetFileFromPathAsync(@"C:\Users\ME\AppData\Local\Packages\f040f23f-....-84\LocalState\logs\MYLOG.log");
    DataRequest request = args.Request; 
    request.Data.Properties.Title = "My Log File";
    request.Data.Properties.Description = "Sharing MYLOG file.";
    List<IStorageItem> storage = new List<IStorageItem>()
    {
        attachmentFile
    };
    request.Data.SetStorageItems(storage);
}

但什么也没发生。我没有机会在打开 1/2 秒然后关闭的对话框中选择任何内容。这是对话框的样子,它在打开后几乎立即打开和关闭,它只显示“此应用现在无法共享”。

【问题讨论】:

    标签: uwp windows-10-universal data-sharing


    【解决方案1】:

    想通了,以下是我的问题的解决方案。

    在 MainPage.xaml.cs 中添加了全局变量:

    private DataTransferManager dataTransferManager;
    

    在MainPage的构造函数中,添加了这个

    dataTransferManager = DataTransferManager.GetForCurrentView(); 
    dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 
    

    到目前为止,我的代码没有改变,但接下来调用 ShowShareUI,该调用最初是从后台线程调用的,但使用 Dispatcher 分派到 UI 线程(参见原始帖子)。我仍然不知道为什么像我最初解释的那样这样做是行不通的,但是在更改了如下代码之后,它现在可以工作了。因此,在 UI 线程上单击按钮启动共享:

    private void Button_Click()
    {
      DataTransferManager.ShowShareUI();
    }
    

    此事件处理程序由上述对 ShowShareUI() 的调用触发:

    private async void DataTransferManager_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
    {
        DataRequestDeferral deferral = args.Request.GetDeferral();
    
        // MyLogger has SendLogs method but calling this in Button_Click above will not work and the Share
        // dialog will just open and close.  Moving it down to this event solves the issue.
        MyLogger.SendLogs(async logpath =>
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
            {
                StorageFile myFile = await StorageFile.GetFileFromPathAsync(logpath);
    
                DataRequest request = args.Request; 
                request.Data.Properties.Title = "Share My Logs";
                request.Data.Properties.Description = string.Format("Share log file {0}.", myFile.DisplayName);
    
                List<IStorageItem> myStorageItems = new List<IStorageItem>() { myFile };
                request.Data.SetStorageItems(myStorageItems);
                deferral.Complete();
            });
        });
    }
    

    这解决了我的问题

    【讨论】:

    • 我遇到了同样的问题。解决了它删除 request.FailWithDisplayText()
    • 这与这个问题有什么关系?发送
    【解决方案2】:

    StorageFile attachmentFile = await StorageFile.GetFileFromPathAsync(@"C:\Users\ME\AppData\Local\Packages\f040f23f-....-84\LocalState\logs\MYLOG.log");

    在 UWP 中,您无法直接从路径获取文件。

    UWP 应用以沙盒方式运行,并且对文件系统的访问权限非常有限。在大多数情况下,他们只能直接访问他们的安装文件夹和他们的应用程序数据文件夹。他们无权访问其他地方的文件系统。 Rob 在他的博客 Skip the path: stick to the StorageFile

    中解释了这一点

    因此,您的代码将更改如下:

    StorageFolder logsFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync("logs");
    StorageFile file = await logsFolder.GetFileAsync("MYLOG.log");
    

    请更改您的代码并尝试再次运行您的应用,看看您是否仍然遇到此问题。

    【讨论】:

    • 但在我上面的例子中,它正在访问应用程序数据文件夹(沙箱)中的文件。我提供的路径是应用沙箱的路径。这行得通,我知道,因为我首先尝试将文件附加到新电子邮件中,只是为了发现这仅适用于应用商店中的邮件应用程序,但不适用于任何其他 Win32 应用程序,这在我的情况下使其无法使用。因此,文件在此处被正确访问和检索。谢谢
    • ...顺便说一句,当我按照您的建议更改代码时,同样的问题存在。调用 ShowShareUI() 将打开共享对话框,但在输入事件 OnDataRequested() 时(断点),对话框已经关闭。没有区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多