Перейти к содержанию
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 пользователей онлайн

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