2015-05-12 11 views
10

ich die UIImagePickerController in zwei Fällen bin mitWie die URL eines Bildes bekommen nur in PHPhotoLibrary hinzugefügt

  • ein vorhandenes Bild in der Fotobibliothek wählen
  • ein neues Bild aufzunehmen

im ersten Fall, wenn ich ein Bild bildet die Bibliothek wähle, kann ich die URL in der Delegatmethode leicht bekommen:

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    // Get the URL 
    NSURL *url = [info valueForKey:UIImagePickerControllerReferenceURL]; 
    ... 
} 

Aber wenn ich ein neues Bild mache, ist das Bild noch nicht in der Fotobibliothek und hat noch keine URL. Also muss ich zuerst das Bild in der Bibliothek hinzufügen. Aber wie erhält man die URL des neuen Assets?

Hier ist mein Code, um das Bild in der Fotobibliothek hinzufügen

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    // Get the image 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

    // Add the image in the library 
    [[PHPhotoLibrary sharedPhotoLibrary] 

     performChanges:^ 
     { 
      // Request creating an asset from the image. 
      PHAssetChangeRequest *createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

      // Get the URL of the new asset here ? 
      ... 
     } 

     completionHandler:^(BOOL success, NSError *error) 
     { 
      if (!success) { ...; return; } 

      // Get the URL of the new asset here ? 
      ... 
     } 
    ]; 
} 

Antwort

4

Ich habe den Weg nicht gefunden, URL zu bekommen, aber vielleicht kann localIdentifier Ihnen helfen, die gleiche Arbeit zu tun.

Verwendung

NSString* localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier]; 

die lokale ID zu bekommen und später das Bild bekommen.

__block NSString* localId; 
// Add it to the photo library 
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
    PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; 

    if (self.assetCollection) { 
     PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:self.assetCollection]; 
     [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]]; 
    } 
    localId = [[assetChangeRequest placeholderForCreatedAsset] localIdentifier]; 
} completionHandler:^(BOOL success, NSError *error) { 
    PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil]; 
    if (!success) { 
     NSLog(@"Error creating asset: %@", error); 
    } else { 
     PHFetchResult* assetResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[localId] options:nil]; 
     PHAsset *asset = [assetResult firstObject]; 
     [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
      UIImage* newImage = [UIImage imageWithData:imageData]; 
      self.imageView.image = newImage; 
     }]; 
    } 
}]; 
+0

Das funktioniert, aber fühlt sich sehr unheimlich an, ich weiß nicht, ob es tatsächlich passieren wird, aber dieser Ansatz könnte zu einer Wettlaufsituation führen. –

+0

Welcher Rennzustand? Ich wäre mir nicht sicher, ob der LocalIdentifier noch verfügbar ist –

+0

hallo können Sie bitte sagen, was wird die self.assetCollection hier, welche Klasse es ist, danke –

1

Wenn wir die ALAssetsLibrary verwenden, ist es sehr einfach ist, ein Bild im Fotoalbum zu speichern und die URL erhalten:

// Get the image 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

    // Add the image in the Photo Library 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library writeImageToSavedPhotosAlbum: [image CGImage] 
           orientation: (ALAssetOrientation)[image imageOrientation] 
          completionBlock: ^(NSURL *assetURL, NSError *error) 
    { 
     if (error) 
     { 
      NSLog(@"error: %@", error); 
     } 
     else 
     { 
      NSLog(@"assetURL = %@", assetURL); 
     } 
    }]; 

Aber überraschenderweise scheint es nicht möglich, dasselbe mit der neuen PHPhotoLibrary zu machen!

Eine Lösung, mit PHPphotoLibrary das gleiche Ergebnis zu erzielen, ist immer willkommen.

+0

ALAssetsLibrary somtimes nicht Gruppe erstellen, – passol

+5

ALAssetsLibrary ist ** veraltet ** und sollte nicht sein verwendet mehr. –

1

Ich mag diesen Fix nicht, da dies zu einem Wettlauf führen könnte. Bisher kann ich mir keine bessere Lösung vorstellen. Wenn jemand tut würde ich es lieben :) So oder so zu hören, hier eine Swift-Version der Antwort des Rigel Chen ist

import Photos 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { 

     var localId:String? 
     let imageManager = PHPhotoLibrary.sharedPhotoLibrary() 

     imageManager.performChanges({() -> Void in 

      let request = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
      localId = request.placeholderForCreatedAsset?.localIdentifier 

      }, completionHandler: { (success, error) -> Void in 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 

        if let localId = localId { 

         let result = PHAsset.fetchAssetsWithLocalIdentifiers([localId], options: nil) 
         let assets = result.objectsAtIndexes(NSIndexSet(indexesInRange: NSRange(location: 0, length: result.count))) as? [PHAsset] ?? [] 

         if let asset = assets.first { 
          // Do something with result 
         } 
        } 
       }) 
     }) 
    } 
} 
+0

Das ist gut, ich habe gewählt, aber ich bin neugierig zu wissen, welchen Nutzen diese Zeile zu tun hat, lassen Sie Assets = result.objectsAtIndexes (NSIndexSet (indexesInRange: NSRange (location: 0, length: result.count))) als? [PHAsset] ?? [] können wir immer noch result.firsObject tun – SunilG