我正在为iOS和安卓开发一个具有角度和离子的混合应用程序,我在facebook上发布一张图片时遇到了一个错误。只有当我在Android设备上运行应用程序时,才会出现错误。我正在使用cordova插件-facebook4 4和查询,如获取朋友和登录是正确的工作。
这一特定部分的守则:
function makeCallToFacebookWithImage(url){
console.log("share that to facebook with image");
var facebookString = "/me/photos?method=post&url="+encodeURI(url)+"&caption="+$scope.comment;
console.log("facebookString with image: "+facebookString);
facebookConnectPlugin.getLoginStatus(function(loginStatus){
// if already loggedIn
if(loginStatus.status == "connected"){
facebookConnectPlugin.api(facebookString, ["publish_actions"], function(response){
// success
console.log("success "+JSON.stringify(response));
}, function(response){
// error
console.log("error "+JSON.stringify(response));
});
}
}, function(error){
console.log(error);
})
}第4行的console.log:
带有图像的facebookString :/me/照片?方法=post&url=https://firebasestorage.googleapis.com/URL?alt=media&token=4420080a-41d8-4816-bf62-5bfb159d1da5&caption=FBTest
错误消息:
错误{"errorCode":"100","errorType":"OAuthException",“errorMessage”:“无效参数”,“errorUserMessage”:“无法上传照片。照片应小于4MB,保存为JPG、PNG、GIF或TIFF文件。”、“errorUserTitle”:“无法读取文件”}
正如您所看到的,我将图像存储在一个firebase数据库中(我用url替换了确切的URL以在这里不发布它),在调用Facebook post函数之前,图像已经被上传和压缩,并且它是.jpg格式的,所以Facebook帖子的错误消息不准确,或者对我没有帮助。除此之外,精确的代码在iOS上运行得非常好。
我正在寻找一个解决这个错误几个小时,所以希望这里的人可以帮助我解决这个问题。是否有人曾经有过这个问题,并可能知道一个解决办法?
编辑:
具有完整网址的console.log:
iOS:
/me/photos?method=post&url=https://firebasestorage.googleapis.com/v0/b/appname-50cd0.appspot.com/o/post%252F-KbyHksSP_EV2MTjvCb5.jpg?alt=media&token=64f43c60-47fa-40b2-b85b-e1e5ae1dea13&caption=RestAndroid:
/me/photos?method=post&url=https://firebasestorage.googleapis.com/v0/b/appname-50cd0.appspot.com/o/post%252F-KbxypBFRqs6eyYNk8ZR.jpg?alt=media&token=4420080a-41d8-4816-bf62-5bfb159d1da5&caption=FB显然不同的图片,但URL结构是相同的。
EDIT2:
到目前为止我尝试过的是:
->相同误差
我正在使用带有Android6.0.1的Nexus 5作为测试设备,目前我无法访问另一个Android设备,但我一拿到另一个设备就会在另一个设备上试用。
编辑3:
编辑4解决了
最后,解决方案在评论中。它是android设备上cordova-plugin 4的一个bug,当您使用包含参数字符(如?&& and = )的下载url时,firebase存储可以做到这一点。
发布于 2017-05-23 14:45:27
解决了
许多小时后,我发现了这个问题。cordova- plugin 4与防火墙存储的结合不能在Android上工作,因为插件内部的编码处理错误。
在文件cordova-plugin-facebook4/src/android/ConnectPlugin.java中有以下函数:
private void makeGraphCall() {...}该函数对整个"facebookString“进行解码,然后按特殊字符&& and =对其分段进行排序。firebase存储下载链接确实包含安全令牌的参数,因此此时插件尝试将firebase变量解释为facebook参数,并剪切firebase url的url参数。
我所做的是修改这个功能的这一部分:
for (String query : queries) {
int splitPoint = query.indexOf("=");
if (splitPoint > 0) {
String key = query.substring(0, splitPoint);
String value = query.substring(splitPoint + 1, query.length());
params.putString(key, value);
}
}至:
for (String query : queries) {
int splitPoint = query.indexOf("=");
if (splitPoint > 0) {
String key = query.substring(0, splitPoint);
String value = query.substring(splitPoint + 1, query.length());
if(key.equals("url") || key.equals("caption")){
value = URLDecoder.decode(value);
}
params.putString(key, value);
}
}在角度部分,我编码了原始的firebase URL中包含参数的部分,然后在将它传递给facebookstring之前,我再次解码了整个URL。
我的角码片段:
function makeCallToFacebookWithImage(url) {
console.log("share to facebook with image");
var newURL = url;
var caption = $scope.comment;
if (ionic.Platform.isAndroid()) { //prep only neccessary on android
console.log("Is Android device");
var index = url.indexOf("%2F"); //firebase link specific encoding for folders
var leftSide = url.substring(0, index);
var rightSide = url.substring(index, url.length);
newURL = leftSide + encodeURIComponent(rightSide);
caption = encodeURIComponent(caption);
}
newURL = encodeURIComponent(newURL);
var facebookString = "/me/photos?method=post&url=" + newURL + "&caption=" + encodeURIComponent(caption);
...我将联系facebook4插件的开发人员有关这个错误。我希望这能帮助那些可能被困在这个特定错误上的人。
https://stackoverflow.com/questions/41998513
复制相似问题