这是Apple的示例代码 AVCamManualExtendingAVCamtoUseManualCaptureAPI 的片段,其中必须将DNG数据写入文件,然后再转移到 PHPhotoLibrary :
[PHPhotoLibrary requestAuthorization:^( PHAuthorizationStatus status ) {
if ( status == PHAuthorizationStatusAuthorized ) {
NSURL *temporaryDNGFileURL;
if ( self.dngPhotoData ) {
temporaryDNGFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%lld.dng", resolvedSettings.uniqueID]]];
[self.dngPhotoData writeToURL:temporaryDNGFileURL atomically:YES];
}
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetCreationRequest *creationRequest = [PHAssetCreationRequest creationRequestForAsset];
if ( self.jpegPhotoData ) {
[creationRequest addResourceWithType:PHAssetResourceTypePhoto data:self.jpegPhotoData options:nil];
if ( temporaryDNGFileURL ) {
PHAssetResourceCreationOptions *companionDNGResourceOptions = [[PHAssetResourceCreationOptions alloc] init];
companionDNGResourceOptions.shouldMoveFile = YES;
[creationRequest addResourceWithType:PHAssetResourceTypeAlternatePhoto fileURL:temporaryDNGFileURL options:companionDNGResourceOptions];
}
}
else {
PHAssetResourceCreationOptions *dngResourceOptions = [[PHAssetResourceCreationOptions alloc] init];
dngResourceOptions.shouldMoveFile = YES;
[creationRequest addResourceWithType:PHAssetResourceTypePhoto fileURL:temporaryDNGFileURL options:dngResourceOptions];
}
} completionHandler:^( BOOL success, NSError * _Nullable error ) {
if ( ! success ) {
NSLog( @"Error occurred while saving photo to photo library: %@", error );
}
if ( [[NSFileManager defaultManager] fileExistsAtPath:temporaryDNGFileURL.path] ) {
[[NSFileManager defaultManager] removeItemAtURL:temporaryDNGFileURL error:nil];
}
[self didFinish];
}];
}
else {
NSLog( @"Not authorized to save photo" );
[self didFinish];
}
}];
在上面的代码中,该行使用 resolvedSettings.uniqueID 创建DNG文件名:
temporaryDNGFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%lld.dng", resolvedSettings.uniqueID]]];
上面一行创建一个名为23lld.dng的文件。当用户想要连续文件名以及照片库中的JPEG和其他资产文件名时,这就成了一个问题。
如果用户上次资产的文件名为 IMG_0155.jpg ,则在这种情况下,正在创建的DNG文件应为 IMG_0156.dng 。
我如何才能获得DNG文件的正确名称?
我遇到了值得注意的API:
不知怎的,我把所有人绑在一起想出一个解决方案。