Cannot access video library in UWP

378 views Asked by At

I feel like I am missing something, but not sure what it is.

I have two UWP apps which I have setup to use the video library as a temporary storage location. One app works fine and the other app says it does not have permission. From what I can tell the coding is exactly the same. I verified that the capabilities of the app is setup the same in both apps as well.

Any suggestions on what else to look at?

Non-working code:

public static async Task GetFileAsync()
        {
            var (authResult, message) = await Authentication.AquireTokenAsync();
            var httpClient = new HttpClient();
            HttpResponseMessage response;
            var request = new HttpRequestMessage(HttpMethod.Get, MainPage.fileurl);
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
            response = await httpClient.SendAsync(request);
            byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();
            StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
            string saveFolder = videoLibrary.SaveFolder.Path;
            string saveFileName = App.Date + "-" + App.Shift + ".xlsx";
            saveLocation = saveFolder + "\\" + saveFileName;

            using (MemoryStream stream = new MemoryStream())
            {
                stream.Write(fileBytes, 0, (int)fileBytes.Length);
                using (spreadsheetDoc = SpreadsheetDocument.Open(stream, true))
                {
                    await Task.Run(() =>
                    {
                        File.WriteAllBytes(saveLocation, stream.ToArray());
                        return TaskStatus.RanToCompletion;
                    });
                }
            }
        }

        public async static Task UpdateCell(string docName, string text,
            uint rowIndex, string columnName)
        {
            StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
            string saveFolder = videoLibrary.SaveFolder.Path;
            string saveFileName = App.Date + "-" + App.Shift + ".xlsx";
            saveLocation = saveFolder + "\\" + saveFileName;

            await Task.Run(() =>
            {
                using (spreadsheetDoc = SpreadsheetDocument.Open(saveLocation, true))
                {
                    WorksheetPart worksheetPart =
                        GetWorksheetPartByName(spreadsheetDoc, "DC11Rounds");

                    if (worksheetPart != null)
                    {
                        Cell cell = GetCell(worksheetPart.Worksheet,
                                                    columnName, rowIndex);
                        cell.CellValue = new CellValue(text);
                        cell.DataType =
                            new EnumValue<CellValues>(CellValues.String);

                        worksheetPart.Worksheet.Save();
                    }
                }
                return TaskStatus.RanToCompletion;
            });
        }

Working Code:

public static async Task GetFileAsync()
        {
            var (authResult, message) = await Authentication.AquireTokenAsync();
            var httpClient = new HttpClient();
            HttpResponseMessage response;
            var request = new HttpRequestMessage(HttpMethod.Get, MainPage.fileurl);
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken);
            response = await httpClient.SendAsync(request);
            byte[] fileBytes = await response.Content.ReadAsByteArrayAsync();
            StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
            string saveFolder = videoLibrary.SaveFolder.Path;
            string saveFileName = App.Date + "-" + App.Shift + ".xlsx";
            saveLocation = saveFolder + "\\" + saveFileName;

            using (MemoryStream stream = new MemoryStream())
            {
                stream.Write(fileBytes, 0, (int)fileBytes.Length);
                using (spreadsheetDoc = SpreadsheetDocument.Open(stream, true))
                {
                    await Task.Run(() =>
                    {
                        File.WriteAllBytes(saveLocation, stream.ToArray());
                        return TaskStatus.RanToCompletion;
                    });
                }
            }
        }

        public async static Task UpdateCell(string docName, string text,
            uint rowIndex, string columnName)
        {
            StorageLibrary videoLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
            string saveFolder = videoLibrary.SaveFolder.Path;
            string saveFileName = App.Date + "-" + App.Shift + ".xlsx";
            saveLocation = saveFolder + "\\" + saveFileName;

            await Task.Run(() =>
            {
                using (spreadsheetDoc = SpreadsheetDocument.Open(saveLocation, true))
                {
                    WorksheetPart worksheetPart =
                        GetWorksheetPartByName(spreadsheetDoc, "DC6Rounds");

                    if (worksheetPart != null)
                    {
                        Cell cell = GetCell(worksheetPart.Worksheet,
                                                    columnName, rowIndex);
                        cell.CellValue = new CellValue(text);
                        cell.DataType =
                            new EnumValue<CellValues>(CellValues.String);

                        worksheetPart.Worksheet.Save();
                    }
                }
                return TaskStatus.RanToCompletion;
            });
        }

