Zapis pliku na karcie sd Windows Phone 8.1

0

Mam problem z zapisaniem pliku na karcie sd, podglądając wyjątek otrzymuję komunikat:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

Mimo tego, że dostęp jest odblokowany w manifescie, nie generuje się plik.

Metody zapisujące:

        private void stopButton_Click(object sender, RoutedEventArgs e)
        {
                Task returnedTask = ProcessFile(name, temp); //tutaj wyjatek pojawia się po wejściu przy pomocy breakpoint'a
        }

        private async Task ProcessFile(string name, string content)
        {
            var sdCard = KnownFolders.RemovableDevices;
            var sdCardRoot = (await sdCard.GetFoldersAsync()).OrderBy(eachDir => eachDir.DisplayName).FirstOrDefault();

            if (sdCard != null && sdCardRoot != null)
            {
                var backupFile = await sdCardRoot.CreateFileAsync(name + ".txt", CreationCollisionOption.OpenIfExists);

                if (backupFile != null)
                {
                    using (var textStream = await backupFile.OpenAsync(FileAccessMode.ReadWrite))
                    {
                        using (var textWriter = new DataWriter(textStream))
                        {
                            //...
                        }
                    }
                }
            }
        }

Manifest:

 <?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest" xmlns:m3="http://schemas.microsoft.com/appx/2014/manifest" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest">
  <Identity Name="01072596-8503-4252-9151-12ea5e0a1a3b" Publisher="CN=Paweł" Version="1.0.0.0" />
  <mp:PhoneIdentity PhoneProductId="39908153-ad84-4003-aa23-504de548ba3b" PhonePublisherId="2f21cbbb-e698-47a1-8231-6b827c8b14d0" />
  <Properties>
    <DisplayName>AccPhone</DisplayName>
    <PublisherDisplayName>Paweł</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Prerequisites>
    <OSMinVersion>6.3.1</OSMinVersion>
    <OSMaxVersionTested>6.3.1</OSMaxVersionTested>
  </Prerequisites>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="AGHost.exe" EntryPoint="MainPage.xaml">
      <m3:VisualElements DisplayName="AccPhone" Square150x150Logo="Assets\SquareTile150x150.png" Square44x44Logo="Assets\Logo.png" Description="AccPhone" ForegroundText="light" BackgroundColor="#464646">
        <m3:DefaultTile Square71x71Logo="Assets\SquareTile71x71.png">
        </m3:DefaultTile>
        <m3:SplashScreen Image="Assets\SplashScreen.png" />
      </m3:VisualElements>
      <Extensions>
        <Extension Category="windows.backgroundTasks" EntryPoint="AgHost.BackgroundTask">
          <BackgroundTasks>
            <Task Type="systemEvent" />
          </BackgroundTasks>
        </Extension>
          <Extension Category="windows.fileTypeAssociation">
            <FileTypeAssociation Name=".txt">
              <DisplayName>data</DisplayName>
              <SupportedFileTypes>
                <FileType ContentType="text/plain">.txt</FileType>
              </SupportedFileTypes>
            </FileTypeAssociation>
          </Extension>
      </Extensions>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="removableStorage" />
  </Capabilities>
  <Extensions>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>AgHostSvcs.dll</Path>
        <ActivatableClass ActivatableClassId="AgHost.BackgroundTask" ThreadingModel="both" />
      </InProcessServer>
    </Extension>
  </Extensions>
</Package>
1

Tyle zmian w tym temacie nastąpiło, że nie wiem na którą wersję kodu odpowiadam ;-)

Jeżeli mowa o ArgumentException, to problem polega na tym, że CreateFileAsync jako pierwszy parametr przyjmuje tylko nazwę pliku, nie ścieżkę do pliku. Jeżeli trzeba tworzyć w określonym katalogu, to trzeba wykonać CreateFileAsync dla innego obiektu klasy StorageFolder.
Jeżeli UnauthorizedAccessException, to błąd na pewno jest w braku Capabilities - spróbuj usunąć aplikację z emulatora/telefonu i zainstalować ją jeszcze raz, "na czysto", bo przy zmianie uprawnień czasami paczka nie jest przebudowywana. Jeżeli to jest aplikacja Silverlight, dodaj też ID_CAP_REMOVABLESTORAGE w Properties\WMAppManifest.xml.

0

Ta wersja jest aktualna, po prostu niezauważyłem a wrzuciłem coś innego co chciałem także przepraszam za zamotę, ta wersja jest uaktualniona o powiedziane poprawki. Rozumiem że aktualnie tworzenie folderu nie jest rzeczą konieczną?

Skasowalem program z telefonu oraz dodałem poprawki z nazwą pliku jak mówiłeś.
Niestety dalej nic nie działa po tych poprawkach jedyne co nie potrafie zrobić to dodać do manifestu ID_CAP_REMOVABLESTORAGE.
Jak to zrobić i co to jest? W windows 8.1 nie potrafie znaleźć sosobów jak to się dodaje?

2

Nie wiem czy tworzenie folderu jest rzeczą konieczną, ale chyba nie, zawsze można było pisać do roocie karty SD. Przynajmniej w dokumentacji nie widzę problemu: http://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn611857.aspx

W załączniku program, który napisałem na bazie twojego wcześniejszego kodu, nie rzucał wyjątkiem na emulatorze, tworzył plik poprawnie. Na telefonie nie sprawdzę, nie mam pod ręką telefonu z kartami SD.

Manifest jest w Properties\WMAppManifest.xml... ale tylko, jeżeli to jest aplikacja Silverlight. Jak nie (aplikacja WinRT), to się nie przejmuj :-)

0

Dzieki wielkie Twoja wersja działa świetnie, musze poszukać różnic u mnie w programie i dam znać w czym był problem ;)

Problem rozwiązany;

Gdy do telefonu jest podłączony kabel i komputer widzi karte sd wówczas nie chce utworzyć pliku.
Po zainstalowaniu aplikacji i uruchomieniu programu, plik sie tworzy na karcie.
Nie wiem czemu jedynie raz po uruchomieniu aplikacji od ciebie utworzyl plik bez odłączania kabla, w kolejnych próbach (troszke ich bylo zanim do tego doszedłem) musiałem odłączać kabel.

0

Witam !

Ja pzyłączam się do tematu i chcałbym rozwiąać swój problem...

moja aplikacja nie może dodać pliku do D:\WPSystem\apps{GUID}\Install. Gdy próbuję dodać plik otrzymuję komunikat "Access denied".

Wiem, że jest to możliwe, mogę dodać ręcznie plik do w/w lokalizacji przy użyciu Pocket File Manager. Aplikacje z różnych forum , np. CustomWPSystem także ma dostęp do D:\WPSystem\apps{GUID}\Install, ale najpierw trzeba wcisnąć przycisk "SD Premission" i wskazać manulanie kartę SD.

Prosiłbym Bardzo o pomoc, jestem początkującym programistą.

W załączniku source, prosiłbym o poprawienie o ile to możliwe :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1