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

Rusland

Пользователи
  • Постов

    1 204
  • Зарегистрирован

  • Посещение

  • Победитель дней

    25

Ответы сообщества

  1. Пост Rusland - сообщение в "Общение" сервиса и приложения через intent был отмечен как ответ   
    Для ищущих ответа:
    Есть стандартное demo Object Pascal\Mobile Snippets\AndroidIntents\AndroidIntentsGroup.groupproj, в котором показано как из одного приложения передавать данные другому. С помощью этого примера удалось передавать данные из сервиса в основное приложение.
    В юните основного приложения пишем:
    uses FMX.Platform, FMX.Platform.Android, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.Os, Androidapi.Helpers, System.Messaging, Androidapi.JNI.GraphicsContentViewText; private { Private declarations } function HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); function HandleIntentAction(const Data: JIntent): Boolean; procedure TForm1.FormCreate(Sender: TObject); var AppEventService: IFMXApplicationEventService; begin ... if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, AppEventService) then AppEventService.SetApplicationEventHandler(HandleAppEvent); // Register the type of intent action that we want to be able to receive. // Note: A corresponding <action> tag must also exist in the <intent-filter> section of AndroidManifest.template.xml. MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW); TMessageManager.DefaultManager.SubscribeToMessage(TMessageReceivedNotification, HandleActivityMessage); end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin if M is TMessageReceivedNotification then HandleIntentAction(TMessageReceivedNotification(M).Value); end; function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var StartupIntent: JIntent; begin Result := False; if AAppEvent = TApplicationEvent.BecameActive then begin StartupIntent := MainActivity.getIntent; if StartupIntent <> nil then HandleIntentAction(StartupIntent); end; end; function TForm1.HandleIntentAction(const Data: JIntent): Boolean; var Extras: JBundle; begin Result := False; if Data <> nil then begin Memo1.ClearContent; // записываем в Memo пришедшее сообщение Extras := Data.getExtras; if Extras <> nil then Memo1.Text := JStringToString(Extras.getString(TJIntent.JavaClass.EXTRA_TEXT)); Invalidate; end; end; в AndroidManifest.template.xml добавляем 
    <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="text/pas" /> Отправка сообщения из сервиса делается так:
    SendTextViaIntent('Hello from service'); procedure TAndroidServiceDM.SendTextViaIntent(const AText: string); var   Intent: JIntent; begin   Intent := TJIntent.Create;   Intent.setType(StringToJString('text/pas'));   Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);   Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); // добавил такой флаг, без  него сервис затыкался   Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(AText));   if  TJContextWrapper.Wrap(System.JavaContext).getPackageManager.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size > 0 then      TJContextWrapper.Wrap(System.JavaContext).startActivity(Intent); // заменил MainActivity на TJContextWrapper.Wrap(System.JavaContext), т.к. это сервис end; Работает исправно, хоть 100%-ую правильность кода не гарантирую  Но как передать сообщение из основной программы обратно в сервис я пока не знаю. Также делать хендл внутри сервиса? 
    Попытался просто добавить FMX.Platform, в результате получаю ошибку в FMX.Platform.Android вываливается ошибка об использовании Activity внутри сервиса.
  2. Пост Rusland - сообщение в Запуск приложения от PUSH-уведомления был отмечен как ответ   
    Slava Marchenko подсказал что при закрытом приложении получить сам текст можно так:
    procedure TFormMain.FormActivate(Sender: TObject); var CurNotification : TPushServiceNotification; begin if Length(fPushService.StartupNotifications) > 0 then for CurNotification in fPushService.StartupNotifications do if Assigned(CurNotification) then Memo.Lines.Text := CurNotification.Json.ToJSON; end;  
  3. Пост Rusland - сообщение в Дублирование проекта на телефоне был отмечен как ответ   
    Хм. Поменял у второго  label= MyNewName и второй проект действительно пропал и перезаписался с новым именем.
    Ingalime, вам проще переименовать проект, нажав F2 вот тут:

  4. Пост Rusland - сообщение в Как достучаться до папки /data/data/... ? был отмечен как ответ   
    К этой папке есть доступ только у самой программы (если аппарат не рутован).
    Так как программа твоя, то ты можешь скопировать файл в общедоступную папку, например, TPath.GetSharedDownloadsPath
  5. Пост Rusland - сообщение в WaterEffect FMX был отмечен как ответ   
    На Berlin нормально установился этот компонент... только почему-то не вижу его на палитре. А что он делает?
    Есть стандартный компонент TWaterTransitionEffect - случайно делает не тоже самое? (для примера наложите этот эффект на TText)
  6. Пост Rusland - сообщение в IP адрес и Edit был отмечен как ответ   
    Как выяснилось на пустом проекте работает. Стал выяснять в чем дело - оказалось у меня в StyleBook был стиль для Edit - вот с ним выделение работает некорректно. А стиль мне нужен для того чтобы символ каретки был белым цветом... 
    В общем пересоздал Default стиль для Edit и все отлично заработало. Тему можно закрывать/удалять.
     
  7. Пост Rusland - сообщение в AV на финализации приложения (зависит от порядка в uses) был отмечен как ответ   
    Сюда наверно надо писать (нажать Create issue)
  8. Пост Rusland - сообщение в Проблема в работоспособности приложения под андроид был отмечен как ответ   
    Вряд ли тут дело в версии. Скорее всего поверх стоит какой-нибудь layout. Лучше попробовать повторить на тестовом примере и если повторится, то выложить сюда код примера для разбора
  9. Пост Rusland - сообщение в После "сна" программа с сервисом не стартует был отмечен как ответ   
    Всем кто в сервис передает параметры, типа:
    procedure TFrmMain.StartService(); var LIntent: JIntent; begin LIntent := TJIntent.Create; LIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.TestRemoteServ')); LIntent.setAction(StringToJString('StartService')); TAndroidHelper.Activity.startService(LIntent); end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopService')) then begin Log('START_NOT_STICKY'); Result := TJService.JavaClass.START_NOT_STICKY; end else // if Intent.getAction.equalsIgnoreCase(StringToJString('StartService')) then begin Log('START_STICKY'); Result := TJService.JavaClass.START_STICKY; end; end; обязательно проверяйте Intent на nil !
    Когда система убивает ваше приложение из-за нехватки памяти и перезапускает сервис, то на Intent.getAction происходит Segmentation fault и сервис остается в подвешенном состоянии (на процессоре ARM в Приложения - Работающие у меня отображается как-будто сервис нормально перезапустился, а вот на процессоре Intel - видно как сервис находится в вечном перезапуске). И естественно хост-приложение не может нормально стартануть.
    Делаем примерно так:
    function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent<>nil then begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopService')) then begin Log('START_NOT_STICKY'); Result := TJService.JavaClass.START_NOT_STICKY; end else // if Intent.getAction.equalsIgnoreCase(StringToJString('StartService')) then begin Log('START_STICKY'); Result := TJService.JavaClass.START_STICKY; end; end else begin Log('RESTART BY SYSTEM'); Result := TJService.JavaClass.START_STICKY; end; end;  
  10. Пост Rusland - сообщение в Как убрать клаву по окончанию ввода в TEdit ? был отмечен как ответ   
    KillFocusByReturn=true
    Правда у меня на планшете Леново 7'' (Android 4.4) это не срабатывает и нажатие Enter приводит к переводу каретки... была уже тема такая
  11. Пост Rusland - сообщение в Изменить цвет фона в DesignTime режиме был отмечен как ответ   
    Полагаю что раскрашивается через сменю стиля...  типа у кнопки нажимаем Edit Custom Style, в редакторе удаляем background, ставим вместо него Rectangle, меняем ему Align на Client, StyleName=background, Fill.Color=цвет (ну и Stroke поменять). Перенести Text на Rectangle... как-то так.
    Создать несколько вариантов стиля и в рантайме менять StyleLookup кнопки, не?
  12. Пост Rusland - сообщение в [TLabel]OnClick в Android был отмечен как ответ   
    Достаточно  Hittest=true (он по умолчанию у Label=false)
  13. Пост Rusland - сообщение в [Android] Добавить цветную картинку был отмечен как ответ   
    Нужно изменить стиль TabItem. Зайдите в Edit custom style. Найдите там top -> icon и очистите в нем SourceLookup.
    Подробно с картинками описано тут.

  14. Пост Rusland - сообщение в Прогрессбар во время загрузки файла. был отмечен как ответ   
    У IdHTTP есть OnWork, нужно его задействовать. В Windows это было просто... а как под мобильные платформы - вопрос
  15. Пост Rusland - сообщение в Скачать курс валют через THTTPClient был отмечен как ответ   
    Проблема решена.
    Оказалось что там кодировка Win1251, а я указал 
    TStringStream.Create('', TEncoding.UTF8); вместо
    TStringStream.Create(''); И парсер на всякий случай:
    uses msxml; procedure GetKursValutAndDate(XML:String; var KDollar,KEuro:Double); var XMLDoc: IXMLDOMDocument; Subnodes: IXMLDOMNodeList; AttributeNode: IXMLDOMNode; OperationNode: IXMLDOMNode; i:integer; begin KDollar:=0; KEuro:=0; try XMLDoc:=CoDOMDocument.Create; if Assigned(XMLDoc) and XMLDoc.loadXML(XML) then begin Subnodes:=XMLDoc.selectNodes('//ValCurs/node()'); if Assigned(Subnodes) then begin for I := 0 to Subnodes.length - 1 do begin AttributeNode := Subnodes[I].attributes.getNamedItem('ID'); if Assigned(AttributeNode) then if (AttributeNode.nodeValue='R01235') then begin // доллар OperationNode:=Subnodes[I].selectSingleNode('.//Value'); if Assigned(OperationNode) then KDollar:=StrToFloat(OperationNode.text); end else if (AttributeNode.nodeValue='R01239') then begin // евро OperationNode:=Subnodes[I].selectSingleNode('.//Value'); if Assigned(OperationNode) then KEuro:=StrToFloat(OperationNode.text); end end; end; end; except Raise Exception.Create('Не удалось получить курс валют'); end; end;  
  16. Пост Rusland - сообщение в [TidTCPClient] Почему при использовании TidTCP замораживается интерфейс? был отмечен как ответ   
    Почитайте про потоки
    http://fire-monkey.ru/topic/30-fonovoe-vypolnenie-operatcii-bez-zamorazhivani/
  17. Пост Rusland - сообщение в [TIdLog] Как использовать компоненты линейки TIdLog? был отмечен как ответ   
    Нужен для того чтобы логировать все что происходит при запросах через IdTCPclient, IdUDPclient и т.п.
     
    Например, положите на форму IdHTTP1, IdLogFile1, IdIOHandlerStack1 и Button. Пропишите следующее
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdIntercept, IdLogBase, IdLogFile, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, FMX.Controls.Presentation, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; IdHTTP1: TIdHTTP; IdLogFile1: TIdLogFile; IdIOHandlerStack1: TIdIOHandlerStack; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin IdLogFile1.Filename:='c:\temp\1.log'; IdLogFile1.Active:=True; IdIOHandlerStack1.Intercept:=IdLogFile1; IdHTTP1.IOHandler:= IdIOHandlerStack1; IdHTTP1.Get('http://google.ru'); end; end. После нажатия кнопки можете увидеть результат лога в файле c:\temp\1.log
  18. Пост Rusland - сообщение в [TPath] Как составлять TPathData? был отмечен как ответ   
    Вот, например, взял данные из svg и простым Ctrl-C/Ctrl-V скопировал в PathData
    M121.720001220703,37.5099983215332 C134.070007324219,37.4599990844727 146.419998168945,37.3300018310547 158.770004272461,37.25 C149.610000610352,52.1599998474121 140.360000610352,67.0100021362305 131.229995727539,81.9400024414063 C123.230003356934,81.5400009155273 115.169998168945,82.4599990844727 107.540000915527,84.9100036621094 C112.309997558594,69.120002746582 116.959999084473,53.2999992370605 121.720001220703,37.5099983215332 Z M134.979995727539,82.3499984741211 C145.630004882813,67.3099975585938 156.210006713867,52.2099990844727 166.850006103516,37.1599998474121 C179.839996337891,41.4199981689453 192.839996337891,45.6500015258789 205.820007324219,49.9300003051758 C189.960006713867,63.2700004577637 173.820007324219,76.3000030517578 158.110000610352,89.8099975585938 C150.740005493164,86.379997253418 143.130004882813,83.25 134.979995727539,82.3499984741211 Z M81.5100021362305,55.5699996948242 C91.6999969482422,51.4799995422363 101.910003662109,47.4500007629395 112.110000610352,43.4099998474121 C109.519996643066,57.5999984741211 106.819999694824,71.7799987792969 104.290000915527,85.9800033569336 C97.2699966430664,88.9700012207031 90.629997253418,92.8899993896484 84.9700012207031,98.0299987792969 C83.8000030517578,83.879997253418 82.6800003051758,69.7300033569336 81.5100021362305,55.5699996948242 Z M53.9900016784668,84.0400009155273 C61.1300010681152,77.1500015258789 68.1999969482422,70.1900024414063 75.4499969482422,63.4099998474121 C77.9700012207031,75.5500030517578 80.5100021362305,87.6900024414063 83.0699996948242,99.8199996948242 C78.0299987792969,104.819999694824 73.870002746582,110.660003662109 70.6800003051758,116.98999786377 C65.1699981689453,105.980003356934 59.5499992370605,95.0199966430664 53.9900016784668,84.0400009155273 Z M88.0699996948242,106.139999389648 C98.8600006103516,95.0599975585938 114.519996643066,88.9599990844727 129.970001220703,89.9100036621094 C142.520004272461,90.5100021362305 154.679992675781,95.7799987792969 163.949996948242,104.230003356934 C144.149993896484,117.919998168945 124.339996337891,131.580001831055 104.540000915527,145.25 C106.300003051758,150.710006713867 108.129997253418,156.149993896484 109.970001220703,161.580001831055 C112.029998779297,161.130004882813 114.080001831055,160.679992675781 116.129997253418,160.240005493164 C119.220001220703,166.880004882813 122.230003356934,173.559997558594 125.23999786377,180.240005493164 C124.690002441406,180.220001220703 123.580001831055,180.190002441406 123.029998779297,180.169998168945 C114.559997558594,179.059997558594 105.790000915527,178.589996337891 97.4400024414063,180.710006713867 C94.6699981689453,181.470001220703 91.9100036621094,182.570007324219 89.8600006103516,184.649993896484 C79.1800003051758,174.789993286133 72.6399993896484,160.559997558594 72.3399963378906,146 C71.8600006103516,131.300003051758 77.6999969482422,116.559997558594 88.0699996948242,106.139999389648 M90.0899963378906,109.059997558594 C80.9400024414063,117.790000915527 75.2900009155273,130.229995727539 75.4300003051758,142.949996948242 C75.6100006103516,155.449996948242 80.2099990844727,167.699996948242 87.4899978637695,177.779998779297 C90.379997253418,176.729995727539 93.2799987792969,175.729995727539 96.1800003051758,174.75 C89.5999984741211,166.050003051758 84.5599975585938,155.919998168945 83.0899963378906,145.009994506836 C81.7799987792969,135.270004272461 83.9899978637695,124.889999389648 90.0899963378906,117.059997558594 C98.0400009155273,106.639999389648 109.720001220703,100.110000610352 121.220001220703,94.3399963378906 C119.5,93.9300003051758 117.709999084473,93.1900024414063 115.98999786377,94.0400009155273 C106.400001525879,97.0299987792969 97.3399963378906,102.059997558594 90.0899963378906,109.059997558594 Z M43.5299987792969,117.25 C46.560001373291,110.150001525879 49.5999984741211,103.040000915527 52.6199989318848,95.9400024414063 C58.1800003051758,103.970001220703 63.7999992370605,111.940002441406 69.3000030517578,120.01000213623 C67.2799987792969,124.940002441406 65.8300018310547,130.089996337891 65.0100021362305,135.360000610352 C57.8300018310547,129.350006103516 50.6699981689453,123.309997558594 43.5299987792969,117.25 Z M114.01000213623,148.389999389648 C133.880004882813,134.740005493164 153.690002441406,121.01000213623 173.529998779297,107.309997558594 C175.619995117188,117.459999084473 177.649993896484,127.620002746582 179.630004882813,137.789993286133 C158.139999389648,142.559997558594 136.690002441406,147.470001220703 115.209999084473,152.220001220703 C114.800003051758,150.940002441406 114.400001525879,149.669998168945 114.01000213623,148.389999389648 Z M43.1500015258789,144.440002441406 C43.6300010681152,137.460006713867 44.2099990844727,130.479995727539 44.7900009155273,123.51000213623 C51.4000015258789,128.479995727539 58.1199989318848,133.309997558594 64.6500015258789,138.389999389648 C64.2300033569336,143.270004272461 64.3000030517578,148.190002441406 64.9400024414063,153.050003051758 C57.689998626709,150.160003662109 50.4300003051758,147.270004272461 43.1500015258789,144.440002441406 Z M45.2599983215332,150.039993286133 C51.9599990844727,151.910003662109 58.7000007629395,153.619995117188 65.3499984741211,155.649993896484 C66.129997253418,159.850006103516 67.3199996948242,163.979995727539 68.879997253418,167.960006713867 C62.7799987792969,167.929992675781 56.6800003051758,167.899993896484 50.5699996948242,167.830001831055 C48.8499984741211,161.880004882813 47.0200004577637,155.970001220703 45.2599983215332,150.039993286133 Z M125.440002441406,161.210006713867 C130.029998779297,164.050003051758 133.050003051758,168.699996948242 137.470001220703,171.75 C144.039993286133,176.639999389648 151.330001831055,181.190002441406 155.600006103516,188.410003662109 C159.410003662109,194.860000610352 162.350006103516,201.800003051758 164.889999389648,208.839996337891 C161.880004882813,213.759994506836 157.380004882813,217.600006103516 151.960006713867,219.610000610352 C143.119995117188,200.149993896484 134.199996948242,180.710006713867 125.440002441406,161.210006713867 Z M52.9900016784668,171.949996948242 C58.5499992370605,171.229995727539 64.129997253418,170.589996337891 69.7099990844727,169.910003662109 C71.129997253418,173.600006103516 73.7600021362305,176.699996948242 75.0599975585938,180.429992675781 C71.1699981689453,181.880004882813 67.370002746582,183.539993286133 63.4900016784668,185 C60.0299987792969,180.619995117188 56.439998626709,176.339996337891 52.9900016784668,171.949996948242 Z
    214993062.zip
  19. Пост Rusland - сообщение в Перезапуск приложения под Windows был отмечен как ответ   
    Вот так

    uses Winapi.ShellAPI, Winapi.Windows;   procedure TForm1.Button1Click(Sender: TObject); var   FullProgPath: String; begin   FullProgPath:='C:\Temp\1.exe'; // полный путь к exe   ShellExecute(0, PChar('open'), PChar(FullProgPath), PChar(''), PChar(ExtractFilePath(FullProgPath)),     SW_SHOWNORMAL);   Application.Terminate; end;
  20. Пост Rusland - сообщение в Как включать/отключать звук и вибрацию? был отмечен как ответ   
    Народ, что с вами? Сколько уже вопросов без ответов... все самому приходится разбирать 
     
    Вот написал процедурку переключения режимов в Андроид, пользуйтесь на здоровье:

    uses   Androidapi.JNIBridge,       Androidapi.Helpers,         AndroidApi.JNI.Media,       Androidapi.JNI.GraphicsContentViewText,   Androidapi.JNI.App,         Androidapi.JNI.JavaTypes; procedure RingerMode(Mode:integer); var   AudioObj: JObject;   AudioMng: JAudioManager; begin                                       AudioObj:=SharedActivity.getSystemService(TJContext.JavaClass.AUDIO_SERVICE);   AudioMng:=TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID);     case Mode of     0: AudioMng.setRingerMode(TJAudioManager.JavaClass.RINGER_MODE_SILENT);     1: AudioMng.setRingerMode(TJAudioManager.JavaClass.RINGER_MODE_VIBRATE);     2: AudioMng.setRingerMode(TJAudioManager.JavaClass.RINGER_MODE_NORMAL);   else AudioMng.setRingerMode(TJAudioManager.JavaClass.RINGER_MODE_NORMAL);   end; end;
  21. Пост Rusland - сообщение в Rad Studio лаги был отмечен как ответ   
    Вот этот HotFix установить нужно после апдейта )
  22. Пост Rusland - сообщение в Странности Label был отмечен как ответ   
    Заменил все Label-ы на TText (AutoSize=false) и нет проблем.
  23. Пост Rusland - сообщение в Поиск в SearchBox был отмечен как ответ   
    В указанной вами теме как раз решение проблемы. FMX.SearchBox.pas скопировать к себе в проект не забыли? А лучше установите 10ую версию студии.
  24. Пост Rusland - сообщение в Обновление списков (TListBox, TListView), как в популярных приложения был отмечен как ответ   
    Почему при изменении в FormMouseMove значение Y прыгает? Чем ниже опускаешься, тем больше эти прыжки (аж до 10 пикселей). Например, сдвигаешь на 1 пиксель вниз (пока тестирую на windows), а Y уменьшается на 10. Сдвигаешь еще на 1пикс вниз, Y возвращается к нормальному значению.
    PS. Еще есть какая-то зависимость от количество элементов в listbox-e. Чем больше элементов, тем больше "прыжки".
     
    PPS. после обработки напильником нормально работает 
    http://fire-monkey.ru/topic/2023-pullrefresh/#entry10918
  25. Пост Rusland - сообщение в Регулярные выражения был отмечен как ответ   
    Проверил. Нормально работает
×
×
  • Создать...