Sdílet prostřednictvím


Soubory a složky v knihovnách Hudba, Obrázky a Videa

Přidejte do odpovídajících knihoven existující složky hudby, obrázků nebo videí. Můžete taky odebrat složky z knihoven, získat seznam složek v knihovně a zjišťovat uložené fotky, hudbu a videa.

Knihovna je virtuální kolekce složek, která ve výchozím nastavení obsahuje známou složku a všechny další složky, které uživatel přidal do knihovny pomocí vaší aplikace nebo jedné z předdefinovaných aplikací. Například knihovna Obrázky obsahuje ve výchozím nastavení známou složku Obrázky. Uživatel může přidávat složky do knihovny Obrázky nebo je z nich odebírat pomocí aplikace nebo integrované aplikace Fotky.

Požadavky

Získání odkazu na knihovnu

Poznámka:

Nezapomeňte deklarovat příslušnou funkci. Další informace najdete v deklarací funkcích aplikace .  

Pokud chcete získat odkaz na knihovnu Hudba, Obrázky nebo Video uživatele, zavolejte metodu StorageLibrary.GetLibraryAsync. Zadejte odpovídající hodnotu z výčtu ZnámýLibraryId.

var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);

Získání seznamu složek v knihovně

Chcete-li získat seznam složek v knihovně, získejte hodnotu StorageLibrary.Folders vlastnost.

using Windows.Foundation.Collections;
IObservableVector<Windows.Storage.StorageFolder> myPictureFolders = myPictures.Folders;

Získání složky v knihovně, ve které se ve výchozím nastavení ukládají nové soubory

Chcete-li získat složku v knihovně, kde jsou nové soubory uloženy ve výchozím nastavení, získejte hodnotu StorageLibrary.SaveFolder vlastnost.

Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;

Přidání existující složky do knihovny

Chcete-li přidat složku do knihovny, zavoláte StorageLibrary.RequestAddFolderAsync. Vezměme si jako příklad knihovnu Obrázky, při zavolání této metody se uživateli zobrazí výběr složky s tlačítko Přidat tuto složku do Obrázků. Pokud uživatel vybere složku, zůstane složka v původním umístění na disku a stane se položkou ve vlastnosti StorageLibrary.Folders (a v integrované aplikaci Fotky), ale složka se v Průzkumníku souborů nezobrazí jako podřízená složka Obrázky.

Windows.Storage.StorageFolder newFolder = await myPictures.RequestAddFolderAsync();

Odebrání složky z knihovny

Pokud chcete odebrat složku z knihovny, zavolejte metodu StorageLibrary.RequestRemoveFolderAsync a zadejte složku, která se má odebrat. K výběru složky, kterou chcete odebrat, můžete použít StorageLibrary.Folders a ovládací prvek ListView (nebo podobný).

Když zavoláte StorageLibrary.RequestRemoveFolderAsync, zobrazí se uživateli potvrzovací dialogové okno s oznámením, že se složka "už nebude zobrazovat v obrázcích, ale neodstraní se". To znamená, že složka zůstane v původním umístění na disku, odebere se z vlastnosti StorageLibrary.Folders a už nebude součástí integrované aplikace Fotky.

Následující příklad předpokládá, že uživatel vybral složku k odebrání z ovládacího prvku ListView názvem lvPictureFolders.

bool result = await myPictures.RequestRemoveFolderAsync(folder);

Oznámení o změnách seznamu složek v knihovně

Pokud chcete dostávat oznámení o změnách seznamu složek v knihovně, zaregistrujte obslužnou rutinu pro událost StorageLibrary.DefinitionChanged knihovny.

myPictures.DefinitionChanged += MyPictures_DefinitionChanged;

void HandleDefinitionChanged(Windows.Storage.StorageLibrary sender, object args)
{
    // ...
}

Složky knihovny médií

Zařízení poskytuje uživatelům a aplikacím pět předdefinovaných umístění pro ukládání mediálních souborů. Předdefinované aplikace ukládají média vytvořená uživatelem i stažená média v těchto umístěních.

Umístění:

  • složka Obrázky. Obsahuje obrázky.

    • složka Camera Roll. Obsahuje fotky a video z integrované kamery.

    • Uložené obrázky složka. Obsahuje obrázky, které uživatel uložil z jiných aplikací.

  • složka Hudba. Obsahuje skladby, podcasty a zvukové knihy.

  • složku Video. Obsahuje videa.

