一. ALAssetsLibrary 介绍

ALAssetsLibrary 提供了访问iOS设备下”照片”应用下所有照片和视频的接口;

  1. 从 ALAssetsLibrary 中可读取所有的相册数据,即 ALAssetsGroup 对象列表;
  2. 从每个 ALAssetsGroup 中可获取到其中包含的照片或视频列表,即 ALAsset 对象列表;
  3. 每个 ALAsset 可能有多个representations表示,即 ALAssetRepresentation 对象,使用其 defaultRepresentation 方法可获得其默认representations,使用[asset valueForProperty: ALAssetPropertyRepresentations ]可获取其所有representations的 UTI 数组。
  4. 从ALAsset对象可获取缩略图 thumbnail 或 aspectRatioThumbnail ;
  5. 从 ALAssetRepresentation 对象可获取全尺寸图片( fullResolutionImage ),全屏图片( fullScreenImage )及图片的各种属性: orientation , dimensions, scale , url , metadata 等。

其层次关系为 ALAssetsLibrary -> ALAssetsGroup -> ALAsset ->ALAssetRepresentation 。

注意:

  1. The lifetimes of objects you get back from a library instance are tied to the lifetime of the library instance.

    通过ALAssetsLibrary对象获取的其他对象只在该ALAssetsLibrary对象生命期内有效,若ALAssetsLibrary对象被销毁,则其他从它获取的对象将不能被访问,否则有会错误。

    invalid attempt to access ALAssetPrivate past the lifetime of its owning ALAssetsLibrary

  2. ALAssetRepresentation的 metadata 方法很慢,我在iPhone4 iOS5.1.1中测试,此方法返回需要40-50ms,所以获取图片的个各种属性尽量直接从ALAssetRepresentation中获取,不要读取metadata。 这里 给出了一个此方法占用内存过多的解释,调用多次也确实很容易会memory warning,或许也能解析其为什么很慢吧。

    The method [representation metadata] returns an autoreleased object and possibly creates more autoreleased objects when it executes. All these instances are added to the autorelease pool, waiting to be finally released (and their memory freed) when the ARP gets the chance to drain itself.

  3. 系统”相册”程序显示的图片是 fullScreenImage ,而不是 fullResolutionImage ,fullResolutionImage尺寸太大,在手机端显示推荐用fullScreenImage。 
    fullScreenImage已被调整过方向,可直接使用,即

    <code style="padding: 0.3em; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; border: 0px; display: block; overflow-y: auto;"><span class="title" style="color: rgb(153, 0, 0); font-weight: bold;">[UIImage imageWithCGImage:representation.fullScreenImage]</span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">;</span></code>

    使用fullResolutionImage要自己调整方法和scale,即

    <code style="padding: 0.3em; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; border: 0px; display: block; overflow-y: auto;"><span class="title" style="color: rgb(153, 0, 0); font-weight: bold;">[UIImage imageWithCGImage:representation.fullResolutionImage scale:representation.scale orientation:representation.orientation]</span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">;</span></code>

二.创建 ALAssetsLibrary对象

使用ALAssetsLibrary之前需导入头文件和AssetsLibrary.framework。

<code style="padding: 0.3em; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; border: 0px; display: block; overflow-y: auto;">
<span class="indent">  </span><span class="comment" style="color: rgb(153, 153, 136); font-style: italic;">#import </span><span class="indent">  </span>...
<span class="indent">  </span>ALAssetsLibrary <span class="variable" style="color: rgb(0, 128, 128);">*assetsLibrary</span> = [[ALAssetsLibrary alloc]init];
<span class="indent">  </span>...</code>

三.遍历Assets Group

  • 使用 enumerateGroupsWithTypes:usingBlock:failureBlock: 方法可遍历assets group;
  • 此方法为异步执行,若之前未被授权过,此方法会向用户请求访问数据的权限;若用户拒绝授权或其他错误则会执行failureBlock;
  • 如果用户关掉了位置服务(Location Services,在设置->通用中),返回的错误为ALAssetsLibraryAccessGloballyDeniedError 。
  • enumerationBlock和failureBlock与在调用此方法的线程内执行,若要在背景线程进行遍历,可将遍历代码放入GCD或NSOperation中。
