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

このエラーの処理中:

  • W8.1 アプリの一時フォルダーにファイルを書き出す
  • ファイルをダブルクリックすると問題なく開きます (この場合は pptx でした)。
  • LaunchFileAsync は常に false を返しました。

私が発見した2つのこと。まず、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 )。

2 番目の問題は、私が UI スレッドに参加していなかったことです。LaunchFileAsync が UI スレッド上にあるように切り替えると、突然正常に動作するようになりました。

于 2015-03-01T00:27:34.153 に答える
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"

*編集

メール アプリには、実際には <SupportsAnyFileType/> に言及するセクションがありますが、それは FileTypeAssociation セクションではなく、ShareTarget セクションにあります。

*編集2

WindowsにはVCFファイルのサポートが組み込まれているようで、ドキュメントライブラリに TestCard.vcf ファイルがあり、マニフェストで宣言された DocumentsLibrary を開く機能があり、ファイルタイプの関連付けが open と宣言されていると仮定すると、これはうまく機能します。 vcf ファイル (コンテンツ タイプ: text/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 に答える