|
Registriert seit: 29. Aug 2019 26 Beiträge Delphi 12 Athens |
#6
Danke für eure Antworten und Anregungen. Ich habe nilcemar und Barisatalay (kastri hat nur händisches einlesen einer SMS) ausprobiert. Beide haben eine Broadcast Komponente die ich installiert habe und dann lt. Demos ausprobiert (leider nicht mit receive_SMS). Es geht bei beiden mein Projekt am Android 13 Tablet ausführen, broadcast registrieren und dann senden, jedoch wenn ich von meinem Handy ein SMS an das Tablet schicke kommt das SMS mit einer Nachricht zwar an, aber mein APP rührt sich nicht, auch nicht im OnReceive der Komponente.
Ich probiere und suche im Internet schon seit Tagen, und es will einfach nicht funktionieren. Vielleicht weiß jemand wo mein Fehler liegt, oder hat schon so eine App die funktioniert. Ich wäre froh über ein Stück funktionierendem Delphi Code. Anbei ein paar Ausschnitte meines Programmes. AndroidStudio habe ich auch die neueste Version installiert, jedoch die verwenden jetzt Kotlin statt JAVA. Diese Sprache kann ich gar nicht und JAVA auch nur am Rande, daher wollte ich es in Delphi programmieren. Danke und LG Diese Berechtigungen in der Manifest und im Delphi Code habe ich alle schon ausprobiert <uses-permission android:name="android.permission.DELIVER_COMPANION _MESSAGES" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.REQUEST_COMPANION _RUN_IN_BACKGROUND" /> <uses-permission android:name="android.permission.REQUEST_COMPANION _USE_DATA_IN_BACKGROUND" /> <uses-permission android:name="android.permission.SEND_SMS" /> Und diese Einträge in der Manifest habe ich auch schon einzeln ausprobiert. <receiver android:name="com.embarcadero.rtl.notifications.No tificationAlarm" /> <receiver android:name="com.embarcadero.notifications.FMXNot ificationAlarm" /> <receiver android:name="com.embarcadero.broadcastreceiver.In comingSms" android:exported="true"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEI VED" /> </intent-filter> </receiver> <receiver android:name="com.embarcadero.firemonkey.broadcast .FMXBroadcastReceiverListener" /> <receiver android:name="com.embarcadero.firemonkey.broadcast .FMXBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="android.provider.telephony.SMS_RECEI VED" /> </intent-filter> </receiver> Und das sind Schnipsel aus meinem Delphi Code: AndroidBroadcastReceiver1 ist die Komponente procedure TfrmHaupt.btnSendBroadcastClick(Sender: TObject); begin frmHaupt.AndroidBroadcastReceiver1.SendBroadcast(' SMS_RECEIVED_ACTION'); end; procedure TfrmHaupt.FormCreate(Sender: TObject); begin frmHaupt.AndroidBroadcastReceiver1.RegisterReceive ; frmHaupt.AndroidBroadcastReceiver1.Add('SMS_RECEIV ED_ACTION'); // stringinhalt selbst erfunden … end; Delphicode der Komponente, beide nilcemar und Barisatalay sind in etwa gleich unit batBroadcastReceiver; interface uses System.SysUtils, System.Classes {$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} TAndroidBroadcastReceiver= class; TOnReceive = procedure (csContext: JContext; csIntent: JIntent) of object; {$IFDEF ANDROID} TBroadcastListener = class(TJavaLocal, JFMXBroadcastReceiverListener) private FOwner: TAndroidBroadcastReceiver; public constructor Create(AOwner: TAndroidBroadcastReceiver); procedure OnReceive(csContext: JContext; csIntent: JIntent); cdecl; end; {$ENDIF} TAndroidBroadcastReceiver = class(TComponent) private { Private declarations } {$IFDEF ANDROID} FReceiver: JBroadcastReceiver; FListener : TBroadcastListener; {$ENDIF} FOnReceive: TOnReceive; FItems: TStringList; function GetItem(const csIndex: Integer): String; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure SendBroadcast(csValue: String); procedure Add(csValue: String); procedure Delete(csIndex: Integer); procedure Clear; {$IFDEF ANDROID} procedure setResultData(data: JString); {$ENDIF} 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; function StringFromByteArray(ABytes: System.TArray<System.Byte>): String; published { Published declarations } property OnReceive: TOnReceive read FOnReceive write FOnReceive; end; procedure Register; implementation procedure Register; begin RegisterComponents('BAT_Tecnologia', [TAndroidBroadcastReceiver]); end; { TAndroidBroadcastReceiver } procedure TAndroidBroadcastReceiver.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 TAndroidBroadcastReceiver.Clear; begin FItems.Clear; end; constructor TAndroidBroadcastReceiver.Create(AOwner: TComponent); begin inherited; FItems := TStringList.Create; end; procedure TAndroidBroadcastReceiver.Delete(csIndex: Integer); begin if FItems <> nil then begin FItems.Delete(csIndex); {$IFDEF ANDROID} TAndroidHelper.Activity.UnregisterReceiver(FReceiv er); RegisterReceive; {$ENDIF} end; end; destructor TAndroidBroadcastReceiver.Destroy; begin FItems.Free; {$IFDEF ANDROID} if FReceiver <> nil then TAndroidHelper.Activity.UnregisterReceiver(FReceiv er); {$ENDIF} inherited; end; function TAndroidBroadcastReceiver.First: String; begin Result := FItems[0]; end; function TAndroidBroadcastReceiver.GetItem(const csIndex: Integer): String; begin Result := FItems[csIndex]; end; function TAndroidBroadcastReceiver.HasPermission( const csPermission: string): Boolean; {$IFDEF ANDROID} begin Result := TAndroidHelper.Activity.checkCallingOrSelfPermissi on(StringToJString(csPermission)) = TJPackageManager.JavaClass.PERMISSION_GRANTED; {$ELSE} begin Result := False; {$ENDIF} end; function TAndroidBroadcastReceiver.Last: String; begin Result := FItems[FItems.Count]; end; procedure TAndroidBroadcastReceiver.RegisterReceive; {$IFDEF ANDROID} var I: Integer; begin if FListener = nil then FListener := TBroadcastListener.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 TAndroidBroadcastReceiver.Remove(const csValue: String): Integer; begin Result := FItems.IndexOf(csValue); if Result > -1 then FItems.Delete(Result); end; procedure TAndroidBroadcastReceiver.SendBroadcast(csValue: String); {$IFDEF ANDROID} var Inx: JIntent; begin Inx := TJIntent.Create; Inx.setAction(StringToJString(csValue)); TAndroidHelper.Context.sendBroadcast(Inx); {$ELSE} begin {$ENDIF} end; function TAndroidBroadcastReceiver.StringFromByteArray( ABytes: System.TArray<System.Byte>): String; //convert a byte array to string begin Result := TEncoding.ANSI.GetString(ABytes); end; {$IFDEF ANDROID} procedure TAndroidBroadcastReceiver.setResultData(data: JString); begin FReceiver.setResultData(data); end; {$ENDIF} { TBroadcastListener } {$IFDEF ANDROID} constructor TBroadcastListener.Create(AOwner: TAndroidBroadcastReceiver); begin inherited Create; FOwner := AOwner; end; procedure TBroadcastListener.OnReceive(csContext: JContext; csIntent: JIntent); begin if Assigned(FOwner.OnReceive) then FOwner.onReceive(csContext, csIntent); end; {$ENDIF} end.
Manfred
|
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |