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

Лидеры

  1. master webs

    master webs

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


    • Баллы

      8

    • Постов

      216


  2. Andrey Efimov

    Andrey Efimov

    Модераторы


    • Баллы

      4

    • Постов

      842


  3. Rusland

    Rusland

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


    • Баллы

      2

    • Постов

      1 204


  4. rareMax

    rareMax

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


    • Баллы

      1

    • Постов

      553


Популярный контент

Показан контент с высокой репутацией 19.06.2016 во всех областях

  1. master webs

    IOS Push GCM/firebase

    Добавил описание в первый топик прошу не судить строго нет таланта писать статьи )) лишь попытался объяснить немного принцип работы и выложил рабочий пример
    3 балла
  2. Попробуйте прописать сервисы в лоб. Открываем файл AndroidManifest.template.xml в проекте (не в сервисе) находим <%services%> заменяем на <service android:exported="false" android:name="com.embarcadero.services.MyService" android:label="MyService" /> Полностью пересобираем проект. p.s. У меня получилось так, лейбел прописался во всех манифестах.
    3 балла
  3. после пары литров пива FCM сдался завтра постараюсь написать подробный мануал ))
    2 балла
  4. unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 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; type TForm1 = class(TForm) Memo1: TMemo; Label1: TLabel; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } procedure CreateBroadcastReceiver; procedure BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); procedure CheckSmsInState(Context: JContext; Intent: JIntent); public { Public declarations } end; var Form1: TForm1; BroadcastReceiver: TCSBroadcastReceiver; implementation uses Androidapi.Jni.App, Androidapi.Helpers, Androidapi.Log; {$R *.fmx} 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'); BroadcastReceiver.Add('android.provider.Telephony.SMS_RECEIVED'); end; 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; procedure TForm1.BroadcastReceiverOnReceive(csContext: JContext; csIntent: JIntent); begin //CheckPhoneCallState(csContext, csIntent); CheckSmsInState(csContext, csIntent); // тут поставил брейкпоинт end; procedure TForm1.CheckSmsInState(Context: JContext; Intent: JIntent); var obj: JObject; I: Integer; msg : JSmsMessage; pdus : TJavaArray<JObject>; newPhoneNumber, text : string; begin if SameText(JStringToString(Intent.getAction), 'android.provider.Telephony.SMS_RECEIVED') then begin Memo1.Lines.Add('SMS Received'); end; end; end. Переделал чуть программу, которая отбивала входящие звонки. Тут как раз используется CSBroadcastReceiver.pas unit CSBroadcastReceiver; interface uses System.Classes ,System.SysUtils {$IFDEF ANDROID} ,Androidapi.JNI.Embarcadero ,Androidapi.JNI.GraphicsContentViewText ,Androidapi.Helpers ,Androidapi.JNIBridge ,Androidapi.JNI.JavaTypes ,Androidapi.JNI.App {$ENDIF} ; type {$IFNDEF ANDROID} JIntent = class end; JContext = class end; {$ENDIF} TCSBroadcastReceiver= class; TOnReceive = procedure (csContext: JContext; csIntent: JIntent) of object; {$IFDEF ANDROID} TCSListener = class(TJavaLocal, JFMXBroadcastReceiverListener) private FOwner: TCSBroadcastReceiver; public constructor Create(AOwner: TCSBroadcastReceiver); procedure OnReceive(csContext: JContext; csIntent: JIntent); cdecl; end; {$ENDIF} TCSBroadcastReceiver = class(TComponent) private {$IFDEF ANDROID} FReceiver: JBroadcastReceiver; FListener : TCSListener; {$ENDIF} FOnReceive: TOnReceive; FItems: TStringList; function GetItem(const csIndex: Integer): String; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure SendBroadcast(csValue: String); procedure Add(csValue: String); procedure Delete(csIndex: Integer); procedure Clear; procedure setResultData(data: JString); function Remove(const csValue: String): Integer; function First: String; function Last: String; function HasPermission(const csPermission: string): Boolean; procedure RegisterReceive; property Item[const csIndex: Integer]: string read GetItem; default; property Items: TStringList read FItems write FItems; published property OnReceive: TOnReceive read FOnReceive write FOnReceive; end; procedure Register; implementation procedure Register; begin RegisterComponents('Classicsoft', [TCSBroadcastReceiver]); end; { TCSBroadcastReceiver } procedure TCSBroadcastReceiver.setResultData(data: Jstring); begin FReceiver.setResultData(data); end; procedure TCSBroadcastReceiver.Add(csValue: String); {$IFDEF ANDROID} var Filter: JIntentFilter; {$ENDIF} begin {$IFDEF ANDROID} if (FListener = nil) or (FReceiver = nil) then begin Raise Exception.Create('First use RegisterReceive!'); Exit; end; {$ENDIF} if FItems <> nil then if FItems.IndexOf(csValue) = -1 then begin {$IFDEF ANDROID} filter := TJIntentFilter.Create; filter.addAction(StringToJString(csValue)); TAndroidHelper.Context.registerReceiver(FReceiver, filter); {$ENDIF} FItems.Add(csValue); end; end; procedure TCSBroadcastReceiver.Clear; begin FItems.Clear; end; constructor TCSBroadcastReceiver.Create(AOwner: TComponent); begin inherited; FItems := TStringList.Create; end; procedure TCSBroadcastReceiver.Delete(csIndex: Integer); begin if FItems <> nil then begin FItems.Delete(csIndex); {$IFDEF ANDROID} TAndroidHelper.Activity.UnregisterReceiver(FReceiver); RegisterReceive; {$ENDIF} end; end; destructor TCSBroadcastReceiver.Destroy; begin FItems.Free; {$IFDEF ANDROID} if FReceiver <> nil then TAndroidHelper.Activity.UnregisterReceiver(FReceiver); {$ENDIF} inherited; end; function TCSBroadcastReceiver.First: String; begin Result := FItems[0]; end; function TCSBroadcastReceiver.GetItem(const csIndex: Integer): String; begin Result := FItems[csIndex]; end; function TCSBroadcastReceiver.HasPermission(const csPermission: string): Boolean; {$IFDEF ANDROID} begin Result := TAndroidHelper.Activity.checkCallingOrSelfPermission(StringToJString(csPermission)) = TJPackageManager.JavaClass.PERMISSION_GRANTED; {$ELSE} begin Result := False; {$ENDIF} end; function TCSBroadcastReceiver.Last: String; begin Result := FItems[FItems.Count]; end; procedure TCSBroadcastReceiver.RegisterReceive; {$IFDEF ANDROID} var I: Integer; begin if FListener = nil then FListener := TCSListener.Create(Self); if FReceiver = nil then FReceiver := TJFMXBroadcastReceiver.JavaClass.init(FListener); if FItems <> nil then if FItems.Count > 0 then for I := 0 to FItems.Count -1 do Add(FItems[I]); {$ELSE} begin {$ENDIF} end; function TCSBroadcastReceiver.Remove(const csValue: String): Integer; begin Result := FItems.IndexOf(csValue); if Result > -1 then FItems.Delete(Result); end; procedure TCSBroadcastReceiver.SendBroadcast(csValue: String); {$IFDEF ANDROID} var Inx: JIntent; begin Inx := TJIntent.Create; Inx.setAction(StringToJString(csValue)); TAndroidHelper.Context.sendBroadcast(Inx); {$ELSE} begin {$ENDIF} end; {$IFDEF ANDROID} constructor TCSListener.Create(AOwner: TCSBroadcastReceiver); begin inherited Create; FOwner := AOwner; end; procedure TCSListener.OnReceive(csContext: JContext; csIntent: JIntent); begin if Assigned(FOwner.OnReceive) then FOwner.onReceive(csContext, csIntent); end; {$ENDIF} end. Так вот со звонками работает отлично, а при входящих SMS тишина. Есть идеи? Просто надо было разрешить в USER PERMISSION добавить Receive SMS (у меня стояла только галочка READ SMS). Код рабочий - в момент прихода SMS можно вызывать FetchSMS. Но если кто-нибудь сможет привести в чувство код от Remy Lebeau, при котором при получении сразу же будет читаться пришедшая СМС, будет еще лучше.
    2 балла
  5. Ссылка: http://delphifmandroid.blogspot.ru/2016/06/google-play.html Автор: Андрей Ефимов Описание: В этой заметке я ответил на два самых частых вопроса: Как сделать, чтобы сертификат выбирался автоматически? Как выбрать сертификат по умолчанию? Как обновлять приложение в маркете?
    1 балл
  6. master webs

    IOS Push GCM/firebase

    P.S.// приложение никаких изменений не потерпело код рабочий и проверенный на версиях 10/10,1 berlin http://alexbirukov.ru/?go=all/php-server-dlya-rassylki-push-na-android-i-ios/ исходники на github https://github.com/master-webs/ios-push-FCM-delphi в серверной части изменил регистрацию устройства в нашей базе . GCM практически ни чем не отличается от FCM как описал гугл в FCM больше возможностей и он рекомендует перейти на его использование. Приложения Delphi 10/10.1 Android также успешно проходят регистрацию через поставщиков услуг (GCM) и на сколько я понял гугл совместимость не будет прикрывать для работоспособности приложений которые уже не обновляют в плеймаркете. Интерфейс на мой взгляд стал намного проще и удобнее с консоли можно спокойно отправлять групповые и адресные оповещения. Что касается возможности отправки оповещений на IOS устройства. Доступно много примеров и библиотек практически для каждой среды разработки кроме (продуктов embarcadero) покопавшись в документации нашол статью которая дала понять как переригестрировать токены ios и получить токен FCM. сделал следующе ios получивший токен спешит зарегистрировать девайс на вашем сервере скрипт перехватывает и делает регистрацию на серверах гугла и новый токен мы также записываем в свою базу в архиве прикрепляю серверную часть php сделана она чисто для тестирования и я не рекомендую использовать как рабочий вариант хотя до рабочего варианта там допилить совсем не много. Ниже прикрепляю скрины лк FCM push.zip
    1 балл
  7. asviridenkov

    Microsoft docx

    HTML Editor Library умеет, но дорого.
    1 балл
  8. Найдено решение. Может кому-то пригодится. Вот тут представлены четыре разных алгоритма размытия http://blog.ivank.net/fastest-gaussian-blur.html Работает быстро и утечки теперь не наблюдается, то что и надо было сделать)) Так что всем спасибо! Пользуйтесь! ;-)
    1 балл
  9. master webs

    IOS Push GCM/firebase

    нашел такую документацию на гугле https://developers.google.com/instance-id/reference/server#create_registration_tokens_for_apns_tokens по сути перерегистрация токенов ios для GCM буду экспериментировать получать токен уже через свой сервер может прокатит такая обманка как временное решение о результатах отпишу опять тупик перерегистрация идет получаю токен для ios отправка тоже успешна но они не доходят
    1 балл
  10. master webs

    IOS Push GCM/firebase

    на сколько я понял загвоздка лиш в одном как записать токен ios в базу GCM В console.firebase.google.com я добавил приложение на ios там-же загрузил сертификат для отправки оповещений в замен появился файл с кучей всяких ключей полсе получения токена так понимаю его нужно обязательно обозначить console.firebase.google.com иначе получаю ошибку отправки при етом скрипт на пхп отлично шлет все на прямую
    1 балл
  11. Равиль Зарипов (ZuBy)

    IOS Push GCM/firebase

    По сути, сервису не нужно знать о токенах ios девайсов. Ведь токен должен быть где-то записан, чтобы его можно было передать в FCM. Но там структуры вроде для платформ разные. Так вскольз смотрел
    1 балл
  12. От эмбр: http://community.embarcadero.com/blogs?view=entry&id=8542 procedure TVariableHeight.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem); var Drawable: TListItemText; SizeImg: TListItemImage; Text: string; AvailableWidth: Single; begin SizeImg := TListItemImage(AItem.View.FindDrawable('imgSize')); AvailableWidth := TListView(Sender).Width - TListView(Sender).ItemSpaces.Left - TListView(Sender).ItemSpaces.Right - SizeImg.Width; // Find the text drawable which is used to calcualte item size. // For dynamic appearance, use item name. // For classic appearances use TListViewItem.TObjectNames.Text // Drawable := TListItemText(AItem.View.FindDrawable(TListViewItem.TObjectNames.Text)); Drawable := TListItemText(AItem.View.FindDrawable('txtMain')); Text := Drawable.Text; // Randomize the font when updating for the first time if Drawable.TagFloat = 0 then begin Drawable.Font.Size := 1; // Ensure that default font sizes do not play against us Drawable.Font.Size := 10 + Random(4) * 4; Drawable.TagFloat := Drawable.Font.Size; if Text.Length < 100 then Drawable.Font.Style := [TFontStyle.fsBold]; end; // Calculate item height based on text in the drawable AItem.Height := GetTextHeight(Drawable, AvailableWidth, Text); Drawable.Height := AItem.Height; Drawable.Width := AvailableWidth; SizeImg.OwnsBitmap := False; SizeImg.Bitmap := GetDimensionBitmap(SizeImg.Width, AItem.Height); end;
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...