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

Rusland

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

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

  • Посещение

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

    26

Весь контент Rusland

  1. 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. petyaas, в этой теме есть видео по которому можно создать приложение с сервисом.
  3. Тут есть код как найти и удалить SMS из Входящих На строке SharedActivity.getContentResolver.delete(uri_del, StringToJString('_ID=' + smsid), nil); программа СМС удаляет, но зависает. В чем ошибка?
  4. До выполнения далеко, тут не компилируется еще. Номер версии JDK виден в ошибке - 1.8.0_45Не в JDK дело. Можете попробовать у себя отбилдить сервис (в первом сообщении исходники)? Уверен у вас будет та же ошибка. Перезапускал. Delphi 10 Seattle
  5. Есть вот такая процедура (взял со stackoverflow), которая позволяет просматривать все СМС во Входящих: но ее приходится вызывать в цикле, что не есть хорошо. Как бы ее связать с BroadcastReceiver? Есть готовый код? PS. форум глючит или мой браузер?
  6. MAD_EVAL, я читал про этот готовый компонент, но сам автор признается что не знает как получать через него SMS... Может кто разъяснит? Сегодня только читал я это (не стоит думать что я задаю вопросы предварительно не прошерстив интернет)... в ответе Remy Lebeau дает код, который ни разу не компилируется... да он и сам признается что untested Кто-нибудь может разобрать/допилить его код?
  7. В этом видео (в 16:40) человек (хоть он и создает там IntentRemoteService) говорит что это баг и нужно просто исправить файл *.template.java - заменить libraryName на baseLibraryName. Заменил, но мне это не помогло.
  8. Создал пустой проект. К нему стал создавать IntentLocalService. Делаю Build сервиса и получаю ошибку ява. [Exec Error] The command ""C:\Program Files\Java\jdk1.8.0_45\bin\javac" -d javaclasses -Xlint:deprecation -classpath "C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\platforms\android-22\android.jar";"c:\program files (x86)\embarcadero\studio\17.0\lib\Android\Debug\fmx.jar" -bootclasspath "C:\Users\Public\Documents\Embarcadero\Studio\17.0\PlatformSDKs\android-sdk-windows\platforms\android-22\android.jar" -encoding UTF-8 -target 1.6 -g -source 1.6 .\Android\Debug\TestService.java .\Android\Debug\TestServiceProxyInterface.java" exited with code 1.Как побороть?TestService.zip
  9. MAD_EVAL, спасибо что ответили, но я там вижу JAVA, а мне бы на паскале Транслировать я не могу )
  10. Во-первых, сам компонент здесь ни при чем. Во-вторых, ограничение 1000 бесплатных запросов (а не сессий) в день касается Google Places API for Android, а не самого Google Maps Android API Пруфлинк https://developers.google.com/maps/pricing-and-plans/?hl=ru
  11. masmat, что за ограничение значит 1000 сессий? О чем вы? Речь про сам компонент или про ограничения сервиса Google Maps?
  12. Как отслеживать приход SMS? Где-то краем глаза видел что нужно прослушивать BroadcastReceiver... Если это так то как сделать его прослушку?
  13. Как программно отключить звук и вибрацию? Как перевести телефон в режим Без звука / Вибрация / Со звуком?
  14. В статье Андрея Ефимова показано как найти SMS. А как можно удалить СМС-ку из входящих?
  15. ZuBy, спасибо. Это как раз метод отправки через стандартное приложение. Вот нашел метод отправки напрямую из программы: uses Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony, Androidapi.Helpers; ... procedure TFrmMain.BtnSendSmsClick(Sender: TObject); var SmsTo: JString; SmsManager: JSmsManager; begin SmsManager := TJSmsManager.JavaClass.getDefault; SmsTo := StringToJString('+79*********'); SmsManager.sendTextMessage(smsTo, nil, StringToJString('Test SMS'), nil, nil); end; У меня например нет активной симкарты, а система должна предлагать выбор... но отправка делается с 1ой sim.
  16. Как программно отправить SMS c определенной симкарты (бывает что на телефоне две и более sim-карт)?
  17. Раз пошла такая пьянка - всех с Наступающим Старым Новым Годом!
  18. SerioUser, а нельзя эти мелкие различия за#ifdef-ить в одном пекедже? Предварительно проверять {$IF DECLARED(FireMonkeyVersion)} {$DEFINE HAS_FMX} {$ELSE} {$DEFINE HAS_VCL} {$IFEND} ну и инклуды делать соответственно проверке {$IFDEF HAS_FMX} // подключаем библиотеки для FMX {$ENDIF} {$IFDEF HAS_VCL} // подключаем библиотеки для VCL {$ENDIF}
  19. krapotkin, в видео показано что на разных устройствах вид различается, в основном видна или нет боковая левая панель (вроде MultiView). Неужели это по умолчанию?
  20. alexbirukov, спасибо за статью. Можно ли отказаться от сторонних библиотек DPF iOS Native Components?
  21. Пример лежит в Object Pascal\Mobile Samples\User Interface\ScrollableForm alex_gulich, полезно посмотреть эту тему
×
×
  • Создать...