web-dev-qa-db-fra.com

iOS8 Photos Framework: Comment obtenir le nom (ou le nom de fichier) d'un PHAsset?

Im essayant d'obtenir le nom de l'image en utilisant PHAssets. Mais je n'ai pas pu trouver de métadonnées pour le nom de fichier ou aucune méthode pour obtenir le nom de l'image. Existe-t-il un moyen différent d'obtenir le nom de fichier?

20
Priyanka

Si vous souhaitez obtenir le nom de l'image (par exemple, le nom de la dernière photo dans Photos) comme IMG_XXX.JPG, vous pouvez essayer ceci:

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"];
     }                                            
    }];
}

J'espère que cela aide.

Dans Swift le code ressemblera à ceci

PHImageManager.defaultManager().requestImageDataForAsset(asset, options: PHImageRequestOptions(), resultHandler:
{
    (imagedata, dataUTI, orientation, info) in
    if info!.keys.contains(NSString(string: "PHImageFileURLKey"))
    {
        let path = info![NSString(string: "PHImageFileURLKey")] as! NSURL
    }
})

Swift 4:

    let fetchResult = PHAsset.fetchAssets(with: .image, options: nil)
    if fetchResult.count > 0 {
        if let asset = fetchResult.firstObject {
            let date = asset.creationDate ?? Date()
            print("Creation date: \(date)")
            PHImageManager.default().requestImageData(for: asset, options: PHImageRequestOptions(),
                resultHandler: { (imagedata, dataUTI, orientation, info) in
                    if let info = info {
                        if info.keys.contains(NSString(string: "PHImageFileURLKey")) {
                            if let path = info[NSString(string: "PHImageFileURLKey")] as? NSURL {
                                print(path)
                            }
                        }
                    }
            })
        }
    }
20
Eridana

Je sais que la question a déjà été répondue, mais j'ai pensé que je fournirais une autre option:

extension PHAsset {

    var originalFilename: String? {

        var fname:String?

        if #available(iOS 9.0, *) {
            let resources = PHAssetResource.assetResources(for: self)
            if let resource = resources.first {
                fname = resource.originalFilename
            }
        }

        if fname == nil {
            // this is an undocumented workaround that works as of iOS 9.1
            fname = self.value(forKey: "filename") as? String
        }

        return fname
    }
}
34
skim

Une autre option est:

[asset valueForKey:@"filename"]

La "légalité" de cela est à vous de décider.

16
Leo Natan

Solution la plus simple pour iOS 9+ dans Swift 4 (basé sur la réponse skims):

extension PHAsset {
    var originalFilename: String? {
        return PHAssetResource.assetResources(for: self).first?.originalFilename
    }
}
9
d4Rk

Réponse la plus simple avec Swift lorsque vous avez une URL de référence vers un élément:

if let asset = PHAsset.fetchAssetsWithALAssetURLs([referenceUrl], options: nil).firstObject as? PHAsset {

    PHImageManager.defaultManager().requestImageDataForAsset(asset, options: nil, resultHandler: { _, _, _, info in

        if let fileName = (info?["PHImageFileURLKey"] as? NSURL)?.lastPathComponent {      
            //do sth with file name
        }
    })
}

Swift4: premier import Photos

if let asset = PHAsset.fetchAssets(withALAssetURLs: [info[UIImagePickerControllerReferenceURL] as! URL],
                                           options: nil).firstObject {


            PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { _, _, _, info in

                if let fileName = (info?["PHImageFileURLKey"] as? NSURL)?.lastPathComponent {
                    print("///////" + fileName + "////////")
                    //do sth with file name
                }
            })
        }
0
Ahmad Labeeb

Ce que vous cherchez vraiment, c'est le localIdentifier qui est une chaîne unique qui identifie de manière persistante l'objet.

Utilisez cette chaîne pour rechercher l'objet à l'aide de:

fetchAssetsWithLocalIdentifiers:options:, fetchAssetCollectionsWithLocalIdentifiers:options:, or fetchCollectionListsWithLocalIdentifiers:options: method.

Plus d'informations sont disponibles ici

0
Avi Levin