簡體   English   中英

在iOS8上使用UIImagePicker結果URL和PHAsset從“我的照片流”加載圖像

[英]Loading image from “My Photo Stream” using UIImagePicker results URL and PHAsset on iOS8

我將一個應用程序從ios7更新為ios8,並努力使UIImagePicker可以從照片的“我的照片流”類別中加載圖片。 UIImagePicker實現是標准的,我使用以下方法檢索所選照片的​​URL:

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

然后,我使用新的IOS8 API加載此照片:

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

這行不通。 result.count為零,找不到圖像。 與我從“時刻”或“相機膠卷”中選擇照片相比,URL具有不同的UUID,但看起來格式正確。 (電話運行8.1):

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

任何人都有一些代碼可以從“我的照片流”中加載照片,或者可以將其禁用以用於UIImagePicker顯示嗎?

使用較舊的ALAssetsLibrary assetForURL API也會無法加載這些圖像。

我想您可以嘗試獲取“我的照片流”相冊。

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

“我的照片流”相冊中的照片被上傳到iCloud,iCloud將對其進行有效管理,在那里可以在30天內捕獲照片,並且我認為PHAsset或ALAssetLibrary處理本地存儲的資產。 這是我在設備上進行的測試,我使用了imagePicker從流相冊中獲取照片網址,這是

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

並在同一張照片上使用PHAsset,得到其localIdentifier:

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

因此,我認為您可以從網址中刪除ID,並找出包含該資產的本地標識符,然后獲得所需的PHAsset。

在任何地方都找不到答案后,我創建了PHAsset的以下擴展,盡管我認為它在理論上很慢,但它在iOS 8.2上運行良好。 即使先前的評論之一說這已在iOS8.2 beta上修復,但該錯誤對於我而言仍然存在,因為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
        }
    }
}

這里討論了使用ALAssetsLibrary從“我的照片流”中加載具有指定URL的圖像:

ALAssetsLibrary assetForURL:對於iOS 8.1中的“我的照片流”中的照片,始終返回nil

簡而言之,不必使用assetForURL,您必須遍歷Photo Stream中的所有項目並將其URL與您的URL進行比較。 上面的鏈接包含一個代碼示例。

它看起來很笨拙,比assetForURL慢,並且要確定是否沒有找到具有指定URL的文件不是一件容易的事,但是我沒有找到其他方法(遷移到Photos框架除外)。

對於PHAsset,我使用

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

我嘗試使用requestImageDataForAsset ,但對於流式照片它返回nil。

在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
    })
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM