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

[Android][XE10]Передача строки между смартфонами


brunnengi

Вопрос

Здравствуйте.

Необходимо добавить в приложение возможность обменяться строками данных между смартфонами.

Задача такая. Смартфон "Alice" сгенерировал некую строку, допустим такую "somegendatadrom_a".

На смартфоне "Bob" приложение должно прочитать/получить строку "somegendatadrom_a".

Как проще всего, без болезненнее, быстро, эффективно и с помощью каких компонентов это сделать?

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

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

  • 0
  • Модераторы
2 часа назад, brunnengi сказал:

Здравствуйте.

Необходимо добавить в приложение возможность обменяться строками данных между смартфонами.

Задача такая. Смартфон "Alice" сгенерировал некую строку, допустим такую "somegendatadrom_a".

На смартфоне "Bob" приложение должно прочитать/получить строку "somegendatadrom_a".

Как проще всего, без болезненнее, быстро, эффективно и с помощью каких компонентов это сделать?

App Tethering - проще некуда. Статьи, есть у меня в блоге и у других разработчиков, и в справке.

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

Сделал пример из блога. Но как только перевожу и клиент и сервер  блутуз, то все перестает работать. В чем может быть проблема? Права на блутуз выставлены. Проверяю через два смартфона.

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

Серверная часть:

Спойлер

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IPPeerClient,
  IPPeerServer, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo,
  System.Tether.Manager, FMX.StdCtrls, System.Tether.AppProfile;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    TetheringManager1: TTetheringManager;
    Button1: TButton;
    TetheringAppProfile1: TTetheringAppProfile;
    procedure TetheringManager1PairedFromLocal(const Sender: TObject;
      const AManagerInfo: TTetheringManagerInfo);
    procedure TetheringManager1PairedToRemote(const Sender: TObject;
      const AManagerInfo: TTetheringManagerInfo);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  TetheringManager1.AutoConnect();
end;

procedure TForm1.TetheringManager1PairedFromLocal(const Sender: TObject;
  const AManagerInfo: TTetheringManagerInfo);
begin
  Memo1.Lines.Add('PairedFromLocal: ' +
      AManagerInfo.ManagerIdentifier + ' ' +
      AManagerInfo.ManagerText);
end;

procedure TForm1.TetheringManager1PairedToRemote(const Sender: TObject;
  const AManagerInfo: TTetheringManagerInfo);
begin
  Memo1.Lines.Add('PairedToRemote: ' +
      AManagerInfo.ManagerIdentifier + ' ' +
      AManagerInfo.ManagerText);
end;

end.

 

Клиентская часть:

Спойлер


unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IPPeerClient,
  IPPeerServer, System.Tether.Manager, System.Tether.AppProfile,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    TetheringAppProfile1: TTetheringAppProfile;
    TetheringManager1: TTetheringManager;
    procedure TetheringAppProfile1ResourceReceived(const Sender: TObject;
      const AResource: TRemoteResource);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormShow(Sender: TObject);
begin
  TetheringManager1.AutoConnect();
end;

procedure TForm1.TetheringAppProfile1ResourceReceived(const Sender: TObject;
  const AResource: TRemoteResource);
begin
  if AResource.ResType = TRemoteResourceType.Data then
  begin
    Memo1.Lines.Add(AResource.Hint + ': ' + AResource.Value.AsString);
    TetheringAppProfile1.Resources.FindByName('TestSend').Value := '[Server] Постоянный ресурс';
  end;
end;

end.

 

 

TetheringManager.AllowedAdapters = Bluetooth;

Когда стоит Network и устройства подключены через ВайФай, то все работает. Но как тока и у сервера и клиента ставлю Bluetooth и собрегаю смартфоны между собой, то перестает работать.

Изменено пользователем brunnengi
Ссылка на комментарий
  • 0
В 30.10.2016 в 17:43, brunnengi сказал:

Кто нибудь попробуйте  AppTethering через Bluetooth между смартфонами. 

Проверял - у меня не работает (Bluetooth включен, в Permission добавлено)

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

Вопрос остался открытым.

