Вопрос

Delphi XE8, Android.

 

Не могу перехватить исключение при попытке активировать TTetheringManager, при отладке появляется EIdSocketError "Socket Error #101 Network is unreachable". Если игнорировать или запускать приложение отдельно - глухой висяк. Код простой:

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    TM.Enabled:=True;
  except
    on E : EIdSocketError do
      ShowMessage(E.Message) ;
  end;
  if TM.Enabled then
    TAP.Enabled:=True;
end;

Исключение не перехватывается. Возникает судя по всему уже в отдельном потоке и приводит к неработоспособности приложения при попытке запустить с выключенным wifi или интернетом.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

6 ответов на этот вопрос

  • 0
  if TM.Enabled then
    TAP.Enabled:=True;

что он должен делать? что за компоненты?

Изменено пользователем ZuBy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
  if TM.Enabled then
    TAP.Enabled:=True;

что он должен делать? что за компоненты?

 

Название темы это объясняет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

  if TM.Enabled then
    TAP.Enabled:=True;

что он должен делать? что за компоненты?

 

Название темы это объясняет.

TM - TTetheringManager

TAP - ???

ну в принципе, если вам не нужно, то и другим тоже

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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,System.Tether.Manager,
  System.Tether.AppProfile, IPPeerClient, IPPeerServer,
  FMX.Controls.Presentation, FMX.StdCtrls, IdStack;
type
  TForm1 = class(TForm)
    TM: TTetheringManager;
    TAP: TTetheringAppProfile;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var Form1: TForm1;