<code style="padding: 0.3em; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; border: 0px; display: block; overflow-y: auto;">[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup <span class="variable" style="color: rgb(0, 128, 128);">*group</span>, BOOL <span class="variable" style="color: rgb(0, 128, 128);">*stop</span>) {<span class="keyword" style="font-weight: bold;">if</span> (!group) {[tableView performSelectorOnMainThread:<span class="variable" style="color: rgb(0, 128, 128);">@selector</span>(reloadData) withObject:nil waitUntilDone:NO];}<span class="keyword" style="font-weight: bold;">else</span>{[groupsArray addObject:group];...}} failureBlock:^(NSError <span class="variable" style="color: rgb(0, 128, 128);">*error</span>) {NSLog(<span class="variable" style="color: rgb(0, 128, 128);">@"</span>error:<span class="variable" style="color: rgb(0, 128, 128);">%@</span><span class="string" style="color: rgb(221, 17, 68);">",error);}];
</span></code>

四.遍历Assets Group中的Assets

  • 使用 enumerateAssetsUsingBlock: 方法或者其他变体方法可遍历ALAssetsGroup中的所有ALAsset;
  • 可通过 setAssetsFilter: 设置过滤器( ALssetsFilter )使enumerateAssetsUsingBlock:只返回特定类型asset,而 numberOfAssets 只返回特定类型asset的数量。 
    可以设置只显示Photo( allPhotos ),只显示Video( allVideos ),或显示全部(allAssets )。
  • enumerateAssetsUsingBlock:为同步方法,只有所有Asset遍历完才返回。所以需要将遍历代码放入背景线程,防止阻塞UI线程。
<code style="padding: 0.3em; font-family: Monaco, Menlo, Consolas, 'Courier New', monospace; border: 0px; display: block; overflow-y: auto;">[assetsGroup setAssetsFilter:[ALAssetsFilter allPhotos]];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, <span class="number" style="color: rgb(0, 153, 153);">0</span>), ^{[assetsGroup enumerateAssetsUsingBlock:^(ALAsset <span class="variable" style="color: rgb(0, 128, 128);">*result</span>, NSUInteger <span class="keyword" style="font-weight: bold;">index</span>, BOOL <span class="variable" style="color: rgb(0, 128, 128);">*stop</span>) {<span class="keyword" style="font-weight: bold;">if</span> (!result) {[tableView performSelectorOnMainThread:<span class="variable" style="color: rgb(0, 128, 128);">@selector</span>(reloadData) withObject:nil waitUntilDone:NO];}<span class="keyword" style="font-weight: bold;">else</span>{[assetsArray addObject:result];...}}];});
</code>

五.根据url获取asset

使用ALAssetsLibrary的 assetForURL:resultBlock:failureBlock: 方法,可根据之前从ALAssetRepresentation中获取的url重新获取ALAsset对象,此方法同enumerateGroupsWithTypes:usingBlock:failureBlock:一样为异步方法。

六.获取Assets的各种属性

  1. 相册封面图片 [assetsGroup posterImage ];
  2. 照片url[[[asset defaultRepresentation] url] absoluteString];
  3. 照片缩略图 
    [asset thumbnail]; 
    [asset aspectRatioThumbnail];
  4. 照片全尺寸图 
    [[asset defaultRepresentation] fullResolutionImage];
  5. 照片全屏图 
    [[asset defaultRepresentation] fullScreenImage];
  6. 照片创建时间 
    [asset valueForProperty:ALAssetPropertyDate];
  7. 照片拍摄位置(可能为nil) 
    [asset valueForProperty:ALAssetPropertyLocation];
  8. 照片尺寸 
    [[asset defaultRepresentation] dimensions];

