Перейти к содержанию
Fire Monkey от А до Я
  • 0

Андроид-фейсбук-вконтакте


Kitty

Вопрос

Видела приложение, которое автоматом публиковало в фейсбук картинку и комментарий.

Выглядело так: человек идет в МакДональдс. Запускает приложение и приложение автоматом постит в фейсбук предопределенную внутри приложения картинку и комментарий типа "Ура я иду в МакДональдст!", при этом пользователь не предпринимает никаких доп. усилий.

Как такое можно реализовать? :)

Изменено пользователем Andrey Efimov
Исправил опечатку в заголовке
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Вот это на Хабре стоит прочитать.

Я разбираюсь сейчас с этим таким методом.

Как сказал ZuBy, наверное, можно намерениями этот вопрос решить. Было бы вообще идеально, в случае если у пользователя стоит клиент Вконтакте. Но я пока не знаю, как это организовать.

Было бы интересно увидеть решение.

 

Ссылка на комментарий
  • 0
  • Модераторы

ну самое простое, на скорую руку написал

procedure SendTextToAPP(const aText, aPackageName: string);
// {$IF defined(ANDROID)} , Androidapi.Helpers, FMX.Helpers.Android,
// Androidapi.JNI.GraphicsContentViewText,
// Androidapi.JNI.Net, Androidapi.JNI.JavaTypes
// {$ENDIF}
var
{$IF defined(ANDROID)} Intent: JIntent; {$ENDIF}
begin
{$IF defined(ANDROID)}
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
  Intent.setType(StringToJString('text/plain'));
  Intent.setPackage(StringToJString(aPackageName));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(aText));
  SharedActivity.startActivity(Intent);
{$ENDIF}
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
  SendTextToAPP('тест интентов', 'com.perm.kate');
end;

у меня используется Kate Mobile как клиент для VK

photo_2016-09-09_13-00-36.jpg

результат

2016-09-09_12-59-07.png

отличие от стандартного ShareAction в том, что мы ограничиваев выбор приложения по его пакету, если не указать пакет (Intent.setPackage(StringToJString(aPackageName));) то выйдут все приложения которые могут принимать текст

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

Не удается отправить изображение на стену.

Нашел на Тостере эту проблему, не помогло.

В коде убедился, что изображение есть.

В чем может быть нюанс, кто знает?

Uses
  Androidapi.Helpers,
  System.IOUtils,
  Androidapi.JNI.JavaTypes,
  Android.JNI.Toast,
  Androidapi.JNI.GraphicsContentViewText;

Procedure SendTextToAPP(const aText, aPackageName: string);
var
  Intent: JIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
  Intent.setType(StringToJString('text/plain'));
  Intent.setPackage(StringToJString(aPackageName));
  Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(aText));
  TAndroidHelper.Context.startActivity(Intent);
end;

Procedure SendImgToAPP(const aImg, aPackageName: string);
var
  Intent: JIntent;
  path: string;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
  Intent.setType(StringToJString('image/jpg'));
  // Intent.setType(StringToJString('application/vnd.my.package'));
  Intent.setPackage(StringToJString(aPackageName));
  path := TPath.Combine(TPath.GetDocumentsPath, aImg);
  If not FileExists(path) then begin
    Toast('No file:' + path, TToastLength.LongToast);
    exit;
  end;
  Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, StringToJString(path));
  TAndroidHelper.Context.startActivity(Intent);
  Toast('Intetnt was sent', TToastLength.ShortToast);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendTextToAPP('Проверка публикации сообщений', 'com.vkontakte.android');
  Toast('Intetnt was sent', TToastLength.ShortToast);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SendImgToAPP('eddy_01.jpg', 'com.vkontakte.android');
end;

 

Ссылка на комментарий
  • 0
  • Модераторы

ну если следовать java коду, то должно быть так

Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(path)));

правда делфи ругается при компиляции, тем такого параметра как JUri_net, есть JBundle (но я незнаю что это за зверь)

Ссылка на комментарий
  • 0
14 минут назад, ZuBy сказал:

правда делфи ругается при компиляции, тем такого параметра как JUri_net, есть JBundle (но я незнаю что это за зверь)

Наверно Androidapi.JNI.Net надо подключить

Ссылка на комментарий
  • 0
  • Модераторы
Только что, Rusland сказал:

Наверно Androidapi.JNI.Net надо подключить

нет, он этот класс видит, я незнаю что с ним делать) как из JUri_net сделать JBundle

Ссылка на комментарий
  • 0

Намерения конечно это вариант, но:

