MFMailComposeViewController: Anfügen von Bildern aus der Fotogalerie

Bin ich mit ein bisschen Mühe anfügen von Bildern aus der Foto-Galerie an eine E-Mail.

Grundsätzlich eine der Funktionen von mein-Anwendung ermöglicht es dem Benutzer, Fotos zu machen. Wenn Sie die snap shot, nehme ich den URL-Verweis auf das Bild in Core Data. Ich verstehe, dass Sie haben zu durch zu gehen die ALAssetRepresentation zum Bild. Ich habe diese und läuft innerhalb meiner Anwendung, wenn der Nutzer will, um zu überprüfen, ein Bild, das Sie genommen haben.

Ich bin nun versucht, dem Benutzer zu ermöglichen, fügen Sie alle von den Fotos, die für ein Ereignis an eine E-Mail. Während dies zu tun, die ich Durchlaufen und die Core-Data-Entität, speichert die URL-Verweise, eine Methode aufzurufen, gibt eine UIImage von der ALAssetsLibrary und dann legt Sie mit der NSData/UIImageJPEGRepresentation und MFMailComposeViewController/addAttachmentData Methoden.

Problem ist: Wenn die E-Mail wird dem Benutzer präsentiert, es sind kleine Blaue Quadrate repräsentieren die Bilder und das Bild ist nicht angebracht.

Hier ist der code:

- (void)sendReportReport
{

    if ([MFMailComposeViewController canSendMail])
    {

        MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];

        mailer.mailComposeDelegate = self;

        [mailer setSubject:@"Log: Report"];

        NSArray *toRecipients = [NSArray arrayWithObjects:@"[email protected]", nil];
        [mailer setToRecipients:toRecipients];


        NSError *error;

        NSFetchRequest *fetchPhotos = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription 
                                       entityForName:@"Photo" inManagedObjectContext:__managedObjectContext];
        [fetchPhotos setEntity:entity];
        NSArray *fetchedPhotos = [__managedObjectContext executeFetchRequest:fetchPhotos error:&error];
        int counter;

        for (NSManagedObject *managedObject in fetchedPhotos ) {
            Photo *photo = (Photo *)managedObject;

//           UIImage *myImage = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png", counter++]];
            NSData *imageData = UIImageJPEGRepresentation([self getImage:photo.referenceURL], 0.5);
//           NSData *imageData = UIImagePNGRepresentation([self getImage:photo.referenceURL]);
//           [mailer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"%i", counter]];  
            [mailer addAttachmentData:imageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"a.jpg"]];  

            counter++;

        }


        NSString *emailBody = [self getEmailBody];

        [mailer setMessageBody:emailBody isHTML:NO];

        [self presentModalViewController:mailer animated:YES];

    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Failure"
                                                        message:@"Your device doesn't support the composer sheet"
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];

    }

}

und die Methode liefert den UIImage:

#pragma mark - Get Photo from Asset Library
+ (ALAssetsLibrary *)defaultAssetsLibrary {
    static dispatch_once_t pred = 0;
    static ALAssetsLibrary *library = nil;
    dispatch_once(&pred, ^{
        library = [[ALAssetsLibrary alloc] init];
    });
    return library; 
}

- (UIImage *)getImage:(NSString *)URLReference
{

    __block UIImage *xPhoto = nil;

    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
    {
        UIImage *xImage;

        //get the image
        ALAssetRepresentation *rep = [myasset defaultRepresentation];
        CGImageRef iref = [rep fullScreenImage];

        if (iref) {
            xImage = [UIImage imageWithCGImage:iref];
        }

        xPhoto = xImage;

    };


    ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
    {
        NSLog(@"Error fetching photo: %@",[myerror localizedDescription]);
    };


    NSURL *asseturl = [NSURL URLWithString:URLReference];

    //create library and set callbacks
    ALAssetsLibrary *al = [DetailsViewController defaultAssetsLibrary];
    [al assetForURL:asseturl 
        resultBlock:resultblock
       failureBlock:failureblock];   

    return xPhoto;

}

HINWEIS: Diese oben genannten code ausgeführt wird, es tut sich einfach nicht an das Bild. Bitte beachten Sie auch, ich bin in der Lage, erfolgreich befestigen Sie Bilder aus der Galerie innerhalb meiner Anwendung, solange ich Sie in einen UIImageView.Bild bereits (im Grunde, ich fahre mit dem Zeiger auf das Bild von der UIImageView und der übergabe an die addAttachmentData Methode.) Es ist nur, wenn ich Versuch zu Durchlaufen zentralen Daten und Anhängen, ohne Sie zunächst das Bild in ein UIImageView dass ich den ärger.

Irgendwelche Tipps würde sehr geschätzt werden!

Dank!
Jason

  • Haben Sie gedruckt, der Inhalt des Bildes, bevor Sie es als Anhang? (CFShow([self getImage:photo.referenceURL]);) Vielleicht ist es nil an dieser Stelle?
  • Hi Jaydee, meine Vermutung ist, dass Sie korrekt sind. Es ist wahrscheinlich gleich null. Aber, was soll ich tun? Bin ich an dieses in die falsche Richtung, aber die Schaffung einer Methode zurückgibt, die ein UIImage? Sollte ich etwas anders machen zu Durchlaufen, meine Liste von URL-Referenzen zu Foto-Galerie-Bilder?
  • gehen Sie einfach um den Fehler zu finden. Wenn das Bild null ist, werden als Ihre Referenz-URL ist offensichtlich falsch. So überprüfen Sie, wie die URL erstellt wird..
  • Die Referenz-URL ist NICHT falsch. Wie ich bereits in meinem ursprünglichen Beitrag, ich bin in der Lage, erfolgreich Rendern das Bild von der Referenz-URL in einer anderen Ansicht innerhalb meiner Anwendung. Wie Sie erraten das Bild ist null, aber ich bin nicht zu verstehen, warum. Ich denke, es hat etwas zu tun mit der Rückkehr der UIImage über die Rückgabe der Methode. Wenn Sie sind kenntnisreich über ALAssetsLibraryAssetForURLResultblock ich würde schätzen, wenn Sie möchten, schauen Sie auf die Funktion " getImage-Methode, und lassen Sie mich wissen, wenn Sie sehen, was dazu führen würde, dass das Bild zurückgegeben werden, wie nil. Ich habe das Bild mit cfshow, aber es ist nicht zurückgekehrt.
InformationsquelleAutor JasonBub | 2012-03-06
Schreibe einen Kommentar