1. AppTethering через Bluetooth между двумя смартфонами не работает. (спасибо Rusland'у за подтверждение это проблемы)

2. AppTethering через Wi-Fi не пашет, если на одном устройстве создать моб.точку доступа, а с другого подключиться. Вроде бы они получаются в одной подсети, но по факту AppTethering не пашет.

3. Хотел сделать передачу считывания через QR Code, но объем данных для QR оказался слишком большой. Да и адекватного компонента нет. 

Какие ещё варианты передачи данных/строки/файла, из программы на FMX стоящей на смартфоне некой Alice можно передать в такую же программа на FMX стоящей на смартфоне некого Bob'а, максимально легко (не в плане кода, а плане дальней эксплуатации пользователями), вы можете посоветовать, предложить? 

Условия:

1. При передачи не использовать интернет. Должна быть передача именно с телефона на телефон.

2. Способ передачи должен быть технически возможен на большинстве устройств. Т.е. например передачу через NFC не рассматриваем, так как есть не у всех.

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

Вопрос остался открытым.

1. AppTethering через Bluetooth между двумя смартфонами не работает. (спасибо Rusland'у за подтверждение это проблемы)

2. AppTethering через Wi-Fi не пашет, если на одном устройстве создать моб.точку доступа, а с другого подключиться. Вроде бы они получаются в одной подсети, но по факту AppTethering не пашет.

3. Хотел сделать передачу считывания через QR Code, но объем данных для QR оказался слишком большой. Да и адекватного компонента нет. 

Какие ещё варианты передачи данных/строки/файла, из программы на FMX стоящей на смартфоне некой Alice можно передать в такую же программа на FMX стоящей на смартфоне некого Bob'а, максимально легко (не в плане кода, а плане дальней эксплуатации пользователями), вы можете посоветовать, предложить? 

Условия:

1. При передачи не использовать интернет. Должна быть передача именно с телефона на телефон.

2. Способ передачи должен быть технически возможен на большинстве устройств. Т.е. например передачу через NFC не рассматриваем, так как есть не у всех.

Могу предложить передачу звуком. Как когда то в модемах. Будет наверное забавно ;-) 

P.S. А передачу с помощью QR Code попробуйте следующим образом - не одна картинка с кодом, а несколько с интервалом в N секунд. Давно хотел такое реализовать, но руки не доходили, да и в Delphi с распознаванием и генерацией QR кодов глухо, приходится использовать сторонние приложения.

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

Про звук мне грешным делом тоже мысли приходили. Но это может и забавно, но вряд ли удобно. Да и в плане кода под Андроид придется сильно попотеть, а скорость передачи будет уж слишком низкая. С таким же успехом можно и камерой мигания светодиода считывать, тоже будет забавно, но в практических целях не очень как то.

Смена картинок с QR кодом тоже приходила в голову. Но это опять таки не удобно. Получается сначала один должен отфоткать 10 картинок, потом другой у первого 10 фоток. Удобство пропадает.

Блин, вот с Embacadero всегда так, вроде что то интересное вводят, вроде примеры работают, но в реальных проектах становится тяжело применимо, потому что какая то мелочь не даёт этого сделать. Самое что интересное, многое что вводится не так остро нужно, как самые обыкновенные, но хорошо работающие стандартные процедуры. Взять ту же камеру, которая по сей день с тормозами работает. Теперь и AppTethering который работает тока при "определенных" условиях. Блин, а вед задача передать данные с одного устройства на другое звучит как вполне тривиальная. Но увы, это Embacadero, детка! В реальных проектах приходится использовать много разных "блоков" и когда эти "блоки" сами по себе плохо работают, разработка превращается в ад. 

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

Самое что интересное, многое что вводится не так остро нужно, как самые обыкновенные, но хорошо работающие стандартные процедуры

Вместо Embarcadero подставить любую другую IDE под мобильные платформы - и разработчики, использующие эту "другую" IDE с вами согласятся безоговорочно :) Одни отзывы про XCode чего стоят :)

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

AppTethering в эбаркадере написан по быстрому на коленке, через блютус почти не работает, в одном проекте удалось заставить работать с вероятностью один к десяти, т.е. одна успешная передача при десяти попытках. wifi тоже глючит, особенно автоконнект, при ручном связывании и костылях работает вполне прилично. 

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

Удалось проверить.

Итог:

Демка - C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\App Tethering\MediaPlayer НЕ РАБОТАЕТ!

Демка - C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\RTL\Tethering\MediaPlayer РАБОТАЕТ! (сейчас вот сижу играюсь, с телефона управляю этим плеером, через BlueTooth)


Ап. с телефона удалось законектиться и к первой демке, но приложение на телефоне из второй демки.

