File dan folder dalam pustaka Musik, Gambar, dan Video
Tambahkan folder musik, gambar, atau video yang ada ke pustaka terkait. Anda juga dapat menghapus folder dari pustaka, mendapatkan daftar folder di perpustakaan, dan menemukan foto, musik, dan video yang disimpan.
Pustaka adalah kumpulan folder virtual, yang mencakup folder yang diketahui secara default ditambah folder lain yang telah ditambahkan pengguna ke pustaka dengan menggunakan aplikasi Anda atau salah satu aplikasi bawaan. Misalnya, pustaka Gambar menyertakan folder Gambar yang diketahui secara default. Pengguna dapat menambahkan folder ke, atau menghapusnya dari, pustaka Gambar dengan menggunakan aplikasi Anda atau aplikasi Foto bawaan.
Prasyarat
Memahami pemrograman asinkron untuk aplikasi Universal Windows Platform (UWP)
Anda dapat mempelajari cara menulis aplikasi asinkron di C# atau Visual Basic, lihat Memanggil API asinkron di C# atau Visual Basic. Untuk mempelajari cara menulis aplikasi asinkron di C++, lihat Pemrograman asinkron di C++.
Izin akses ke lokasi
Di Visual Studio, buka file manifes aplikasi di Manifest Designer. Pada halaman Kemampuan , pilih pustaka yang dikelola aplikasi Anda.
- Pustaka Musik
- Pustaka Gambar
- Pustaka Video
Untuk mempelajari selengkapnya, lihat Izin akses file.
Mendapatkan referensi ke pustaka
Catatan
Ingatlah untuk mendeklarasikan kemampuan yang sesuai. Lihat Deklarasi kemampuan aplikasi untuk informasi selengkapnya.
Untuk mendapatkan referensi ke pustaka Musik, Gambar, atau Video pengguna, panggil metode StorageLibrary.GetLibraryAsync . Berikan nilai yang sesuai dari enumerasi KnownLibraryId .
var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
Mendapatkan daftar folder dalam pustaka
Untuk mendapatkan daftar folder di pustaka, dapatkan nilai properti StorageLibrary.Folders .
using Windows.Foundation.Collections;
IObservableVector<Windows.Storage.StorageFolder> myPictureFolders = myPictures.Folders;
Dapatkan folder di pustaka tempat file baru disimpan secara default
Untuk mendapatkan folder di pustaka tempat file baru disimpan secara default, dapatkan nilai properti StorageLibrary.SaveFolder .
Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;
Menambahkan folder yang sudah ada ke pustaka
Untuk menambahkan folder ke pustaka, Anda memanggil StorageLibrary.RequestAddFolderAsync. Mengambil Pustaka Gambar sebagai contoh, memanggil metode ini menyebabkan pemilih folder ditampilkan kepada pengguna dengan tombol Tambahkan folder ini ke Gambar . Jika pengguna memilih folder maka folder tetap berada di lokasi aslinya pada disk dan menjadi item di properti StorageLibrary.Folders (dan di aplikasi Foto bawaan), tetapi folder tidak muncul sebagai anak dari folder Gambar di File Explorer.
Windows.Storage.StorageFolder newFolder = await myPictures.RequestAddFolderAsync();
Menghapus folder dari pustaka
Untuk menghapus folder dari pustaka, panggil metode StorageLibrary.RequestRemoveFolderAsync dan tentukan folder yang akan dihapus. Anda dapat menggunakan StorageLibrary.Folders dan kontrol ListView (atau sejenisnya) agar pengguna memilih folder yang akan dihapus.
Saat Anda memanggil StorageLibrary.RequestRemoveFolderAsync, pengguna melihat dialog konfirmasi yang mengatakan bahwa folder "tidak akan muncul di Gambar lagi, tetapi tidak akan dihapus." Artinya, folder tetap berada di lokasi aslinya pada disk, dihapus dari properti StorageLibrary.Folders , dan tidak akan lagi disertakan dalam aplikasi Foto bawaan.
Contoh berikut mengasumsikan bahwa pengguna telah memilih folder untuk dihapus dari kontrol ListView bernama lvPictureFolders.
bool result = await myPictures.RequestRemoveFolderAsync(folder);
Mendapatkan pemberitahuan tentang perubahan pada daftar folder dalam pustaka
Untuk mendapatkan pemberitahuan tentang perubahan pada daftar folder di pustaka, daftarkan handler untuk peristiwa StorageLibrary.DefinitionChanged dari pustaka.
myPictures.DefinitionChanged += MyPictures_DefinitionChanged;
void HandleDefinitionChanged(Windows.Storage.StorageLibrary sender, object args)
{
// ...
}
Folder pustaka media
Perangkat menyediakan lima lokasi yang telah ditentukan sebelumnya bagi pengguna dan aplikasi untuk menyimpan file media. Aplikasi bawaan menyimpan media yang dibuat pengguna dan media yang diunduh di lokasi ini.
Lokasi-lokasi tersebut adalah:
Folder gambar . Berisi gambar.
Folder Rol Kamera . Berisi foto dan video dari kamera bawaan.
Folder Gambar Tersimpan . Berisi gambar yang telah disimpan pengguna dari aplikasi lain.
Folder musik . Berisi lagu, podcast, dan buku audio.
Folder video. Berisi video.
Pengguna atau aplikasi juga dapat menyimpan file media di luar folder pustaka media pada kartu SD. Untuk menemukan file media dengan andal di kartu SD, pindai konten kartu SD, atau minta pengguna untuk menemukan file dengan menggunakan pemilih file. Untuk informasi selengkapnya, lihat Mengakses kartu SD.
Mengkueri pustaka media
Untuk mendapatkan kumpulan file, tentukan pustaka dan jenis file yang Anda inginkan.
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
}
}
Hasil kueri mencakup penyimpanan internal dan yang dapat dilepas
Pengguna dapat memilih untuk menyimpan file secara default pada kartu SD opsional. Namun, aplikasi dapat menolak mengizinkan file disimpan di kartu SD. Akibatnya, pustaka media dapat dibagi di seluruh penyimpanan internal perangkat dan kartu SD.
Anda tidak perlu menulis kode tambahan untuk menangani kemungkinan ini. Metode di namespace Windows.Storage yang mengkueri folder yang diketahui secara transparan menggabungkan hasil kueri dari kedua lokasi. Anda tidak perlu menentukan kemampuan removableStorage dalam file manifes aplikasi untuk mendapatkan hasil gabungan ini.
Pertimbangkan status penyimpanan perangkat yang diperlihatkan dalam gambar berikut:
Jika Anda mengkueri konten Pustaka Gambar dengan memanggil await KnownFolders.PicturesLibrary.GetFilesAsync()
, hasilnya menyertakan internalPic.jpg dan SDPic.jpg.
Bekerja dengan foto
Pada perangkat tempat kamera menyimpan gambar resolusi rendah dan gambar resolusi tinggi dari setiap gambar, kueri mendalam hanya mengembalikan gambar resolusi rendah.
Rol Kamera dan folder Gambar Tersimpan tidak mendukung kueri mendalam.
Membuka foto di aplikasi yang mengambilnya
Jika Anda ingin membiarkan pengguna membuka foto lagi nanti di aplikasi yang mengambilnya, Anda dapat menyimpan CreatorAppId dengan metadata foto dengan menggunakan kode yang mirip dengan contoh berikut. Dalam contoh ini, testPhoto adalah StorageFile.
IDictionary<string, object> propertiesToSave = new Dictionary<string, object>();
propertiesToSave.Add("System.CreatorOpenWithUIOptions", 1);
propertiesToSave.Add("System.CreatorAppId", appId);
testPhoto.Properties.SavePropertiesAsync(propertiesToSave).AsyncWait();
Menggunakan metode stream untuk menambahkan file ke pustaka media
Saat Anda mengakses pustaka media dengan menggunakan folder yang dikenal seperti KnownFolders.PictureLibrary, dan Anda menggunakan metode streaming untuk menambahkan file ke pustaka media, Anda harus memastikan untuk menutup semua aliran yang dibuka kode Anda. Jika tidak, metode ini gagal menambahkan file ke pustaka media seperti yang diharapkan karena setidaknya satu aliran masih memiliki handel ke file.
Misalnya, saat Anda menjalankan kode berikut, file tidak ditambahkan ke pustaka media. Dalam baris kode, using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))
, baik metode OpenAsync maupun metode GetOutputStreamAt membuka aliran. Namun hanya aliran yang dibuka oleh metode GetOutputStreamAt yang dibuang sebagai akibat dari pernyataan penggunaan . Aliran lainnya tetap terbuka dan mencegah penyimpanan file.
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);
}
}
Agar berhasil menggunakan metode stream untuk menambahkan file ke pustaka media, pastikan untuk menutup semua aliran yang dibuka kode Anda, seperti yang ditunjukkan dalam contoh berikut.
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);
}
}
}
}