Uživatelé nebo aplikace mohou také ukládat mediální soubory mimo složky knihovny médií na kartě SD. Pokud chcete na kartě SD spolehlivě najít multimediální soubor, naskenujte obsah karty SD nebo požádejte uživatele, aby soubor našel pomocí nástroje pro výběr souborů. Další informace najdete v tématu Přístup kkarty SD .

Dotazy do knihoven médií

Pokud chcete získat kolekci souborů, zadejte knihovnu a požadovaný typ souborů.

using Windows.Storage;
using Windows.Storage.Search;

private async void getSongs()
{
    QueryOptions queryOption = new QueryOptions
        (CommonFileQuery.OrderByTitle, new string[] { ".mp3", ".mp4", ".wma" });

    queryOption.FolderDepth = FolderDepth.Deep;

    Queue<IStorageFolder> folders = new Queue<IStorageFolder>();

    var files = await KnownFolders.MusicLibrary.CreateFileQueryWithOptions
      (queryOption).GetFilesAsync();

    foreach (var file in files)
    {
        // do something with the music files
    }
}

Výsledky dotazů zahrnují interní i vyměnitelné úložiště.

Uživatelé můžou ve výchozím nastavení ukládat soubory na volitelné kartě SD. Aplikace se ale můžou odhlásit z povolení ukládání souborů na kartě SD. V důsledku toho je možné knihovny médií rozdělit mezi interní úložiště zařízení a kartu SD.

Abyste tuto možnost zvládli, nemusíte psát další kód. Metody v oboru názvů Windows.Storage , které dotazují známé složky transparentně kombinují výsledky dotazu z obou umístění. Abyste získali tyto kombinované výsledky, nemusíte v souboru manifestu aplikace zadávat schopnost removableStorage.

Představte si stav úložiště zařízení zobrazený na následujícím obrázku:

obrázky na telefonu a na SD kartě

Pokud se dotazujete na obsah knihovny obrázků voláním await KnownFolders.PicturesLibrary.GetFilesAsync(), výsledky zahrnují internalPic.jpg i SDPic.jpg.

Práce s fotografiemi

Na zařízeních, kde fotoaparát ukládá obrázek s nízkým rozlišením i obrázek s vysokým rozlišením každého obrázku, vrátí hluboké dotazy jenom obrázek s nízkým rozlišením.

Složka Fotoaparát a složka Uložené obrázky nepodporují hloubkové dotazy.

Otevření fotky v aplikaci, která ji zachytila

Pokud chcete uživateli nechat fotku znovu otevřít později v aplikaci, která ji zachytila, můžete CreatorAppId uložit s metadaty fotky pomocí kódu podobného následujícímu příkladu. V tomto příkladu je testPhoto jako StorageFile.

IDictionary<string, object> propertiesToSave = new Dictionary<string, object>();

propertiesToSave.Add("System.CreatorOpenWithUIOptions", 1);
propertiesToSave.Add("System.CreatorAppId", appId);

testPhoto.Properties.SavePropertiesAsync(propertiesToSave).AsyncWait();   

Přidání souboru do knihovny médií pomocí metod streamu

Když přistupujete ke knihovně médií pomocí známé složky, jako je KnownFolders.PictureLibrary, a pomocí metod streamování přidáte soubor do knihovny médií, musíte zavřít všechny streamy, které váš kód otevře. Jinak tyto metody nezvládnou přidat soubor do knihovny médií, jak se očekávalo, protože alespoň jeden datový proud stále drží popisovač souboru.

Když například spustíte následující kód, soubor se do knihovny médií nepřidá. V řádku kódu using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))metody OpenAsync a GetOutputStreamAt otevřou datový proud. V důsledku použití příkazu using se však uvolní pouze datový proud otevřený metodou GetOutputStreamAt. Druhý datový proud zůstane otevřený a zabrání uložení souboru.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");
using (var sourceStream = (await sourceFile.OpenReadAsync()).GetInputStreamAt(0))
{
    using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))
    {
        await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
    }
}

Pokud chcete úspěšně přidat soubor do knihovny médií pomocí metod streamu, nezapomeňte zavřít všechny streamy, které se otevře v kódu, jak je znázorněno v následujícím příkladu.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");

using (var sourceStream = await sourceFile.OpenReadAsync())
{
    using (var sourceInputStream = sourceStream.GetInputStreamAt(0))
    {
        using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0))
            {
                await RandomAccessStream.CopyAndCloseAsync(sourceInputStream, destinationStream);
            }
        }
    }
}