Супер Ап. Мой пример из статьи App Tethering #3: Передача и получение данных отлично и с первого раза заработал. Добавил два разрешения для блютуса в мобильном приложении и выставил  TetheringManager.AllowedAdapters = Bluetooth; в обоих проектах, всё.

Спойлер

Снимок.PNG

При тестировании, оба устройства были видимыми.

 

p.s. Не знаю, почему (частично) не завелась первая демка, выяснять не хочу, т.к. остальные примеры рабочие...

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

Спасибо за проведенные тесты.

Но увы вариант с смартфон <--> смартфон, так и не разрешен.

Эм... давайте больше информации.

Только что сконектил два телефона (Huawei Y541-U02 - Android 4.4.2 и LG Optimus L7 P705 - Android 4.1.2 ) Без каких либо проблем и с первого раза.

Спойлер

DSCN0418.JPG

 

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

Через AppTetring, через Bluetooth?

Можно apk для теста?

А то может тут личная во мне проблема((

Да, конечно, там даже на фото видно, что включён bluetooth на LG, а все остальные сети отключены (вкл. мобильную).

Да, можно конечно. Я вам выложу вообще весь проект, с уже собранными приложениями, т.е. в папках лежат исходники, apk-файлы, exe-файлы. (осторожно весит 145 МБ) залил на свой Google Диск https://drive.google.com/open?id=0BwEZB8sRo0DSc3lodnJWbDR3Nms

 

На каких девайсах пробуете и какие версии Андроида на них?

 

p.s. Собрано на Delphi Berlin Update 1

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

На каких девайсах пробуете и какие версии Андроида на них?

Samsung Note3 (Android 5.0) <--> Samsung Tab3 (модель SM-T531, Android 5.0.2)

 

Спасибо за весь выложенный проект. Действительно через твой проект работает. Буду пробовать ещё раз создать с нуля у себя и посмотрю что выйдет.

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

Samsung Note3 (Android 5.0) <--> Samsung Tab3 (модель SM-T531, Android 5.0.2)

 

Спасибо за весь выложенный проект. Действительно через твой проект работает. Буду пробовать ещё раз создать с нуля у себя и посмотрю что выйдет.

Не за что. Перед окончательной сборкой, проверь права в манифесте, на всякий случай. Ещё можно сделать Clean проекта и потом уже собирать.

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

Да, можно конечно. Я вам выложу вообще весь проект, с уже собранными приложениями, т.е. в папках лежат исходники, apk-файлы, exe-файлы. (осторожно весит 145 МБ) залил на свой Google Диск https://drive.google.com/open?id=0BwEZB8sRo0DSc3lodnJWbDR3Nms

А у меня все равно не работает. :( Пробовал на Lenovo Tab 2 (Android 5.0), Ursus 180 (Android 5.1), Texet X-Basics (Android 4.2). Пробовал и скомпилированные apk, и сам компилил на Berlin - отказывается работать.

При старте Client выдает:

Project Client.apk raised exception class EJNIException with message 'java.io.IOException: [JSR82] accept: Connection is not created (failed or aborted).'.

Потом если нажать Send, то программа выдает Argument out of range.

При старте Server выдает: 

Project Server.apk raised exception class EJNIException with message 'java.io.IOException: Try again'.

 

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

А у меня все равно не работает. :( Пробовал на Lenovo Tab 2 (Android 5.0), Ursus 180 (Android 5.1), Texet X-Basics (Android 4.2). Пробовал и скомпилированные apk, и сам компилил на Berlin - отказывается работать.

При старте Client выдает:

Project Client.apk raised exception class EJNIException with message 'java.io.IOException: [JSR82] accept: Connection is not created (failed or aborted).'.

Потом если нажать Send, то программа выдает Argument out of range.

При старте Server выдает: 

Project Server.apk raised exception class EJNIException with message 'java.io.IOException: Try again'.

Судя по интернету, есть такая проблема на некоторых девайсах.

Что можно попробовать:

1) Перезапуск устройств и последующая попытка подключения

2) Провести сопряжение устройств и оставить их видимыми, попытаться подключиться

Если не получится, тогда лучше сразу сюда https://quality.embarcadero.com/secure/Dashboard.jspa отписаться. (укажите всю информацию, логи, модели устройств, демо проекты)

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

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

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

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

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

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

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

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

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

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

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