-
Постов
1 204 -
Зарегистрирован
-
Посещение
-
Победитель дней
26
Весь контент Rusland
-
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, при котором при получении сразу же будет читаться пришедшая СМС, будет еще лучше.
-
petyaas, в этой теме есть видео по которому можно создать приложение с сервисом.
-
Тут есть код как найти и удалить SMS из Входящих На строке SharedActivity.getContentResolver.delete(uri_del, StringToJString('_ID=' + smsid), nil); программа СМС удаляет, но зависает. В чем ошибка?
-
До выполнения далеко, тут не компилируется еще. Номер версии JDK виден в ошибке - 1.8.0_45Не в JDK дело. Можете попробовать у себя отбилдить сервис (в первом сообщении исходники)? Уверен у вас будет та же ошибка. Перезапускал. Delphi 10 Seattle
-
Есть вот такая процедура (взял со stackoverflow), которая позволяет просматривать все СМС во Входящих: но ее приходится вызывать в цикле, что не есть хорошо. Как бы ее связать с BroadcastReceiver? Есть готовый код? PS. форум глючит или мой браузер?
-
MAD_EVAL, я читал про этот готовый компонент, но сам автор признается что не знает как получать через него SMS... Может кто разъяснит? Сегодня только читал я это (не стоит думать что я задаю вопросы предварительно не прошерстив интернет)... в ответе Remy Lebeau дает код, который ни разу не компилируется... да он и сам признается что untested Кто-нибудь может разобрать/допилить его код?
-
В этом видео (в 16:40) человек (хоть он и создает там IntentRemoteService) говорит что это баг и нужно просто исправить файл *.template.java - заменить libraryName на baseLibraryName. Заменил, но мне это не помогло.
-
Создал пустой проект. К нему стал создавать 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
-
MAD_EVAL, спасибо что ответили, но я там вижу JAVA, а мне бы на паскале Транслировать я не могу )
-
Во-первых, сам компонент здесь ни при чем. Во-вторых, ограничение 1000 бесплатных запросов (а не сессий) в день касается Google Places API for Android, а не самого Google Maps Android API Пруфлинк https://developers.google.com/maps/pricing-and-plans/?hl=ru
- 17 ответов
-
- TBitmap
- DrawBitmap
-
(и ещё 2 )
C тегом:
-
masmat, что за ограничение значит 1000 сессий? О чем вы? Речь про сам компонент или про ограничения сервиса Google Maps?
- 17 ответов
-
- TBitmap
- DrawBitmap
-
(и ещё 2 )
C тегом:
-
Как отслеживать приход SMS? Где-то краем глаза видел что нужно прослушивать BroadcastReceiver... Если это так то как сделать его прослушку?
-
Как программно отключить звук и вибрацию? Как перевести телефон в режим Без звука / Вибрация / Со звуком?
- 6 ответов
-
- отключить звук
- отключить вибрацию
- (и ещё 1 )
-
В статье Андрея Ефимова показано как найти SMS. А как можно удалить СМС-ку из входящих?
-
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.
-
ZuBy, а на android 5.0 как?
-
Как программно отправить SMS c определенной симкарты (бывает что на телефоне две и более sim-карт)?
-
Раз пошла такая пьянка - всех с Наступающим Старым Новым Годом!
-
SerioUser, а нельзя эти мелкие различия за#ifdef-ить в одном пекедже? Предварительно проверять {$IF DECLARED(FireMonkeyVersion)} {$DEFINE HAS_FMX} {$ELSE} {$DEFINE HAS_VCL} {$IFEND} ну и инклуды делать соответственно проверке {$IFDEF HAS_FMX} // подключаем библиотеки для FMX {$ENDIF} {$IFDEF HAS_VCL} // подключаем библиотеки для VCL {$ENDIF}
-
alexbirukov, понятно
-
alexbirukov, спасибо за статью. Можно ли отказаться от сторонних библиотек DPF iOS Native Components?
-
Пример лежит в Object Pascal\Mobile Samples\User Interface\ScrollableForm alex_gulich, полезно посмотреть эту тему
- 4 ответа
-
- edit
- виртуальная клавиатура
-
(и ещё 2 )
C тегом: