3

我正在本地文档中保存一个新创建的视频文件。然后我想使用照片框架将它复制到照片库中。

问题是,即使正在写出视频(我可以确认它在那里并且可以查看),以下创建请求总是返回 nil:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

    // NSString filePath points to the newly-created file in Documents directory
    NSParameterAssert([[NSFileManager defaultManager] isReadableFileAtPath:filePath]);
    // path looks fine

    NSURL* url = [NSURL URLWithString:filePath];
    PHAssetChangeRequest* createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url];

    // got back nil from creationRequestForAssetFromVideoAtFileURL, so we will assert out here
    NSParameterAssert(createAssetRequest);
}
completionHandler:^(BOOL success, NSError *error) {}];
4

2 回答 2

0

你需要使用NSURL* url = [NSURL fileURLWithPath:filePath];. 这是我的演示代码,对我来说很好用:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    NSURL *localFileUrl = [NSURL fileURLWithPath:localSavedPath];
    PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:localFileUrl];
    if (localAssetCollection != nil) {
        PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:localAssetCollection];
        [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]];
    }
} completionHandler:^(BOOL success, NSError *error) {
}];

我的演示还支持更改资产集合。

于 2016-03-17T07:27:37.603 回答
0

毫不奇怪,URL 就是问题所在。url = [NSURL URLWithString:filePath]不指向电影文件。如果我通过url以下方式进入(例如)就可以了:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSArray *contents = [fileManager contentsOfDirectoryAtURL:documentsURL
                                       includingPropertiesForKeys:@[]
                                                          options:NSDirectoryEnumerationSkipsHiddenFiles
                                                            error:nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastPathComponent == 'movie.mov'"];
NSURL* url = nil;
for (NSURL *fileURL in [contents filteredArrayUsingPredicate:predicate]) {
    url = fileURL;
}
于 2015-07-28T23:15:56.033 回答