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

x11

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

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

  • Посещение

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

    13

Активность репутации

  1. Thanks
    x11 получил реакцию от Brovin Yaroslav в BroadcastReceiver.OnReceive срабазывает 2 раза   
    http://blog.mmarvick.com/blog/lollipop-multiple-broadcastreceiver-call-state/
    это проблема андроида

  2. Thanks
    x11 получил реакцию от Alex7wrt в Новые требования на Google Play   
    здесь http://fire-monkey.ru/topic/4786-несколько-sdk-в-приложении/
    обсудили, вывод: нужно самому ручками указывать в файле шаблона AndroidManifest.template.xml
  3. Like
    x11 получил реакцию от #WAMACO в Новые требования на Google Play   
    здесь http://fire-monkey.ru/topic/4786-несколько-sdk-в-приложении/
    обсудили, вывод: нужно самому ручками указывать в файле шаблона AndroidManifest.template.xml
  4. Thanks
    x11 получил реакцию от mazayhin в BroadcastReceiver.OnReceive срабазывает 2 раза   
    http://blog.mmarvick.com/blog/lollipop-multiple-broadcastreceiver-call-state/
    это проблема андроида

  5. Like
    x11 получил реакцию от #WAMACO в Поиск контакта по номеру   
    function TContactsManager.GetContactByNumber( const aPhoneNumber: string): string; var wUri: JNet_URI; wCursor: JCursor; wfilter, wJQueryParams: TJavaObjectArray<JString>; begin Result := ''; wUri := TJNet_URI.JavaClass.withAppendedPath ( TJContactsContract_PhoneLookup.JavaClass.CONTENT_FILTER_URI, StringToJString(aPhoneNumber) ); wfilter := TJavaObjectArray<JString>.Create(2); wfilter[0] := StringToJString('lookup'); wfilter[1] := StringToJString('display_name'); with SharedActivity.getContentResolver do wCursor := query(wUri, wfilter, nil, nil, nil); try if Assigned(wCursor) and (wCursor.getCount > 0) then begin wCursor.moveToNext; Result := JStringToString(wCursor.getString( wCursor.getColumnIndex(StringToJString('display_name')))); end; finally wCursor.Close; wCursor := nil; end; end; http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1183758&msg=21183983
  6. Like
    x11 получил реакцию от Ingalime в Поиск контакта по номеру   
    function TContactsManager.GetContactByNumber( const aPhoneNumber: string): string; var wUri: JNet_URI; wCursor: JCursor; wfilter, wJQueryParams: TJavaObjectArray<JString>; begin Result := ''; wUri := TJNet_URI.JavaClass.withAppendedPath ( TJContactsContract_PhoneLookup.JavaClass.CONTENT_FILTER_URI, StringToJString(aPhoneNumber) ); wfilter := TJavaObjectArray<JString>.Create(2); wfilter[0] := StringToJString('lookup'); wfilter[1] := StringToJString('display_name'); with SharedActivity.getContentResolver do wCursor := query(wUri, wfilter, nil, nil, nil); try if Assigned(wCursor) and (wCursor.getCount > 0) then begin wCursor.moveToNext; Result := JStringToString(wCursor.getString( wCursor.getColumnIndex(StringToJString('display_name')))); end; finally wCursor.Close; wCursor := nil; end; end; http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1183758&msg=21183983
  7. Thanks
    x11 отреагировална mazayhin в Как правильно запускать программу из Delphi на Android?   
    Где физически на устройстве находится файл нам знать и не надо, а для работы со своей и общими папками никакой root не нужен.
    Опять же, не должно ничто само обновляться и перезаписываться из apk на устройстве!
    В функции CopyAssetToFile даже специально комментарий оставлен в месте, где идет проверка наличия файла на устройстве.
    х11, делайте обновление своей базы в коде, при запуске, а не перезаписывайте ее пустой (прямо представил, как при обновлении того же вайбера затирается вся переписка, прямо прелесть)
  8. Like
    x11 отреагировална Равиль Зарипов (ZuBy) в Failure retrieving resources   
    Holo это 4+, но ниже 4.4
  9. Sad
    x11 отреагировална Равиль Зарипов (ZuBy) в Failure retrieving resources   
    не парьтесь, скорее всего это связано с ресурсом из темы.
    но fmx морально устарел, он использует тему android holo
  10. Sad
    x11 отреагировална Равиль Зарипов (ZuBy) в Использование нативных LocalBroadcastManager и BroadcastReceiver   
    емба сломала это еще в Берлине, в Токио не починили.
    Службы "нормально" работают только в Сиетле
  11. Thanks
    x11 отреагировална mazayhin в Как правильно запускать программу из Delphi на Android?   
    На устройство попадает все, что указано в deployment. Но, при развертывании новой версии приложения, без разницы, через adb или маркет, эти файли не перезаписываются, только разворачиваются новые. Что вполне логично и являеися нормальным поведением системы. 
    Винда даст запустить сколько угодно копий приложения, если это руками не ограничить. Из студии тоже получится, если не пересобирать заново.
    Если нужно обновить имеющиеся ресурсы, смотрите в сторону System. StartupCopy, он за это отвечает, ну или используйте AssetManager.
    Так же приложение можно не удалять полностью, а в настройках "стереть данные" перед запуском
    Но для работы с БД, лучше сразу продумать логику ее обновления в коде. Если данные в базе не важны для пользователя, то возможно, лучшим вариантом будет создавать БД программно. Если данные нужны, проверять версию БД и в коде ее обновлять. Откуда брать обновление-вам решать, или с сервера, или из ресурсов, или из assets выдергивать.
  12. Thanks
    x11 отреагировална mazayhin в Как правильно запускать программу из Delphi на Android?   
    Ну правильно, если студия хочет при запуске открыть на чтение, то не запустится. Если не пересобирать (build) то все запустится.
    Библиотеки самого приложения и сервисов, если есть, перезапишутся точно. Иначе тогда не получалось бы делать обновление. На счет подключенных, сейчас не скажу, у нас в проектах используются сторонние so, надо будет посмотреть.
    Если в настройках сделать сброс, то развернутые из ассетов фалы удалятся, и при следующем запуске приложения, развернутся вновь. Так же потрет все, что приложение разместило по пути TPath.GetDocumentsPath.
    Если сделать сброс, то удалятся как раз те 2,07 мб, которые записал мне убер
     
     

  13. Thanks
    x11 отреагировална Brovin Yaroslav в Приведение типа - as   
    Если посмотреть, что вызывается под капотом для случая с интерфейсами, то можно увидеть:
    1. Для вызова Interface1(Instance), вызывает системный метод _IntfCopy, который по сути не проверяет типы, а просто увеличивает счетчик типов. Такое приведение типов не проверяет типы, а просто копирует указатель а реализацию.
    procedure _IntfCopy(var Dest: IInterface; const Source: IInterface); {$IFDEF PUREPASCAL} var P: Pointer; begin P := Pointer(Dest); if Source <> nil then Source._AddRef; Pointer(Dest) := Pointer(Source); if P <> nil then IInterface(P)._Release; end; {$ELSE} 2. При использовании оператора as будет вызван _IntfCast, который выполняет честное приведение типов через QueryInterface. Поэтому в этом случае вы получите на выходе честный указатель на таблицу интерфейса, если интерфейс поддерживается объектом.
    procedure _IntfCast(var Dest: IInterface; const Source: IInterface; const IID: TGUID); {$IF defined(PUREPASCAL) or defined(PIC)} // PIC: EBX must be correct before calling QueryInterface var Temp: Pointer; begin if Source = nil then Dest := nil else begin Temp := nil; if Source.QueryInterface(IID, IInterface(Temp)) <> 0 then ErrorAt(byte(reIntfCastError), ReturnAddress) else begin if Assigned(Dest) then Dest._Release; Pointer(Dest) := Temp; end; end; end;  
  14. Like
    x11 получил реакцию от Kitty в Удаленное подключение к базе данных с помощью мобильного приложения   
    Для подключения к Firebird нужна клиентская библиотека.
    Взять можно здесь https://firebirdsql.org/en/firebird-3-0/
    в папке \lib
  15. Thanks
    x11 отреагировална Alex7wrt в Новые требования на Google Play   
    Здесь речь идёт о значении targetSDK в файле манифеста. Этот параметр влияет на то,  использует ли приложение новые функции последних версий SDK. То есть какие SDK приложение гарантированно поддерживает. Но если сейчас этому параметру разработчик может в принципе придавать любые значения, то со второй половины этого года Google вводит правило, что он должен быть не ниже предпоследней версии. То есть если сейчас последняя версия равна 27, значит этот параметр должен быть с августа не ниже 26 для новых приложений, а с ноября для обновлений. В дальнейшем раз в год по мере выхода новых версий Android нужно повышать это значение на 1. Так Google побуждает разработчиков использовать функции новых версий SDK.
    Чтобы соответствовать этим требованиям, нужно обновлять значение параметра TargetSDK в файле манифеста, и все будет норм.
  16. Thanks
    x11 отреагировална Andrey Efimov в DisposeOf или Free?   
    Жизненный цикл объектов в Delphi. Часть 1. Windows, OSX. Что же использовать Destroy, Free, FreeAndNil или DisposeOf? Жизненный цикл объектов в Delphi. Часть 2. Android, iOS. Что же использовать Destroy, Free, FreeAndNil или DisposeOf?
  17. Like
    x11 получил реакцию от Kitty в Перехват события звонка   
    1. Там нужно заменить Activity на Context везде. И тогда можно использовать в сервисах.
    2. В NextGen нельзя использовать Destoy напрямую, поэтому код destructor TCSBroadcastReceiver.Destroy; нужно убрать, а вместо этого сделать отдельную процедуру для UnregisterReceiver.
     
  18. Thanks
    x11 отреагировална ENERGY в [Статья]Как создать простой Android Broadcast Receiver. How to implement simplest Android Broadcast Receiver in Delphi   
    Мой вариант Broadcast Receiver, на мой взгляд наиболее оптимизирован и удачен. По сравнению с известным кодом от barisatalay .
    Отличия -
    исправлена утечка,
    чуть быстрее работает, за счет того что создается один фильтр в него добавляется несколько Actions  и одна регистрация на него, 
    нет лишних конвертирований с Jstring to string и обратно,
    адаптирован под Delphi 10 (JFMXBroadcastReceiver) ,
    упрощена работа с классом (не нужно помнить о регистрации и вызывать ее заранее) ,
    и самое главное - может получать getResultCode текущего ресивера (к примеру он нужен при получении статуса смс сообщения и в других случаях.). 
    unit BroadcastReceiver; interface {$IFDEF ANDROID} uses   Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText, Androidapi.helpers,   Androidapi.JNIBridge, FMX.Helpers.Android, Androidapi.JNI.JavaTypes,   System.Classes, System.SysUtils; type   TBroadcastReceiver = class;   TListener = class(TJavaLocal, JFMXBroadcastReceiverListener)   private     fOwner: TBroadcastReceiver;     fReceiver: JFMXBroadcastReceiver;   public     constructor Create(aOwner: TBroadcastReceiver);     destructor Destroy; override;     procedure onReceive(context: JContext; intent: JIntent); cdecl;   end;   TOnReceive = procedure (aContext: JContext; aIntent: JIntent; aResultCode: integer) of object;   TBroadcastReceiver = class   private     fListener : TListener;     fRegistered: boolean;     fOnReceive: TOnReceive;   public     constructor Create(aOnReceiveProc: TOnReceive);     destructor Destroy; override;     procedure AddActions(const Args: array of JString);     procedure SendBroadcast(const aValue: string);   end; {$ENDIF} implementation {$IFDEF ANDROID} { TBroadcastReceiver } constructor TBroadcastReceiver.Create(aOnReceiveProc: TOnReceive); begin   inherited Create;   fListener := TListener.Create(Self);   fOnReceive := aOnReceiveProc; end; destructor TBroadcastReceiver.Destroy; begin   fListener.Free;   inherited; end; procedure TBroadcastReceiver.AddActions(const Args: array of JString); var   vFilter: JIntentFilter;   i: Integer; begin   if fRegistered then     TAndroidHelper.context.getApplicationContext.UnregisterReceiver(fListener.fReceiver);   vFilter := TJIntentFilter.JavaClass.init;   for i := 0 to High(Args) do     vFilter.addAction(Args[i]);   TAndroidHelper.context.getApplicationContext.registerReceiver(fListener.fReceiver, vFilter);   fRegistered := true; end; procedure TBroadcastReceiver.SendBroadcast(const aValue: string); var   Inx: JIntent; begin   Inx := TJIntent.Create;   Inx.setAction(StringToJString(aValue));   TAndroidHelper.Context.sendBroadcast(Inx); end; constructor TListener.Create(aOwner: TBroadcastReceiver); begin   inherited Create;   fOwner := aOwner;   fReceiver := TJFMXBroadcastReceiver.JavaClass.init(Self); end; destructor TListener.Destroy; begin   TAndroidHelper.context.getApplicationContext.unregisterReceiver(fReceiver);   inherited; end; // usually android call it from "UI thread" - it's not main Delphi thread procedure TListener.onReceive(context: JContext; intent: JIntent); begin   if Assigned(fOwner.fOnReceive) then     fOwner.fOnReceive(Context, Intent, fReceiver.getResultCode); end; {$ENDIF} end.  
    Как использовать
     
      // указывать нужно сразу все нужные вам Actions в Add через запятую, не по одной. fBroadcast := TBroadcastReceiver.Create(OnReceiveBroadcast);   fBroadcast.AddActions([StringToJString(SENT_ACTION)]); << Custom action ------------- // или например сразу несколько Actions fBroadcast.AddActions([TJIntent.JavaClass.ACTION_SCREEN_OFF, TJIntent.JavaClass.ACTION_SCREEN_ON]);  
  19. Like
    x11 получил реакцию от Ingalime в Служба + перехват номера   
    На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.
    http://fire-monkey.ru/topic/3878-статьякак-создать-простой-android-broadcast-receiver-how-to-implement-simplest-android-broadcast-receiver-in-delphi/
    http://fire-monkey.ru/topic/2386-перехват-события-звонка/
    http://fire-monkey.ru/topic/2972-использование-нативных-localbroadcastmanager-и-broadcastreceiver/
    Покритикуйте пожалуйста. Уверен, что не всё правильно.
    Но что до ума не удалось довести, так это то, как правильно останавливать службу и закрывать приложение.
    Проект (для Токио) приложил теме.
    Заранее благодарен.
     
    BR2.rar
  20. Thanks
    x11 отреагировална Pax Beach в Использование нативных LocalBroadcastManager и BroadcastReceiver   
    StartCommand вызывается каждый раз, когда мы вызываем из приложения StartService.
    А как обрабатывать намерение (Intent) переданный в этот метод — это наше дело.
    У меня в этой команде обрабатывался и старт и стоп.
    Убивать приложение через KillBackgroundProcess не обязательно, это осталось от моего другого приложения, где выгрузить процесс из памяти было критичным.
     
  21. Like
    x11 получил реакцию от Kitty в [Статья]Как создать простой Android Broadcast Receiver. How to implement simplest Android Broadcast Receiver in Delphi   
    Вот, что у меня получилось http://fire-monkey.ru/topic/4723-служба-перехват-номера/
    Покритикуйте, пожалуйста.
     
  22. Like
    x11 получил реакцию от Brovin Yaroslav в Служба + перехват номера   
    На основе нескольких тем форума сделал службу перехвата звонков и номера телефона.
    http://fire-monkey.ru/topic/3878-статьякак-создать-простой-android-broadcast-receiver-how-to-implement-simplest-android-broadcast-receiver-in-delphi/
    http://fire-monkey.ru/topic/2386-перехват-события-звонка/
    http://fire-monkey.ru/topic/2972-использование-нативных-localbroadcastmanager-и-broadcastreceiver/
    Покритикуйте пожалуйста. Уверен, что не всё правильно.
    Но что до ума не удалось довести, так это то, как правильно останавливать службу и закрывать приложение.
    Проект (для Токио) приложил теме.
    Заранее благодарен.
     
    BR2.rar
  23. Thanks
    x11 отреагировална Rusland в Перехват события звонка   
    Вот пример, из которого вы можете видеть как перехватывать звонки (добавьте на форму Memo)
     
    uses CSBroadcastReceiver, Androidapi.JNI.JavaTypes.Own, Androidapi.Jni, AndroidApi.JNI.GraphicsContentViewText, Androidapi.Jni.JavaTypes, Androidapi.JNI.Os, Androidapi.JNIBridge, Androidapi.JNI.Telephony, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.StdCtrls; private { Private declarations } procedure CreateBroadcastReceiver; procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); procedure CheckPhoneCallState(Context: JContext; Intent: JIntent); procedure CheckSmsInState(Context: JContext; Intent: JIntent); function KillCall(Context: JContext): Boolean; public { Public declarations } end; var Form1: TForm1; BroadcastReceiver: TCSBroadcastReceiver; implementation uses Androidapi.Jni.App, Androidapi.Helpers, Androidapi.Log; procedure TForm1.CreateBroadcastReceiver; begin if not Assigned(BroadcastReceiver) then begin BroadcastReceiver:= TCSBroadcastReceiver.Create(nil); BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive; BroadcastReceiver.RegisterReceive; BroadcastReceiver.Add('android.intent.action.PHONE_STATE'); BroadcastReceiver.Add('android.intent.action.NEW_OUTGOING_CALL'); end; end; procedure TForm1.CheckPhoneCallState(Context: JContext; Intent: JIntent); var telephonyService: JObject; telephonyManager: JTelephonyManager; state: JString; incomingCallNumber: string; outgoingCallNumber: string; outputResult: string; begin outputResult:= #13#10; telephonyService := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE); telephonyManager := TJTelephonyManager.Wrap((telephonyService as ILocalObject).GetObjectID); if JStringToString(Intent.getAction).Equals('android.intent.action.PHONE_STATE') then begin state:= Intent.getStringExtra(TJTelephonyManager.JavaClass.EXTRA_STATE); if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_IDLE) then outputResult:= outputResult + 'Phone is IDLE ' + #13#10 else if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_RINGING) then begin incomingCallNumber:= JStringToString(Intent.getStringExtra(TJTelephonyManager.JavaClass.EXTRA_INCOMING_NUMBER)); if incomingCallNumber.Equals('') then incomingCallNumber:= 'PRIVATE NUMBER'; outputResult:= outputResult + 'Phone is RINGING' + #13#10; outputResult:= outputResult + 'Incoming call from ' + incomingCallNumber + #13#10; if incomingCallNumber = '+79391234567' then /// телефон в черном списке // тут отбиваем звонок end else if state.equals(TJTelephonyManager.JavaClass.EXTRA_STATE_OFFHOOK) then outputResult:= outputResult + 'Phone is OFFHOOK' + #13#10; end else if JStringToString(Intent.getAction).Equals('android.intent.action.NEW_OUTGOING_CALL') then begin outgoingCallNumber:= JStringToString(Intent.getStringExtra(TJIntent.JavaClass.EXTRA_PHONE_NUMBER)); outputResult:= outputResult + 'Outgoing call to ' + outgoingCallNumber + #13#10; if outgoingCallNumber = '+79051234567' then /// телефон в черном списке begin BroadcastReceiver.SetResultData(nil); outputResult:= outputResult + 'Call is not allowed to ' + outgoingCallNumber + #13#10; end; end; Memo1.Lines.Append(outputResult); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if Assigned(BroadcastReceiver) then BroadcastReceiver.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin CreateBroadcastReceiver; end; Отправить на PHP сервер можно, например, через Indy компоненты.
  24. Like
    x11 отреагировална Pax Beach в Использование нативных LocalBroadcastManager и BroadcastReceiver   
    Из PlatformSDK (PlatformSDKs\android-sdk-windows\sources\android-23\android\support\v4\content\) портировал в Delphi класс TJLocalBroadcastManager.
    Это очень полезный класс, если вы не хотите рассылать сообщения по всей системе, а есть необходимость общаться только внутри приложения или между хост-приложением и сервисом.
    Во вложении сам класс, в своем приложении убедитесь, что в Target Platforms (Android) → Android → Libraries включена библиотека android-support-v4.dex.jar.
     
    Прилагаю пример, для изучения и использования в работе, который демонстрирует работу обычного BroadcastReceiver и LocalBroadcastReceiver.
    В примере демонстрируется работа сообщений в приложении и сервисе. Сначала делаем build проекта LBCRService, потом будет доступна возможность собрать LocalBCR.
    Собираю в Berlin 10.1, но на младших версиях тоже должно работать, по крайней мере в Seatlle.
     
    В реализации методов
    procedure RegisterReceiver(); procedure UnRegisterReceiver(); необходимо снять комментарий с соответствующих строчек, в зависимости от того, какой тип ресивера вы хотите использовать.
     
     
    Androidapi.JNI.LocalBroadcastManager.pas.zip
    LocalBroadCastReceiver.zip
  25. Thanks
    x11 отреагировална Равиль Зарипов (ZuBy) в Сервис + доступ к звонкам   
    в сервисе не работает NotificationCenter, TPlatformServices
    и все что есть в модулях начинающихся на FMX.****
×
×
  • Создать...