1. Что если у пользователя не стоит клиент (для которого мы пишем намерение) для Вк/ фейсбука/ неба/ал...(ой чет увлекся). На плеймаркете полно клиентов. Придется собирать их полные названия и перебирать перед постингом. 

2

В 08.09.2016 в 20:11, Kitty сказал:

приложение автоматом постит

С поставленной целью отлично справится вариант именно через АПИ: Пользователю нужно всего лишь один раз пройти авторизацию и дать права. Ну а после можем уже без его спроса сливать цру постить сообщения

Изменено пользователем Сысоев Максим
Ссылка на комментарий
  • 0
5 часов назад, Сысоев Максим сказал:

Намерения конечно это вариант, но:

1. Что если у пользователя не стоит клиент (для которого мы пишем намерение) для Вк/ фейсбука/ неба/ал...(ой чет увлекся). На плеймаркете полно клиентов. Придется собирать их полные названия и перебирать перед постингом. 

2

С поставленной целью отлично справится вариант именно через АПИ: Пользователю нужно всего лишь один раз пройти авторизацию и дать права. Ну а после можем уже без его спроса сливать цру постить сообщения

1. Можно перед отправкой перебрать установленные пакеты и выбрать наиболее релевантный

2. Пользователя вообще может не быть в соц сети

Ссылка на комментарий
  • 0
17 часов назад, ZuBy сказал:

ну если следовать java коду, то должно быть так


Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(path)));

правда делфи ругается при компиляции, тем такого параметра как JUri_net, есть JBundle (но я незнаю что это за зверь)

О интересно, сейчас попробую. А где ты этот java код нашел? Может там еще что-то полезное есть.

 

Ссылка на комментарий
  • 0
  • Модераторы
1 минуту назад, Pax Beach сказал:

О интересно, сейчас попробую. А где ты этот java код нашел? Может там еще что-то полезное есть.

Вы давали ссылку, там был код

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/gif");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("example.gif")));
intent.setPackage("com.vkontakte.android");
startActivity(intent);

 

Ссылка на комментарий
  • 0
6 минут назад, ZuBy сказал:

Вы давали ссылку, там был код


Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/gif");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("example.gif")));
intent.setPackage("com.vkontakte.android");
startActivity(intent);

 

Не внимательный стал.

Ссылка на комментарий
  • 0

1. Перед подобными вызовами активностей с указанием пакета, всегда рекомендуется проверять наличие их в системе:

    //получаем список пакетов, которые могут обработать ваше намерение
	tempList := TAndroidHelper.Activity.getPackageManager.
        queryIntentActivities(Intent);
	//стартуем только в случае наличия пакета
    if tempList.size > 0 then
        TAndroidHelper.Activity.startActivity(Intent);

2. При отправке сторонним приложениям файлов (изображения в частности) всегда рекомендуется создавать копию изображения:

а) с УНИКАЛЬНЫМ  именем - необходимо для разрешения проблем с кешированием в других приложениях. Например Facebook кеширует по имени и при повторном вызове не обновляет;

б) сохранять нужно в CacheDir, т.к. другим приложениям может попросту не быть доступа к файлу вашего приложения (использование Uri обязательно).

3. Т.к. у подобных приложений шарингом занимаются отдельные активности, то не забудьте про флаги NewTask | ClearTask у намерения.

п.с. Не забудьте потом периодически удалять свой кеш.

Ссылка на комментарий
  • 0
В 08.09.2016 в 20:11, Kitty сказал:

Видела приложение, которое автоматом публиковало в фейсбук картинку и комментарий.

Выглядело так: человек идет в МакДональдс. Запускает приложение и приложение автоматом постит в фейсбук предопределенную внутри приложения картинку и комментарий типа "Ура я иду в МакДональдст!", при этом пользователь не предпринимает никаких доп. усилий.

Как такое можно реализовать? :)

Общая схема такая:

1. Регистрация своего приложения в API соцсетей (facebookvk).

2. Реализуете в своем приложении авторизацию через OAuth 2.0:

- можно использовать легкий вариант через WebBrowser, т.о. образом сразу поддерживая Android/IOS.

- можно сделать красиво, используя "Intent" и "startActivityForResult".

- можно использовать SDK соцсетей, но это совсем другая история...

3. После регистрации сохраняем токен, при помощи которого мы можем через API автоматически постить сообщения. Учитываем здесь время действия токена, периодически его обновляя.

Ссылка на комментарий
  • 0
Цитата

- можно использовать легкий вариант через WebBrowser, т.о. образом сразу поддерживая Android/IOS.

Вот хоть один работающий пример бы найти для RAD Studio, или еще лучше документацию от разработчиков соц. цетей.

