问题
I have an app that retrieves files in two ways: one using a file picker and the other, using the path directly. In both cases, I get the file, add it to the future access list, and save the token in an array. Later in the app, I use the token to retrieve the file using futureAccessList.getFileAsync. Now, the 2nd half, i.e. getting back of the file using the token code is identical in both cases, so it must be something in the way I add it to the future access list, because it works when I use the filepicker, but not when I use the path directly.
Filepicker add code
// Create the picker object and set options
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.musicLibrary;
// Select MIDI files only
openPicker.fileTypeFilter.replaceAll([".mp3"]);
// Open the picker for the user to pick a file
openPicker.pickSingleFileAsync().then(function (file) {
if (file) {
// Application now has read/write access to the picked file
WinJS.log && WinJS.log("Picked file: " + file.name, "sample", "status");
// Store the file to access again later
var listToken = Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.add(file);
// Save the file mapping. If it exists, overwrite.
fileMappings[padId] = { padNumber: padId, audioFile: listToken };
}
else {
// The picker was dismissed with no selected file
WinJS.log && WinJS.log("Operation cancelled.", "sample", "status");
}
});
Direct path add code
Windows.Storage.KnownFolders.musicLibrary.getFileAsync("filename.mp3").then(function (file) {
if (file) {
// Application now has read/write access to the picked file
WinJS.log && WinJS.log("Picked file: " + file.name + ", full path: " + file.path, "sample", "status");
// Store the file to access again later
var listToken = Windows.Storage.AccessCache.StorageApplicationPermissions.futureAccessList.add(file);
// Save the file mapping. If it exists, overwrite.
fileMappings['pad0'] = { padNumber: 'pad0', audioFile: listToken };
}
else {
// Could not get access to the file
WinJS.log && WinJS.log("File unavailable!", "sample", "status");
}
});
Personally, I feel like this line (Windows.Storage.KnownFolders.musicLibrary.getFileAsync) doesn't give me read-write access, just read, and that might be what's messing it up. Here is a related thread on msdn. It's a C#-MediaElement question, but closely related. Any idea what could be wrong here? If it's permissions-related, how can I specify that I need r-w access? I thought specifying capabilities in the appxmanifest was good enough. I can add the file retrieval code here if anyone needs it. Thanks for your time.
[Windows RT app using Javascript. Confirmed 'Music Library' capability is checked.]
回答1:
Your code is correct. This is a bug in the WinRT API. I work on that part of the system and have filed a bug on this topic.
来源:https://stackoverflow.com/questions/24966568/cannot-retrieve-file-from-futureaccesslist-if-i-use-getfileasync-instead-of-pick