Appcelerator Titanium:Facebook图片上传失败

时间:2015-01-25 20:47:30

标签: android facebook facebook-graph-api titanium

我在Titanium软件中使用Facebook上传图片时出错,每当我想从我的应用程序上传图像时我都会这样:

  

失败:对于v2.1及更高版本

,不推荐使用REST API

但是,如果我在KitchenSink示例应用程序中尝试相同的代码,它可以完美地运行:

var xhr = Titanium.Network.createHTTPClient({
        onload: function() {
     // first, grab a "handle" to the file where you'll store the downloaded data
            var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
            f.write(this.responseData); // write to the file
            var blob = f.read();
            var data = {
                caption: 'behold, a flower',
                picture: blob
            };
            facebook.request('photos.upload', data, showRequestResult);
        },
        timeout: 10000
    });
    xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
    xhr.send(); 

在我的应用程序中:

function showRequestResult(e) {
    var s = '';
    if (e.success) {
        s = "SUCCESS";
        if (e.result) {
            s += "; " + e.result;
        }
    } else {
        s = "FAIL";
        if (e.error) {
            s += "; " + e.error;
        }
    }
    alert(s);
}
Ti.App.hs_stats.addEventListener('touchend', function(e){
Ti.App.hs_stats.top = 255;
var xhr = Titanium.Network.createHTTPClient({
        onload: function() {
     // first, grab a "handle" to the file where you'll store the downloaded data
            var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory,'mygraphic.png');
            f.write(this.responseData); // write to the file
            var blob = f.read();
            var data = {
                caption: 'behold, a flower',
                picture: blob
            };
            Ti.App.fb.request('photos.upload', data, showRequestResult);
        },
        timeout: 10000
    });
    xhr.open('GET','http://www.pur-milch.de/files/www/motive/pm_motiv_kaese.jpg');
    xhr.send();     
});

1 个答案:

答案 0 :(得分:2)

看起来你正在为Appcelerator使用'旧'Facebook模块?我有图片上传工作的个人资料和页面(虽然页面有点不同,我稍后会解释)。这是一些快速代码(我假设您已经通过Facebook验证):

 var fb = require('facebook');
 fb.appid = "xxxxxxxxxxxxxxxxx";
 var acc = fb.getAccessToken();

 fb.requestWithGraphPath('me/photos?access_token='+ acc, {picture:image, message: data}, "POST", showRequestResult);

图像变量只是一个blob - 它直接来自图库选择或相机意图的event.media。 data是状态更新的文本。

在你的tiapp.xml中添加以下行:

 <property name="ti.facebook.appid">xxxxxxxxxxxxxxxxx</property>

和(如果你使用Android和iOS - 添加两者或只是你正在使用的平台)

 <modules>
    <module platform="android">facebook</module>
    <module platform="iphone">facebook</module>
</modules>

现在页面有点奇怪:

var endPoint = 'https://graph.facebook.com/v2.1/' + pid + '/photos?access_token='+ acc;
                                            xhr.open('POST',endPoint);
                                            xhr.send({
                                                message: data,
                                                picture: image
                                            });

你必须使用HTTP请求,因为无论我尝试什么,我都无法使用requestWithGraphPath()来处理页面。

pid是你的页面ID,你可以得到它,或者你是管理员的页面列表(再次,创建一个新的HTTP请求(xhr)并使用它):

xhr.open("GET","https://graph.facebook.com/v2.1/me?fields=accounts{access_token,global_brand_page_name,id,picture}&access_token=" +fb.getAccessToken());

这将返回每个页面的访问令牌,全局品牌名称(基本上是页面名称的干净版本),它的id和个人资料图片。此URL中的访问令牌是您的个人访问令牌(&amp; access_token = part)。

据我所知,这些访问令牌不会因页面而过期,因此您可以将其保存在应用程序的某个地方,或者如果您真的想要安全,可以在每个帖子之前获取一个令牌,但这是一个有点多。

奖金:

如果您想对网页发布视频帖子:

var xhr = Titanium.Network.createHTTPClient();
    var endPoint = 'https://graph-video.facebook.com/'+ pid +'/videos?access_token='+ acc;
xhr.open('POST',endPoint);

xhr.setRequestHeader("enctype", "multipart/form-data");

xhr.send({source:video, description:data});

和个人资料:

         var acc = fb.getAccessToken();
    var xhr = Titanium.Network.createHTTPClient();
    var endPoint = 'https://graph-video.facebook.com/me/videos?access_token='+ acc;
xhr.open('POST',endPoint);

xhr.setRequestHeader("enctype", "multipart/form-data");

xhr.send({source:video, description:data});

视频是来自相机或图库事件的另一个blob。媒体意图和数据是您要用于状态更新的文本。