使用 AssetsLibrary 框架 iPhone 访问库中的视频?

Posted

技术标签:

【中文标题】使用 AssetsLibrary 框架 iPhone 访问库中的视频?【英文标题】:Accessing Videos in library using AssetsLibrary framework iPhone? 【发布时间】:2010-10-16 10:21:11 【问题描述】:

我正在尝试使用 AssetsLibrary 框架在以下代码的帮助下访问 iPhone 库中的视频...但是当我运行应用程序时,代码无法正常工作...数组资产仍然为空?我做错了什么?

顺便说一下,我的 iPhone 是 3G 升级到 iPhone 4.1。(但资产框架没有给出任何错误)

NSMutableArray *assets = [[NSMutableArray alloc]init];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];

void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
        if(result != NULL) 
                NSLog(@"See Asset: %@", result);
                [assets addObject:result];
            
        ;

    void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) 
        if(group != nil) NSLog(@"dont See Asset: ");
                [group enumerateAssetsUsingBlock:assetEnumerator];
            
        ;

    assets = [[NSMutableArray alloc] init];
    library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupAlbum
                           usingBlock:assetGroupEnumerator
                         failureBlock: ^(NSError *error) 
                                 NSLog(@"Failure");
                             ];

【问题讨论】:

【参考方案1】:

4.1 升级似乎“破坏”了一些图像选择器示例,请注意以下几行,它们在您发布的代码之后运行:

NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces;
[assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:failureBlock];

这使我的 4.1 iPhone 和模拟器上的资产为零。但是更改 groupTypes 会有所帮助,因此请设置

 NSUInteger groupTypes = ALAssetsGroupAll;

您应该开始看到一些资产。

【讨论】:

【参考方案2】:

我在 Xcode 4.1、ios 5 中做到了这一点:

ALAssetsGroupEnumerationResultsBlock assetEnumerator = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
    if(result != NULL) 
        NSLog(@"See Asset: %@", result);
        [assets addObject:result];
    
;

ALAssetsLibraryGroupsEnumerationResultsBlock assetGroupEnumerator = ^(ALAssetsGroup *group, BOOL *stop) 
    if(group != nil) NSLog(@"dont See Asset: ");
        [group enumerateAssetsUsingBlock:assetEnumerator];
    
;

assets = [[NSMutableArray alloc] init];
library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAlbum
                       usingBlock:assetGroupEnumerator
                     failureBlock: ^(NSError *error) 
                         NSLog(@"Failure");
                     ];

它对我有用。

【讨论】:

【参考方案3】:

双重初始化:

 NSMutableArray *assets = [[NSMutableArray alloc]init];
 ALAssetsLibrary *library =[[ALAssetsLibrary alloc]init];

 void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 
 if(result != NULL) 
      NSLog(@"See Asset: %@", result);
      [assets addObject:result];

        
;

void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) 
    if(group != nil) NSLog(@"dont See Asset: ");
            [group enumerateAssetsUsingBlock:assetEnumerator];
    
;

   assets = [[NSMutableArray alloc] init];
   library = [[ALAssetsLibrary alloc] init**];
   [library enumerateGroupsWithTypes:ALAssetsGroupAlbum
                       usingBlock:assetGroupEnumerator
                     failureBlock: ^(NSError *error) 
                             NSLog(@"Failure");
                         ];

【讨论】:

【参考方案4】:

我正在使用 ELC Image Picker Controller,它已经在使用 ALAssetsGroupAll 并且仍然没有显示任何视频。

我通过添加资产过滤器解决了这个问题。您可以限制为视频、照片或两者。我猜只有照片是默认设置。如果上述失败,请考虑以下行:

[assetGroup setAssetsFilter:[ALAssetsFilter allAssets]];

【讨论】:

以上是关于使用 AssetsLibrary 框架 iPhone 访问库中的视频?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AssetsLibrary 框架加载图像太慢

当我在设备上运行程序时,AssetsLibrary 没有获取保存在相机胶卷中的图像

相册框架之AssetsLibrary

在 iOS 8 中删除专辑后 AssetsLibrary 框架无法正常工作

ALAssetsLibrary enumerateGroupsWithTypes 不返回数据

iOS 开发之照片框架详解