2

我已将应用程序从 ios7 更新到 ios8,并且努力让 UIImagePicker 工作以从“我的照片流”类别的照片中加载图片。UIImagePicker 实现是标准的,我使用以下命令检索所选照片的​​ URL:

NSURL *url = [info objectForKey:@"UIImagePickerControllerReferenceURL"];

然后我使用新的 IOS8 API 来加载这张照片:

PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:nil];

这行不通。result.count 为零,没有找到图像。URL 的 UUID 与我从“时刻”或“相机胶卷”中选择照片的 UUID 不同,但看起来格式正确。(手机运行的是 8.1):

网址 NSURL * @"assets-library://asset/asset.JPG?id=4522DBD1-862C-42BE-AF7C-0D6C76CA7590&ext=JPG"

任何人都有一些代码可以从“我的照片流”中加载照片,或者有一种方法可以为 UIImagePicker 显示禁用它?

使用较旧的 ALAssetsLibrary assetForURL API 也无法加载这些图像。

4

5 回答 5

4

我想你可以试试这个来获得“我的照片流”专辑。

PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumMyPhotoStream options:nil];

My Photo Stream 相册中的照片上传到 iCloud,iCloud 会高效管理,30 天内拍摄的照片都在那里,我认为 PHAsset 或 ALAssetLibrary 处理本地存储的资产。这是我在我的设备上进行的测试,我使用 imagePicker 从流相册中获取照片 url,它是

"assets-library://asset/asset.JPG?id=60AE4E50-B835-47EB-B896-5974C21F8C9B&ext=JPG";

在同一张照片上使用 PHAsset 我得到了它的 localIdentifier:

"60AE4E50-B835-47EB-B896-5974C21F8C9B/L0/001" 

所以我认为你可以从 url 中去除 id,并找出哪个资产的本地标识符包含它,然后你得到你想要的 PHAsset。

于 2014-10-29T15:31:54.707 回答
1

在任何地方都没有找到任何答案后,我为 PHAsset 创建了以下扩展,它在 iOS 8.2 中运行良好,尽管我认为它在理论上很慢。尽管之前的评论之一说这在 iOS8.2 测试版上已修复,但现在 iOS8.2 发布后,我仍然存在该错误。

import Photos
import UIKit

extension PHAsset {
    class func fetchAssetWithALAssetURL (alURL: NSURL) -> PHAsset? {
        let phPhotoLibrary = PHPhotoLibrary.sharedPhotoLibrary()
        let assetManager = PHImageManager()
        var phAsset : PHAsset?

        let optionsForFetch = PHFetchOptions()
        optionsForFetch.includeHiddenAssets = true

        var fetchResult = PHAsset.fetchAssetsWithALAssetURLs([alURL], options: optionsForFetch)
        if fetchResult?.count > 0 {
            return fetchResult[0] as? PHAsset
        } else {
            var str = alURL.absoluteString!
            let startOfString = advance(find(str, "=")!, 1)
            let endOfString = advance(startOfString, 36)
            let range = Range<String.Index>(start:startOfString, end:endOfString)
            let localIDFragment = str.substringWithRange(range)
            let fetchResultForPhotostream = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.AlbumMyPhotoStream, options: nil)
            if fetchResultForPhotostream?.count > 0 {
                let photostream = fetchResultForPhotostream![0] as PHAssetCollection
                let fetchResultForPhotostreamAssets = PHAsset.fetchAssetsInAssetCollection(photostream, options: optionsForFetch)
                if fetchResultForPhotostreamAssets?.count >= 0 {
                    var stop : Bool = false
                    for var i = 0; i < fetchResultForPhotostreamAssets.count && !stop; i++ {
                        let phAssetBeingCompared = fetchResultForPhotostreamAssets[i] as PHAsset
                        if phAssetBeingCompared.localIdentifier.rangeOfString(localIDFragment, options: nil, range: nil, locale: nil) != nil {
                            phAsset = phAssetBeingCompared
                            stop = true
                        }
                    }
                    return phAsset
                }
            }
            return nil
        }
    }
}
于 2015-03-17T05:36:59.407 回答
0

此处讨论使用 ALAssetsLibrary 从 My Photo Stream 加载具有指定 URL 的图像:

ALAssetsLibraryassetForURL:iOS 8.1 中“我的照片流”中的照片总是返回 nil

简而言之,您必须遍历照片流中的所有项目并将它们的 URL 与您的 URL 进行比较,而不是使用assetForURL。上面的链接包含一个代码示例。

它看起来很尴尬,比assetForURL运行得慢,并且确定是否没有找到具有指定URL的任何文件并不容易,但我没有找到任何其他方法(迁移到Photos框架除外)。

于 2014-11-20T12:25:06.110 回答
0

对于 PHAsset,我使用

[[PHImageManager defaultManager] requestImageForAsset:imageAsset
                                               targetSize:targetSize
                                              contentMode:PHImageContentModeAspectFit
                                                  options:options
                                            resultHandler:^(UIImage *img, NSDictionary *info)
{ // code for handle image }];

我尝试使用requestImageDataForAsset,但对于流式传输的照片,它返回 nil。

于 2015-10-09T20:57:31.753 回答
-1

Work for me in 8.0

import Photos

func imageFromAsset(nsurl: NSURL) {
    let asset = PHAsset.fetchAssetsWithALAssetURLs([nsurl], options: nil).firstObject as! PHAsset
    let targetSize = CGSizeMake(300, 300)
    var options = PHImageRequestOptions()

    PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: PHImageContentMode.AspectFit, options: options, resultHandler: {
        (result, info) in
        // imageE - UIImageView on scene
        self.imageE.image = result
    })
}
于 2015-08-20T01:17:21.153 回答