Screenshot: enter image description here

Appmanifast File

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp iot rescap">
  <Identity Name="0724a480-5e3e-4cd4-a2a5-0c7305491ce3" Publisher="CN=tkrupka" Version="1.0.0.0" />
  <mp:PhoneIdentity PhoneProductId="0724a480-5e3e-4cd4-a2a5-0c7305491ce3" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
  <Properties>
    <DisplayName>DC11Rounds</DisplayName>
    <PublisherDisplayName>tkrupka</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
  </Dependencies>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="DC11Rounds.App">
      <uap:VisualElements DisplayName="DC11Rounds" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="DC11Rounds" BackgroundColor="transparent">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
        </uap:DefaultTile>
        <uap:SplashScreen Image="Assets\SplashScreen.png" />
      </uap:VisualElements>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="internetClient" />
    <Capability Name="privateNetworkClientServer" />
    <uap:Capability Name="enterpriseAuthentication" />
    <uap:Capability Name="videosLibrary" />
    <rescap:Capability Name="broadFileSystemAccess" />
  </Capabilities>
</Package>

Working File

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" IgnorableNamespaces="uap mp">
  <Identity Name="9e9838f0-1e60-482a-b922-189cc5e928f9" Publisher="CN=XXXXXX" Version="1.0.0.0" />
  <mp:PhoneIdentity PhoneProductId="9e9838f0-1e60-482a-b922-189cc5e928f9" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
  <Properties>
    <DisplayName>DC6Rounds</DisplayName>
    <PublisherDisplayName>XXXXXX</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
  </Dependencies>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="DC6Rounds.App">
      <uap:VisualElements DisplayName="DC6Rounds" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png" Description="DC6Rounds" BackgroundColor="black">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png">
        </uap:DefaultTile>
        <uap:SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="black" />
      </uap:VisualElements>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="internetClient" />
    <Capability Name="privateNetworkClientServer" />
    <uap:Capability Name="enterpriseAuthentication" />
    <uap:Capability Name="videosLibrary" />
  </Capabilities>
</Package>

Getting this error when trying to add restricted capabilities:

Severity Code Description Project File Line Suppression State Warning The element 'Capabilities' in namespace 'http://schemas.microsoft.com/appx/manifest/foundation/windows10' has invalid child element 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities'. List of possible elements expected: 'CapabilityChoice' in namespace 'http://schemas.microsoft.com/appx/manifest/foundation/windows10' as well as 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/uap/windows10' as well as 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/foundation/windows10' as well as 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/uap/windows10/4' as well as 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/uap/windows10/6' as well as 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/uap/windows10/7' as well as 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/uap/windows10/3' as well as 'Capability' in namespace 'http://schemas.microsoft.com/appx/manifest/uap/windows10/2' as well as 'CustomCapabilityChoice' in namespace 'http://schemas.microsoft.com/appx/manifest/foundation/windows10' as well as 'CustomCapability' in namespace 'http://schemas.microsoft.com/appx/manifest/uap/windows10/4' as well as 'Dev.... DC11Rounds C:\Users\XXXXXX\GitVault\DC11Rounds\DC11Rounds\DC11Rounds\Package.appxmanifest 31

Tried this:

    //StorageLibrary storageLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Documents);
    //string saveFolder = storageLibrary.SaveFolder.Path;
    StorageFolder saveFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;

Received this:

Message=Could not find a part of the path 'C:\Users\XXXXXX\GitVault\DC11Rounds\DC11Rounds\DC11Rounds\bin\x86\Debug\AppX\Windows.Storage.StorageFolder\20181205-Days.xlsx'.

Realized I made a mistake and forgot a .path. SO I still have the same issue.

2

There are 2 answers

0
CET On BEST ANSWER

I added the broadFileSystemAccess, used document library, changed my minimum target value, and made the editorial changes because of the change in Minimum target. The project now works! Thanks to both of you. Not sure how to mark as Answered since most of this is in comments

4
Martin Zikmund On

Check if the application's access to videos library hasn't been disalbed in the Settings app. Go to Start, Settings, there select Privacy and Videos. The list of apps on the right should contain your app and you need to verify if the toggle is set to On.

Apps in Settings Privacy