Вопрос

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 понравилось это

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: 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, сами уведомления НЕ приходят. 
       
       
       
       
       
       
    • Автор: notricky
      Почему-то код, исправно работающий для WIN, не работает на ANDROID.
      procedure AssignEventToComponent(C: TComponent; MethodName: String; const Evt: TNotifyEvent; OnlyIfNil: boolean = true); var M: TMethod; begin M := GetMethodProp(C,MethodName); if not OnlyIfNil or (M.Code = nil) then begin TNotifyEvent(M) := Evt; SetMethodProp(C,MethodName,M); end; end; Есть какие-то особенности работы TMethod для ANDROID?
    • Автор: lala4a
      Доброе время суток .
      Я только начал знакомится с потоками , не судите строго .
      Вот код . Смысл которого через отдельный поток загружать изображение с сервера .
      unit Unit5; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,iduri,idhttp, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.Controls.Presentation, FMX.StdCtrls; type ThreadHTTP=class(TThread) private Stream:TMemoryStream; bmp:tbitmap; url:string; public constructor Create(abmp:tbitmap; aurl: String); procedure Execute;override; // procedure ShowResult; end; type TForm5 = class(TForm) Button1: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure getpic(pic: string; img: Tbitmap); end; var Form5: TForm5; implementation {$R *.fmx} constructor ThreadHTTP.Create(abmp:tbitmap;aurl:string); begin inherited Create(false); bmp := abmp; url:=aurl; end; procedure ThreadHTTP.Execute; var j:integer; idhttp : TIdHTTP; ms:tmemorystream; png:tbitmap; begin ms := TMemoryStream.Create; IdHTTP := TIdHTTP.Create(nil); url:=TIdURI.URLEncode(url); try idhttp.Get(url,ms); ms.Position := 0; finally bmp.LoadFromStream(ms); idhttp.Free; ms.Free; end; end; procedure TForm5.Button1Click(Sender: TObject); begin getpic('krovat1',form5.Image1.Bitmap); end; procedure TForm5.getpic(pic: string; img: Tbitmap); var zapros:string; idhttp:tidhttp; MyHTTP:ThreadHTTP; begin zapros:='http://127.0.0.1/getimage_'+pic; MyHTTP:=ThreadHTTP.Create(img,zapros); MyHTTP.FreeOnTerminate := true; MyHTTP.resume; end; end. Код корявый , но работает в win32 .  В Android ничего не происходит .
      Помогите разобраться , пожалуйста .
       
    • Автор: ivadimos
      Пытаюсь опубликовать приложение в Гугл маркет.
      Присылают ответ на почту.

      OpenSSL
      The vulnerabilities were addressed in OpenSSL 1.02f/1.01r. To confirm your OpenSSL version, you can do a grep search for:
      $ unzip -p YourApp.apk | strings | grep "OpenSSL"
      You can find more information and next steps in this Google Help Center article.
      Но ведь я не использую никакой работы с сетью и т.д, только firedac и sqlite
    • Автор: Rusland
      Имеется форма с Edit, в котором набран IP-адрес 192.168.1.12
      Если попробовать долгим тапом выделить весь текст (для копирования), то выделяется только какая-то одна цифра. Весь текст никак не выделить. Тоже самое будет, если вместо точек поставить любые другие знаки препинания или пробел. Как решить эту проблему?
       
  • Сейчас на странице   0 пользователей

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