Размещение изображения на стене FaceBook с камеры iPhone с помощью PhoneGap - PullRequest
0 голосов
/ 31 января 2011

Я использую PhoneGap для публикации изображения на стене FaceBook с iPhone .

IЯ могу войти в учетную запись FaceBook и опубликовать изображение HOSTED (http://www.mysite.com/my_image.jpg), но не изображение с iPhone.

Вот скрипт для отправки в FB:

function fbPost() {
    $.ajax({
           type: 'POST',
           url: "https://graph.facebook.com/me/feed",
           data: {
                message: "<FACEBOOK MESSAGE>",
                PICTURE: "<IMAGE URL>",
                name: "<TITLE OF POST>",
                link: "<LINK TO APP>",
                caption: "<SHOWN BELOW TITLE>",
                description: "<SHOWN BELOW CAPTION>",
                access_token: access_token,
                format: "json"
           },
           success: function (data) {
               navigator.notification.alert("success!", null, "Thanks!")
           },
                   },
           dataType: "json",
           timeout: 10000
           })
}

Вот код для получения изображения с iPhone (фотоаппарат или альбом):

navigator.camera.getPicture(onSuccess, onFail, { quality: 50, 
    destinationType: Camera.DestinationType.FILE_URI }); 

function onSuccess(imageURI) {
    var image = document.getElementById('myImage');
    image.src = imageURI;
}

(http://docs.phonegap.com/phonegap_camera_camera.md.html).

Когда я использую изображение с iPhone, URIИзображение выглядит примерно так: file:///var/mobile/Applications/..../Documents/tmp/photo_001.jpg

Опять же, я могу опубликовать изображение, когда я указываю размещенное (http://...) изображение, но не когда это изображение с iPhone.

Я бы очень признателен за любую помощь.

Спасибо.

Роб

Ответы [ 2 ]

3 голосов
/ 31 января 2011

Facebook не может получить доступ к локальному файлу на вашем телефоне.Я не знаю, как вы можете загрузить фотографию на Facebook, но, как вы сказали, до того, как она заработает, если вы используете общедоступный файл.

Так что я думаю, что у вас есть два варианта: загрузить фотографию на сервера затем опубликовать URL-адрес файла на Facebook.(вы можете использовать файл api для phonegap, для этого есть плагин загрузки), но я думаю, что это не очень хорошее решение.

Я бы посоветовал выяснить, можете ли вы опубликовать данные изображения вfacebook (может быть в кодировке base64) и используйте API-интерфейс phonegap, чтобы получить закодированный в base64 контент фотографии и опубликовать его непосредственно в facebook

2 голосов
/ 08 декабря 2012

Я пишу плагин PhoneGap, использующий Graph API для публикации фотографий с iPhone / iPad на Facebook. Этот плагин также может публиковать фотографии с идентификатором места в Facebook (значит, он может регистрировать Facebook с фотографией ) и отлично работает на iOS 6.0.

Он основан на PhoneGap 2.1 и phonegap-plugin-facebook-connect , а не требуется любой промежуточный хост, возможно, он может решить вашу проблему;)

Во-первых, PhotoCheckin.h - это ...

#import <Foundation/Foundation.h>
#import "Facebook.h"
#import "FBConnect.h"

#import <Cordova/CDV.h>

@interface PhotoCheckin : CDVPlugin
<FBDialogDelegate>

- (void) sendPost:(CDVInvokedUrlCommand*)command;

@end

Второе, PhotoCheckin.m следующим образом.

#import "PhotoCheckin.h"
#import "FBSBJSON.h"

@implementation PhotoCheckin

- (void) sendPost:(CDVInvokedUrlCommand*)command {
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[command.arguments objectAtIndex:0]]]];
    NSString* message = [command.arguments objectAtIndex:1];
    NSString* place_id = [command.arguments objectAtIndex:2];
    NSLog(@"%@",message);

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:image, @"source",message,@"message",place_id, @"place", nil];

    if (FBSession.activeSession.isOpen) {
        [FBRequestConnection startWithGraphPath:@"me/photos"
                                     parameters:params
                                     HTTPMethod:@"POST"
                              completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                                  NSString *resultStr = nil;
                                  if (error) {
                                      //resultStr = [NSString stringWithFormat:@"error: domain = %@, code = %d",error.domain, error.code];
                                      resultStr = [[CDVPluginResult resultWithStatus:CDVCommandStatus_JSON_EXCEPTION messageAsString:[NSString stringWithFormat:@"error: domain = %@, code = %d",error.domain, error.code]] toErrorCallbackString:command.callbackId];
                                  }else{
                                      //resultStr = [NSString stringWithFormat:@"Posted action, id: %@",[result objectForKey:@"id"]];
                                      resultStr = [[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[NSString stringWithFormat:@"Posted action, id: %@",[result objectForKey:@"id"]]] toSuccessCallbackString:command.callbackId];
                                  }
                                  //[[[UIAlertView alloc] initWithTitle:@"Check-in Result" message:resultStr delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
                                  [self writeJavascript:resultStr];
                              }];
    }else{
        NSLog(@"no active session");

        NSArray *permissions = [[NSArray alloc] initWithObjects:@"publish_stream",nil];
        // more "permissions strings" at http://developers.facebook.com/docs/authentication/permissions/

        // OPEN Session
        [FBSession openActiveSessionWithPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session,
                                                      FBSessionState status,
                                                      NSError *error) {
                                      if (FB_ISSESSIONOPENWITHSTATE(status)) {
                                          [[[UIAlertView alloc] initWithTitle:@"Got FB session!" message:@"please check-in again." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
                                      }else{
                                          [self writeJavascript:[[CDVPluginResult resultWithStatus:CDVCommandStatus_JSON_EXCEPTION messageAsString:[NSString stringWithFormat:@"error: domain = %@, code = %d",error.domain, error.code]] toErrorCallbackString:command.callbackId]];
                                          /*[[[UIAlertView alloc] initWithTitle:@"Login Fail"
                                                                      message:[NSString stringWithFormat:
                                                                               @"error: domain = %@, code = %d",
                                                                               error.domain, error.code]
                                                                     delegate:self
                                                            cancelButtonTitle:@"OK"
                                                            otherButtonTitles:nil]
                                           show];*/
                                      }
                                  }];
    }
}


@end

Примечания: этот метод будет вызывать обратный вызов при публикации, некоторые строки кода были закомментированы, что может сделать предупреждение для пользователей.

В-третьих, PhotoCheckin.js следующим образом.

var PhotoCheckin = {
    sendPost: function(photo_uri, message, place_id, success, fail) {
        return Cordova.exec(success, fail, "PhotoCheckin", "sendPost", [photo_uri, message, place_id]);
    }
}

Наконец, когда мы решили использовать плагин, мы пишем js следующим образом. (в формате .html / .js)

PhotoCheckin.sendPost(photo_uri, message, place_id,
    function(result){
        navigator.notification.confirm(
            'message: '+result,
            null,
            'Photo Posted',
            'OK'
        );
    },
    function(error){
        navigator.notification.confirm(
            'message: '+error,
            null,
            'Photo Fail',
            'OK'
        );
    }
);

Примечания: photo_uri - это URI фотографии (например, file: /// ...), message - комментарий пользователя и place_id - идентификатор места в Facebook (например, 106522332718569).

И, как и другие плагины, мы должны отредактировать Resources / Cordova.plist , добавить photoCheckin в качестве ключа и PhotoCheckin в качестве значения в плагинах. И поместите PhotoCheckin.h & PhotoCheckin.m в папку с именем Плагины , включите файл PhotoCheckin.js в свой код js.

веселись! из 台灣:)

...