cordova-plugin-facebook4在Android上出现图片错误

时间:2017-02-02 09:29:53

标签: android angularjs facebook cordova facebook-graph-api

我正在为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:

到目前为止我尝试了什么:

  • 使用firebase存储中现有图片的URL,该图片由iOS设备拍摄 - >同样的错误。
  • 将Android哈希密钥添加到facebook开发环境 - >同样的错误
  • 使用以下命令在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
    

- >同样的错误

  • 使用encodeURIComponent(url)代替encodeURI(url) - >同样的错误

我正在使用带有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存储。

1 个答案:

答案 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。我希望这可以帮助那些可能会遇到这个特定错误的人。