ALAssetsLibrary读取所有照片相关推荐

  1. java读取网络图片数据_如何利用java读取网络照片

    如何利用java读取网络照片 Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的`编程.以下是小编为大家搜索整理的如何利用java读取网络照片, ...

  2. MATLAB中读取网络照片

    MATLAB中读取网络照片很简单,和读取本地照片方法基本一致. 以读取我最最爱的明星郭静为例: url='http://pic.baike.soso.com/p/20130709/2013070914 ...

  3. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...

  4. android 图片读写,Android读取本地照片和视频相册

    前言 项目中经常要选择本地照片或者视频的需求,如果去扫描整个SD卡就太耗时间,其实Android系统在启动时就已经把整个设备中的多媒体文件信息(文件名,类型,大小等)都存到了数据库,然后提供了Cont ...

  5. java 访问mtp设备_GitHub - duongnartist/AndroidOtgUSBMtpSample: 探究读取单反相机照片并复制到到手机内部存储中的Android解决方案...

    AndroidOtgUSBMtpSample 最近在做一个手机连接单反相机,最终目的是实现相册直播边拍边传功能. 经过一番尝试,发现 Android 应用获取外部设备文件一共有这样四种方式 内容提供器 ...

  6. 读取本地照片 以流的形式进行显示

    获取到前端传来的文件名称,到相应的文件中去读取,通过流的形式写到响应体中. /*** 显示图片 * getFeedBackPicture.do?picName=* @return*/@RequestM ...

  7. 小米手机qq不读取相册照片_小米手机越用越卡怎么办?

    手机越用越卡是一种很常见的现象,不只是小米手机如此,这是安卓手机的通病. 八年的小米的手机使用体验,有一些清理垃圾,加快手机速度的方法分享给大家. 方法一(最有效):点进手机的设置--应用设置--应用 ...

  8. android之读取相册照片并显示

    参考资料: https://blog.csdn.net/sm16111/article/details/82115460 https://www.jb51.net/article/160230.htm ...

  9. 相册权限_苹果手机惊现漏洞?App在未获取相册权限的情况下成功读取照片

    近日,知乎上网友爆料发现苹果手机存在漏洞,一款名叫"时间规划局"的App可在未获取相册权限的情况下读取照片.专家猜测可能是App调用了苹果的私有库,绕过了系统的授权机制. 2月26 ...

最新文章

  1. 反编译与反汇编、C++编译过程,包括预编译--汇编--编译--链接
  2. Nature:希望你在读博士之初就能知道的 20 件事
  3. tf.variable和tf.get_Variable以及tf.name_scope和tf.variable_scope的区别
  4. arcgis andin使用python窗体_在ArcGIS?10中使用python
  5. python numpy加速 cupy
  6. Python的DataFrame多个条件过滤错误
  7. Linux 交换空间优化(swap 优化)(积极使用交换空间占比,可能会使程序运行缓慢!)
  8. zynqNet整体思路框架
  9. 马斯克投15亿,价值47000美元的比特币,其实是一群数学家搞出来的……
  10. 4.4 Spark SQL实现用户ip地址热度分析
  11. 车牌识别 android,Android tess-two车牌识别
  12. 汽车防撞之FMCW(调频连续波)原理
  13. 离散数学及其应用(一)
  14. [技术讨论][DDS] AD9833原理介绍及chiliDDS驱动分享(上)
  15. 技术人应该如何提升影响力
  16. 简单一招能让你的浏览器下载速度提升几十倍,从此弃用IDM等下载器
  17. 面试前应该怎么准备面试过程才不会紧张呢
  18. Vue中实现电子围栏/围栏(高德地图)功能:
  19. html页面清除缓存
  20. 百度Paddle团队招聘算法实习生

热门文章

  1. 记忆化01背包 我爱洗衣服啊
  2. CF#354_B_Pyramid of Glasses(模拟)
  3. u盘是计算机储存设备吗,U盘存储器是哪种存储类型?
  4. 2007签名 ZT(有点意思)
  5. 如何设计一个低代码平台
  6. C++ 实现安卓手机拍照全景模式
  7. 【读书笔记】关于写读书笔记的阶段性总结
  8. 产品经理必备的5大工具
  9. 蓝桥冲刺31天之白色情人节
  10. Android软键盘输入详解