2015-01-09 16 views

cevap

16

IMG_XXX.JPG gibi (Fotoğraflar son fotoğrafın örneğin isim), bu deneyebilirsiniz:

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

yardımcı olur Umut.

Swift yılında kodu nedir gerçekten aradığınız ısrarla nesneyi tanımlayan benzersiz bir dizedir localIdentifier bu

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 
    } 
}) 
+4

Bu, yalnızca kirli çözümdür. 'PHImageFileURLKey' belgesiz anahtardır ve görüntü düzenlenirse (örneğin resim filtresiyle) bu URL'nin son yol bileşeninde benzersiz bir adı yoktur. – user500

+0

Kabartı her zaman dosya: ///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG? Bunu şifrelemek için bir yol var mı ve sadece test.png için dosya adını aldınız mı? –

+0

Ve sistemin görüntüleri yeniden adlandırmasını engellemenin bir yolu var mı? Bir görüntüyü cihazıma aktarırsam, bilgisayarımdan taşıdıkları ve daha sonra bunları uygulamaya aktardığım dosyaların aynısını korumasını isterim. O zamandan beri var mı? –

0

gibi görünecektir. here

16

Bir daha seçenektir

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

daha fazla bilgiyi mevcuttur:

kullanın bu dize kullanarak nesneyi bulmak için

[asset valueForKey:@"filename"] 

"yasallığı" nin karar vermek size kalmış.

+1

PHAsset için 'filename' adında bir özellik yok. Nasıl çalışır? –

+0

Büyü. =] Genel API'da bulunmayan özel bir özellik. Göreceli olarak kullanıldı, çünkü diğer, genel API, 'filename 'adı verilen özellikler var. –

+0

, bu iOS 8'de çalışıyor mu? –

25

ben soru zaten yanıtlandı biliyorum ama başka bir seçenek sunmak düşündüm:

extension PHAsset { 

    var originalFilename: String? { 

     var fname:String? 

     if #available(iOS 9.0, *) { 
      let resources = PHAssetResource.assetResourcesForAsset(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.valueForKey("filename") as? String 
     } 

     return fname 
    } 
} 
+1

'PHAssetResource' yalnızca iOS 9 + 'da kullanılabilir. – Anthony

+0

Kodunuzu 'originalFilename' anahtarını kullanarak bir sıralama tanımlayıcısı kullanarak kullanmayı denedim ve 'getirme seçeneklerinde desteklenmeyen sıralama tanımlayıcısı' hatası veriyor. – Angelo

2
Swift ile

basit cevabı Lütfen bir öğenin referans url vardır:

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

SWIFT4: ilk 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 
       } 
      }) 
     } 
İlgili konular