cordova-plugin-facebook4在Android上发布带有图片错误的图片

乔纳斯·奥斯特加德(Jonas Ostergaard)

我正在为iOS和Android开发带有角度和离子的混合应用程序,并且在将图像发布到Facebook时遇到错误。该错误仅在我在Android设备上运行该应用程序时出现。我正在使用cordova-plugin-facebook4,并且诸如获取好友和登录之类的查询工作正常。

该特定部分的代码:

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 / 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上正常运行。

我正在寻找针对此错误的解决方案已有几个小时,因此可能有人在这里可以帮助我解决该问题。有人以前有这个问题,可能知道解决方案吗?

编辑:

带有完整URL的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=Rest

Android:

/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结构是相同的。

编辑2:

到目前为止我尝试过的是:

  • 使用Firebase存储中现有图片的URL(由iOS设备拍摄->相同的错误)。
  • 在Facebook开发环境中添加了Android哈希键->相同的错误
  • 在config.xml中将graph.facebook.com列入白名单,其中包括:

    <access origin="*graph.facebook.com*" subdomains="true"/>
    

->相同的错误

  • 使用encodeURIComponent(url)而不是encodeURI(url)->相同的错误

我目前将Nexus 5和Android 6.0.1用作测试设备,目前无法访问另一台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已解决

最后,解决方案在评论中。当您使用包含参数字符(如?)的下载网址时,这是android设备上cordova-plugin-facebook4的错误。&和=,这是Firebase存储的功能。

乔纳斯·奥斯特加德(Jonas Ostergaard)

解决了

几个小时后,我发现了问题。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的包含参数的部分进行了编码,然后在将其传递给facebookstring之前,再次对整个URL进行了解码。

我的Angular代码段:

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插件的开发人员联系。我希望这对其他可能会卡在该特定错误上的人有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从Android Java中的cordova-plugin-nativestorage获取数据

iOS上的cordova-plugin-crosswalk-webview

Cordova iOS构建的Bluemix Push Plugin错误

ionic3 cordova-plugin-facebook4 facebook安装问题错误

Ionic cordova-plugin-qrscanner没有相机预览

cordova-plugin-camera:在Android 4.4设备上出现“未选择图像”错误

使用cordova-android 6.4.0构建Cordova-plugin-xapkreader

使用cordova-plugin-ionic-webview版本有冲突吗?

这个插件的Cordova Facebook登录问题https://github.com/jeduan/cordova-plugin-facebook4

IONIV-V4:离子Cordova插件添加cordova-plugin-googleplus无法正常工作

不能在ionic 4上使用cordova-plugin-file

cordova-plugin-crypt-file-requireCordovaModule错误

在cordova-plugin-facebook4上未定义APP_ID吗?

Cordova / Phonegap-facebook-plugin Android:未定义facebookConnectPlugin

cordova:找不到模块“ cordova / plugin / SmsInboxPLugin”

Android:带有cordova-plugin-app-version的versionCode

找不到cordova-plugin-whitelist错误404

android cordova-plugin-camera在PNG上添加黑色背景

无法在Android上获取cordova-plugin-statusbar设置颜色

有没有办法更改cordova-plugin-dialogs上的Android按钮的间距?

使用cordova-plugin-file-transfer下载图片,而不是在android设备中找到该图片

Cordova Push Plugin构建错误:变量M

使用cordova-plugin-whitelist

cordova-plugin-facebook4 在 loginSuccess 上获取姓名和电子邮件

裁剪 404 时的cordova-plugin-crop 错误

无法安装“cordova-plugin-facebook4”

使用cordova-plugin-facebook4 时,无法解析配置':_debugApkCopy' 的所有依赖项

Android 上的 Cordova-plugin-file Encoding_Err

离子 4 -cordova-plugin-chrome-apps-sockets-udp