Разоборал манифесты FB и VK, там много интент-фильтров. Но подходщий, чтобы запостить фото на свою стену я пока не нашел — либо пустой контент приходит, либо приложение валится от непонятного содержимого интента.

 

Ссылка на комментарий
  • 0
  • Модераторы
8 минут назад, Pax Beach сказал:

Вот хоть один работающий пример бы найти для RAD Studio, или еще лучше документацию от разработчиков соц. цетей.

когда я пробовал работать с OAuth 2.0, не было возможности получить контент страницы из браузера (кроме Windows), чтобы спарсить токен. а без этого никак

Ссылка на комментарий
  • 0
1 час назад, ZuBy сказал:

когда я пробовал работать с OAuth 2.0, не было возможности получить контент страницы из браузера (кроме Windows), чтобы спарсить токен. а без этого никак

У меня OAuth работает на 6-м Android.

Сообщения на стену летят, а вот фотографии на стену в три шага загружаются. Пытаюсь понять, как правильно отправить фото POST запросом в формате multipart/form-data.

 

Ссылка на комментарий
  • 0
  • Модераторы
8 минут назад, Pax Beach сказал:

У меня OAuth работает на 6-м Android.

Сообщения на стену летят, а вот фотографии на стену в три шага загружаются. Пытаюсь понять, как правильно отправить фото POST запросом в формате multipart/form-data.

интересно посмотреть как вы получили токен, я пробовал получать для гугл (давно правда это было, в XE7/8 )

Ссылка на комментарий
  • 0

При реализации  OAuth 2.0 при помощи TWebBrowser главное отследить Redirect. В случае успешной авторизации в URL будет содержаться необходимый токен. Посмотрите в сторону использования вот этих форм (находятся в ..\source\data\rest):

  {$IFDEF MSWINDOWS}
      REST.Authenticator.OAuth.WebForm.Win
  {$ELSE}
      REST.Authenticator.OAuth.WebForm.FMX
  {$ENDIF}

У них есть событие:

  property OnAfterRedirect: TOAuth2WebFormRedirectEvent read FOnAfterRedirect write FOnAfterRedirect;

  TOAuth2WebFormRedirectEvent = procedure(const AURL: string; var DoCloseWebView : boolean) of object;

Вот обработчик:

procedure TframeAutch.AfterRedirect(const AURL: string;
  var DoCloseWebView: boolean);
var i:integer;
    Str: string;
    Params: TStringList;
begin
  i := pos('#access_token=',AURL);
  if (i>0) then
    begin
      Str := AURL;
      Delete(Str,1,i);
      Params:=TStringList.Create;
      try
        Params.Delimiter:='&';
        Params.DelimitedText := Str;
        token := Params.Values['access_token'];
		DoCloseWebView := True;
      finally
        Params.Free;
      end;
    end;
end;

**Код выше из XE7, сейчас мб что-то изменилось. Использовал такой подход для авторизации в vk, facebook, google+.

***Если нужно, могу сделать демку, но это только на выходных.

Ссылка на комментарий
  • 0
11 часов назад, ZuBy сказал:

когда я пробовал работать с OAuth 2.0, не было возможности получить контент страницы из браузера (кроме Windows), чтобы спарсить токен. а без этого никак

Так нам содержимое страницы парсить и не нужно. Нужно лишь разобрать ЮРЛ после авторизации, на который нас пошлет социалка(это точно справедливо для ВК, по моему опыту). Для разбора отлично подойдет запись TURI(только, помню, что я заменял # на ?) В вк придет ид юзера, токен, и его срок годности.

Да и примеры как получать токен показал "Fedor K".

Ссылка на комментарий
  • 0
В 09.09.2016 в 19:25, ZuBy сказал:

ну если следовать java коду, то должно быть так


Intent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(path)));

правда делфи ругается при компиляции, тем такого параметра как JUri_net, есть JBundle (но я незнаю что это за зверь)

Бандл — это пакет параметров.

Спасибо за подсказку. Использовать нужно так: 

TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(path))).toString;

 

Ссылка на комментарий
  • 0
  • Модераторы
1 минуту назад, Pax Beach сказал:

Бандл — это пакет параметров.

Спасибо за подсказку. Использовать нужно так: 


TJnet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(path))).toString;

 

получилось?

Ссылка на комментарий
  • 0
11 часов назад, ZuBy сказал:

получилось?

Неа. Просто видел в других примерах, что файлы передаются в URI в таком виде, как я написал.

Манифесты от VK и FB разобрал , и не понял, в каком вид эти приложения интенты принимают, чтобы все было как надо. Зато понял, что для моих целей не подходит простая отправка контента в приложение, разбираюсь с SDK, пока от VK.

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...