Сообщение от cordova-plugin-facebook4 с ошибкой изображения на Android

Я разрабатываю гибридное приложение с угловыми и ионными для 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); }) } 

Консоль.log строки 4:

FacebookString с изображением: / me / photos? Method = post & url = https://firebasestorage.googleapis.com/URL?alt=media&token=4420080a-41d8-4816-bf62-5bfb159d1da5&caption=FBTest

Сообщение об ошибке:

Error {"errorCode": "100", "errorType": "OAuthException", "errorMessage": "Invalid parameter", "errorUserMessage": "Ваши фотографии не могут быть загружены. Фотографии должны быть менее 4 МБ и сохранены как JPG, PNG, GIF или TIFF. "," ErrorUserTitle ":" Невозможно прочитать файлы "}

Как вы можете видеть, я хранил изображение в базе данных firebase (я заменил точный URL с URL-адресом, чтобы не публиковать его здесь), изображение уже загружено и сжато, прежде чем я вызову функцию почты Facebook, и она находится в формате .jpg, поэтому Сообщение об ошибке в сообщении Facebook неточно или не помогает мне. Кроме того, точный код работает на iOS отлично.

Я ищу решение этой ошибки в течение нескольких часов, так что кто-то может помочь мне решить эту проблему. Раньше у кого-то была эта проблема и она могла знать решение?

РЕДАКТИРОВАТЬ:

Консоль.log с полным URL-адресом:

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 одинаковы.

EDIT2:

То, что я пробовал до сих пор:

  • Используя URL-адрес существующего изображения в хранилище firebase, который был взят устройством iOS -> та же ошибка.
  • Добавлены хеш-ключи Android в среду разработки facebook -> та же ошибка
  • Whitelisted graph.facebook.com в файле config.xml с:

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

-> та же ошибка

  • Используя encodeURIComponent (url) вместо encodeURI (url) -> ту же ошибку

Я использую Nexus 5 с Android 6.0.1 в качестве тестового устройства, на данный момент у меня нет доступа к другому устройству Android, но я попробую его на другом устройстве, как только я его получу.

ИЗМЕНИТЬ 3:

  • Поэтому я тестировал его на двух других устройствах Android, и это привело к той же ошибке

  • Я обновил плагин facebook4 до новейшей версии, которая поддерживает facebook sdk 4.22.1, но ошибка остается

  • Я попытался изменить версию в cordova-plugin-facebook4 / www / facebook-browser.js в функции FB.init (строка 147) с версии 2.7 до 2.9 (которая является самой новой), но ошибка остается

EDIT 4 SOLVED

Наконец, решение находится в комментариях. Это была ошибка cordova-plugin-facebook4 на устройствах Android, когда вы используете URL-адрес загрузки, который содержит символы параметров, например? & And =, которое хранится в базе firebase.

РЕШИТЬ

После многих часов я нашел проблему. Комбинация cordova-plugin-facebook4 с хранилищем firebase не работает на Android, потому что кодирование внутри плагина ошибочно обрабатывается.

Внутри файла cordova-plugin-facebook4 / src / android / ConnectPlugin.java есть эта функция:

 private void makeGraphCall() {...} 

Эта функция декодирует всю «facebookString», а затем сортирует ее сегменты специальным символом? & And =. Ссылка на загрузку хранилища firebase содержит параметры для токена безопасности, поэтому в этот момент плагин пытается интерпретировать переменные firebase в качестве параметров facebook и сокращает параметр url для кода firebase.

То, что я сделал, это изменить эту часть функции:

 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); } } 

А на угловой части я закодировал часть исходного URL-адреса firebase, которая содержит параметры, и после этого я снова декодировал весь URL-адрес, прежде чем передавать его в facebookstring.

Мой фрагмент кода с угловым кодом:

 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 об этой ошибке. Надеюсь, это поможет другим, кто может застрять в этой конкретной ошибке.

Intereting Posts