0

我正在开发一个适用于 Win8 的应用程序,其中应该包括保存联系信息的可能性。我使用的服务提供 VCard 支持,所以我决定使用它们。我可以成功下载并保存它们,仅自动打开它们不起作用。这些文件是“正确的”,可以从资源管理器中毫无问题地打开。为什么 LaunchFileAsync 不起作用的任何想法?

这是代码的转储:

    private async void SaveContactSelected()
    {
        IRandomAccessStreamReference img = RandomAccessStreamReference.CreateFromUri(SelectedItem.Image.UriSource);
        StorageFile file = await StorageFile.CreateStreamedFileFromUriAsync(SelectedItem.Title.Replace(' ', '_')+".vcf", new Uri(SelectedItem.VCardUrl), img);

        var stream = await file.OpenReadAsync();
        uint size = Convert.ToUInt32(stream.Size);
        IBuffer buffer = await stream.ReadAsync(new Windows.Storage.Streams.Buffer(size), size, InputStreamOptions.None);
        if(!stream.CanRead)
        {
            //TODO: Error handling
            return;
        }

        FileSavePicker savePicker = new FileSavePicker();
        savePicker.FileTypeChoices.Add("vcard", new List<string> { ".vcf" });
        savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
        savePicker.SuggestedFileName = SelectedItem.Title.Replace(' ', '_') + ".vcf";
        StorageFile saveDestination = await savePicker.PickSaveFileAsync();

        if (saveDestination != null)
        {
            CachedFileManager.DeferUpdates(saveDestination);
            await FileIO.WriteBufferAsync(saveDestination, buffer);
            FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(file);
            if (status == FileUpdateStatus.Complete)
            {
                bool succ = await Launcher.LaunchFileAsync(saveDestination, new LauncherOptions() { DisplayApplicationPicker=true });
                return;
            }
            else
            {
                //TODO: Error handling
            }
        } 
    }

这里是清单相关部分的转储:

<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="MyApp.App">
  <VisualElements DisplayName="MyApp.com" Logo="Assets\Images\Logo.png" SmallLogo="Assets\Images\SmallLogo.png" Description="MyApp.com Description TODO" ForegroundText="dark" BackgroundColor="#464646">
    <DefaultTile ShowName="allLogos" WideLogo="Assets\Images\LogoWide.jpg" />
    <SplashScreen Image="Assets\Images\SplashScreen.png" BackgroundColor="#FFFFFF" />
    <InitialRotationPreference>
      <Rotation Preference="landscape" />
    </InitialRotationPreference>
  </VisualElements>
  <Extensions>
    <Extension Category="windows.search" />
    <Extension Category="windows.fileTypeAssociation">
      <FileTypeAssociation Name="vcard">
        <DisplayName>V-Card</DisplayName>
        <EditFlags OpenIsSafe="true" />
        <SupportedFileTypes>
          <FileType ContentType="text/x-vcard">.vcf</FileType>
        </SupportedFileTypes>
      </FileTypeAssociation>
    </Extension>
  </Extensions>
</Application>

编辑:为更清晰添加了清单转储。

4

2 回答 2

0

您有任何处理 VCard 格式的应用程序吗?我认为应用程序 Package.appxmanifest 需要包含这样的部分:

  <Extensions>
    <Extension Category="windows.fileTypeAssociation">
      <FileTypeAssociation Name="...">
        <DisplayName>...</DisplayName>
        <InfoTip>...</InfoTip>
        <SupportedFileTypes>
          <FileType ContentType="text/vcard">.vcf</FileType>
        </SupportedFileTypes>
      </FileTypeAssociation>
    </Extension>
  </Extensions>

如果您在这里查看邮件应用程序 - 它似乎没有这样的部分。

“c:\Program Files\WindowsApps\microsoft.windowscommunicationsapps_16.4.4206.722_x64__8wekyb3d8bbwe\AppxManifest.xml”

*编辑

Mail 应用程序实际上有一个提到 <SupportsAnyFileType/> 的部分,但它位于 ShareTarget 部分,而不是 FileTypeAssociation 部分。

*编辑 2

似乎在 Windows 中内置了对 VCF 文件的支持,这对我来说很好,假设您的 Documents 库中有 TestCard.vcf 文件,能够打开清单中声明的​​ DocumentsLibrary 和声明为 open 的文件类型关联。 vcf 文件(内容类型:文本/vcard,文件类型:.vcf)。

var vcf = await KnownFolders.DocumentsLibrary.GetFileAsync("TestCard.vcf");
var vcfBytes = await FileIO.ReadBufferAsync(vcf);
var vcfCopy = await KnownFolders.DocumentsLibrary.CreateFileAsync("TestCard - copy.vcf");
CachedFileManager.DeferUpdates(vcfCopy);
await FileIO.WriteBufferAsync(vcfCopy, vcfBytes);
await CachedFileManager.CompleteUpdatesAsync(vcfCopy);
Launcher.LaunchFileAsync(vcfCopy, new LauncherOptions { DisplayApplicationPicker = true });
于 2012-08-22T18:39:55.923 回答
0

在处理此错误时:

  • 将文件写入我的 W8.1 应用程序的临时文件夹
  • 双击文件打开它就好了(在这种情况下是 pptx)
  • LaunchFileAsync 始终返回 false。

我发现了两件事。首先,引用 Windows 完成的一些奇怪的安全检查(这对我来说不是导致它的原因:https ://social.msdn.microsoft.com/Forums/en-US/c0625345-5d57-4e40-b446-85db4c6ef355 /why-does-windowssystemlauncherlaunchfileasync-fail-with-file-from-my-local-folder?forum=winappswithhtml5)。

其次,这是我的问题,是我不在 UI 线程上!切换所以 LaunchFileAsync 在 UI 线程上使它突然工作得很好。

于 2015-03-01T00:27:34.153 回答