implementation
{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    TM.Enabled:=True;
  except
    on E : EIdSocketError do
      ShowMessage(E.Message) ;
  end;
  if TM.Enabled then
    TAP.Enabled:=True;
end;

end.

Пробовал перехватывать с помощью Application.OnException, но тоже безрезультатно. Судя по исходникам, авторы компонентов не посчитали нужным обрабатывать сетевые ошибки Добавил свои проверки на доступность Wi-Fi и мобильного интернета...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Обнаружил еще одну странность TTetheringManager - не хочет работать через мобильный интернет. 

procedure TForm1.Button2Click(Sender: TObject);
Var DiscoverTimeOut : Integer;
    ATargetList: TTetheringTargetHosts;
begin
  SetLength(ATargetList,3);
  ATargetList[0]:='195.22.104.70';
  ATargetList[1]:='195.22.104.71';
  ATargetList[2]:='195.22.104.72';
  DiscoverTimeOut:=5000;
  TM.DiscoverManagers(10000,ATargetList);
end;

Этот код не имеет никакого эффекта. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Обнаружил еще одну странность TTetheringManager - не хочет работать через мобильный интернет. 

procedure TForm1.Button2Click(Sender: TObject);
Var DiscoverTimeOut : Integer;
    ATargetList: TTetheringTargetHosts;
begin
  SetLength(ATargetList,3);
  ATargetList[0]:='195.22.104.70';
  ATargetList[1]:='195.22.104.71';
  ATargetList[2]:='195.22.104.72';
  DiscoverTimeOut:=5000;
  TM.DiscoverManagers(10000,ATargetList);
end;

Этот код не имеет никакого эффекта. 

так и не будет иметь! через мобильный интернет Tethering не работает в принципе!

Andrey Efimov понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Mazzay
      Всем добрый день!
      Приоритет нитки для Windows имеет тип TThreadPriority:
      enum DECLSPEC_DENUM TThreadPriority : unsigned char { tpIdle, tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical }; __property TThreadPriority Priority = {read=GetPriority, write=SetPriority, nodefault}; Тут по названиям элементов множества всё предельно понятно.
       
      Для Android тип уже int:
      __property int Priority = {read=GetPriority, write=SetPriority, nodefault}; Нигде не могу найти возможные варианты значений для приоритета. Кто-нибудь знает?
       
    • Автор: notricky
      Собственно вопрос, можно ли вызывать АктивитиДиалог из рабочего потока в андроид или это будет приводить к ошибкам?
    • Автор: notricky
      На Android код, который работает исправно на Win  вызывает ошибку "CalledFromWrongThreadException: Only the original thread that created a view hierarcy can touch its views" 
      Смысл таков, что я пытаюсь показать форму из треда, у которой BorderStyle=none (роли это не играет).
      Решение в Андроиде заключается в том, чтобы пускать через  runOnUiThread  (то есть выполнять интерфейсные штуки в главном потоке). Как я понимаю, в firemonkey эту фичу должен выполнять Synchronize().
      Тем не менее, ошибка возникает.
      А при запуске в режиме дебага на андроид девайсе событие кнопки вообще не срабатывает иногда. А если срабатывает, то возникает описанное выше исключение.
      Я собрал тестовый пример и в нем не сразу видна ошибка, тогда как получил я ее на рабочем проекте.
      Цель: показать бизибокс на время бекграундных действий. Этот бизибокс у меня сначала был просто на каждой форме и я интерфейсно его вызывал, но теперь решил сделать отедльной формой (как и тоаст), но почему так происходит я не понял. Вы что скажете?
       
      unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TWorkThread = class(TThread) public procedure Execute; override; end; var Form1: TForm1; implementation {$R *.fmx} uses unit2; procedure TForm1.Button1Click(Sender: TObject); var t: TWorkThread; begin t := TWorkThread.Create(True); t.FreeOnTerminate := true; t.Start; end; { TWorkThread } procedure TWorkThread.Execute; begin inherited; Self.Synchronize(procedure begin Form2.Show; Form2.Top := Form1.Top; Form2.Left := Form1.Left; Form2.BringToFront; end); Terminate; end; end.  
    • Автор: rakhmet
      TListView, как внезапно выяснилось, напрочь игнорирует системный размер шрифта и в iOS, и в Android. Есть решение, как его можно заставить соответствовать системным настройкам, или же никто не грузит себя этой ерундой?
      Наверняка и многие другие компоненты не утруждают себя соответствием системным настройкам, но меня пока интересует только TListView.
    • Автор: Anasazi
      Всем привет. Есть приложение под Android, используются 2 формы. Так вот при первом переключении есть заметная задержка (фриз). Четко чувствуется на всех устройствах. При следующих переключениях такого не наблюдается. Может быть кто-то сталкивался с такой проблемой, подскажите пожалуйста пути решения.
    • Автор: Рагим
      Доброго времени суток. Пишу мобильное приложение на Delphi Berlin. Добавил вибрацию при нажатии на кнопку. На Андроид 4.4.2 все работает нормально, на Андроид 6 при нажатии на кнопку приложение вылетает. Проблема точно в вибрации, так как при отсутствии вибрации все работает нормально. В качестве процедуры вибрации использую следующий код:
      procedure Vibr; //Процедура вибрации var   VibratorObj: JObject;   Vibrator: JVibrator; begin   VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);   Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);   if Vibrator.hasVibrator() then     Vibrator.vibrate(200); end;  
      Как по Вашему, в чем может быть причина?
    • Автор: rakhmet
      Что это (alert, message, notify, etc.)? И как этим можно воспользоваться на Android?

    • Автор: gresaggr
      Как избежать повторных нажатий/ закликиваний на кнопку?
      Имеется следующий код:
      procedure Tfm.ButtonPrevCardClick(Sender: TObject);
      begin
        ButtonPrevCard.Enabled := false;
        Application.ProcessMessages;

       // здесь код по смене карты + пауза в 2 секунды

        ButtonPrevCard.Enabled := true;
        Application.ProcessMessages;
      end;
      Под Windows повторных нажатий/закликиваний при этом не происходит.
      А под Андроид, если пользователь быстро подряд нажал несколько раз, то сработает также несколько раз.
       
    • Автор: Pax Beach
      Я использую принудительную ориентацию экрана на Android устройстве.
      Что это означает?
      Когда открывается приложение, экран переворачивается в то положение, которое я устанавливаю по умолчанию, или которое было установлено в настройках приложения (состояние читается при запуске приложения).
      Приведу пример кода, как я его написал. Здесь что-то лишнее, что-то может стоит доработать.
      Есть две проблемы в примере:
      1. Чтобы изменить ориентацию экрана, приходится закрывать (уничтожать) приложение, а потом открывать заново.
      2. Когда стоит режим ландшафт, то срабатывает автоматический переворот экрана по сенсору, когда поворачиваешь экран на 180 градусов. А когда стоит режим портрет, автоматически экран не переворачивается.
       
      В настройках проекта так:

       
      В Object inspector для главной формы так:

       
      В модуле проекта вот так:
      begin Application.Initialize; TAndroidHelper.Activity.getWindow.addFlags (TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON); Application.FormFactor.Orientations := [TFormOrientation.Portrait, TFormOrientation.InvertedPortrait, TFormOrientation.Landscape, TFormOrientation.InvertedLandscape]; Application.CreateForm(TDM, DM); Application.CreateForm(TfmMain, fmMain); VKAutoShowMode := TVKAutoShowMode.Always; Application.Run; end.  
      В модуле главной формы:
      procedure TfmMain.FormShow(Sender: TObject); begin if DM.setOrientation(TAndroidHelper.Activity) then Invalidate; end;  
      В дата-модуле вот так:
      function TDM.setOrientation(Activity: JActivity): boolean; var orient: Integer; begin result := False; if DM.GetSettingsBoolean('IsOrientationLandshaft', true) then orient := TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_LANDSCAPE else orient := TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_PORTRAIT; try if Activity.getRequestedOrientation <> orient then begin Activity.setRequestedOrientation(orient); result := true; end; except result := False; end; end;  
       
    • Автор: dmokrushin123
      На устройство с IOS сообщения приходят и через Kinvey и через FCM (Firebase Cloud Messaging).
      На Android возвращается Token, сами уведомления НЕ приходят. 
       
       
       
       
       
       
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу