我正在为iOS和Android开发具有角度和离子效果的混合应用程序,并且在将图像发布到Facebook时出现错误。只有在Android设备上运行应用程序时才会出现此错误。我正在使用cordova-plugin-facebook4和查询,如获取朋友和登录正常工作。
该特定部分的代码:
DoSomething()
第4行的console.log:
facebookString with image:/ me / photos?method = post& url = https://firebasestorage.googleapis.com/URL?alt=media&token=4420080a-41d8-4816-bf62-5bfb159d1da5&caption=FBTest
错误讯息:
错误{" errorCode":" 100"," errorType":" OAuthException"," errorMessage": "参数无效"," errorUserMessage":"您的照片无法上传。照片应小于4 MB并保存为JPG,PNG,GIF或TIFF文件。"," errorUserTitle":"无法读取文件"}
正如您所看到的,我将图像存储在firebase数据库中(我用URL替换了确切的url以便不在此处发布),在我调用Facebook post函数之前,图像已经上传并压缩,并且它是.jpg格式,所以Facebook帖子的错误信息不准确或不帮助我。除此之外,确切的代码在iOS上运行得很好。
我现在正在寻找这个错误的解决方案几个小时,所以这里有人可以帮我解决这个问题。以前是否有人遇到此问题并且可能知道解决方案?
修改
带有完整网址的console.log:
的iOS:
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);
})
}
机器人:
/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=Rest
显然不同的图片,但网址结构是相同的。
EDIT2:
到目前为止我尝试了什么:
使用以下命令在config.xml中列入白名单graph.facebook.com:
/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
- >同样的错误
我正在使用带有Android 6.0.1的Nexus 5作为测试设备,目前我还无法访问其他Android设备,但我会尽快在其他设备上试用它我得到了一个。
编辑3:
所以我在其他2台Android设备上测试了它确实导致了同样的错误
我将facebook4插件更新为支持facebook sdk 4.22.1的最新版本,但错误仍然存在
我试图将FB.init函数(第147行)中的cordova-plugin-facebook4 / www / facebook-browser.js版本从版本2.7更改为2.9(这是最新版本),但错误遗体
编辑4已解决
最后,解决方案在评论中。当您使用包含参数字符的下载URL时,这是Android设备上的cordova-plugin-facebook4的错误? &安培;和=,哪个firebase存储。
答案 0 :(得分:1)
<强>解决强>
经过几个小时后,我发现了问题。 cordova-plugin-facebook4与firebase存储的组合在Android上不起作用,因为插件内部的编码处理错误。文件cordova-plugin-facebook4 / src / android / ConnectPlugin.java里面有这个函数:
private void makeGraphCall() {...}
此函数解码整个“facebookString”,然后按特殊字符对其片段进行排序? &安培;和=。 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的一部分,之后我再次解码整个URL,然后将其传递给facebookstring。
My Angular Code片段:
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插件的开发者,了解这个bug。我希望这可以帮助那些可能会遇到这个特定错误的人。