首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cordova-4在Android上发布图像错误

cordova-4在Android上发布图像错误
EN

Stack Overflow用户
提问于 2017-02-02 09:29:53
回答 1查看 656关注 0票数 4

我正在为iOS和安卓开发一个具有角度和离子的混合应用程序,我在facebook上发布一张图片时遇到了一个错误。只有当我在Android设备上运行应用程序时,才会出现错误。我正在使用cordova插件-facebook4 4和查询,如获取朋友和登录是正确的工作。

这一特定部分的守则:

代码语言:javascript
复制
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:

代码语言:javascript
复制
/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:

代码语言:javascript
复制
/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:

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

  • 使用防火墙存储中现有图片的URL,这是由iOS设备->获取的相同错误。
  • 将Android哈希键添加到facebook开发环境中,->也出现了同样的错误
  • 白化的graph.facebook.com在config.xml中具有:

->相同误差

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

我正在使用带有Android6.0.1的Nexus 5作为测试设备,目前我无法访问另一个Android设备,但我一拿到另一个设备就会在另一个设备上试用。

编辑3:

  • 所以我在另外两个Android设备上进行了测试,结果也出现了同样的错误。
  • 我将facebook4插件更新为支持FacebookSDK4.22.1的最新版本,但错误仍然存在
  • 我试图将cordova-plugin-facebook4/www/facebook-browser.js函数(第147行)中的FB.init版本从2.7版本更改为2.9 (这是最新版本),但错误仍然存在。

编辑4解决了

最后,解决方案在评论中。它是android设备上cordova-plugin 4的一个bug,当您使用包含参数字符(如?&& and = )的下载url时,firebase存储可以做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-23 14:45:27

解决了

许多小时后,我发现了这个问题。cordova- plugin 4与防火墙存储的结合不能在Android上工作,因为插件内部的编码处理错误。

在文件cordova-plugin-facebook4/src/android/ConnectPlugin.java中有以下函数:

代码语言:javascript
复制
private void makeGraphCall() {...}

该函数对整个"facebookString“进行解码,然后按特殊字符&& and =对其分段进行排序。firebase存储下载链接确实包含安全令牌的参数,因此此时插件尝试将firebase变量解释为facebook参数,并剪切firebase url的url参数。

我所做的是修改这个功能的这一部分:

代码语言:javascript
复制
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);
  }
}

至:

代码语言:javascript
复制
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。

我的角码片段:

代码语言:javascript
复制
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插件的开发人员有关这个错误。我希望这能帮助那些可能被困在这个特定错误上的人。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41998513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档