替换 ALAssertLibrary 以获取文件名

Posted

技术标签:

【中文标题】替换 ALAssertLibrary 以获取文件名【英文标题】:Replacing ALAssertLibrary to get the filename 【发布时间】:2016-05-24 06:13:13 【问题描述】:

我正在使用以下代码访问我要上传的图像的文件名。我需要文件名以及文件路径和大小。

  ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *imageAsset)
    
        ALAssetRepresentation *imageRep = [imageAsset defaultRepresentation];
        NSLog(@"[imageRep filename] : %@", [imageRep filename]);
        [_imageNameArray addObject:[imageRep filename]];
    ;

    [_uploadTbleView reloadData];
    ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
    [assetslibrary assetForURL:refURL resultBlock:resultblock failureBlock:nil];

我面临的问题是,

    Xcode 会抛出一条警告消息,指出不推荐使用 ALAssetsLibraryAssetForURLResultBlock。如何替换上面的代码来获取文件名? 我尝试使用 PHAsset,但每次选择文件时,所有图像文件的文件名都相同,称为 asset.jpg

【问题讨论】:

【参考方案1】:

你可以试试这个:

 PHAsset *asset = nil;
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
if (fetchResult != nil && fetchResult.count > 0) 
    // get last photo from Photos
    asset = [fetchResult lastObject];


if (asset) 
    // get photo info from this asset
    PHImageRequestOptions * imageRequestOptions = [[PHImageRequestOptions alloc] init];
    imageRequestOptions.synchronous = YES;
    [[PHImageManager defaultManager]
             requestImageDataForAsset:asset
                            options:imageRequestOptions
                      resultHandler:^(NSData *imageData, NSString *dataUTI,
                                      UIImageOrientation orientation, 
                                      NSDictionary *info) 
     
          NSLog(@"info = %@", info);
          if ([info objectForKey:@"PHImageFileURLKey"]) 
               // path looks like this - 
               // file:///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG
               NSURL *path = [info objectForKey:@"PHImageFileURLKey"];
                                                 
    ];

【讨论】:

资产 = [fetchResult lastObject];打印最后捕获的图​​像文件名我希望所选图像对象不是最后一个 [fetchResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) NSLog(@"asset %@", asset); ]; 阅读文档将非常有帮助,因此您将对 PHAsset nshipster.com/phimagemanager 有一个很好的了解 我试过了,但它没有得到所选文件的名称,但它枚举了相册中的所有文件并打印了相应的名称 这确实提供了路径.. 但我看到的问题如下:Error Domain=NSCocoaErrorDomain Code=257"The file “IMG_0811.JPG” couldn’t be opened because you don’t have permission to view it." UserInfo=NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0811.JPG,NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0811.JPG,NSUnderlyingError=0x1744525d0 Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" #Generic```

以上是关于替换 ALAssertLibrary 以获取文件名的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不替换的情况下以编程方式修改/更新 plist 文件?

什么应该替换已弃用的 Facebook adView setAdListener 以获取回调?

搜索日志文件以获取 2 个纪元时间之间的条目范围

雪花复制命令以将默认值替换为 null

vbscript 以安全的方式从页面获取属性或元数据(因此,如果元数据不存在,则不会丢失)。在这个例子中,我们是替换

如何在 Ant 目标中使用文件大小