Android Sms Notification weiterleiten an PC

L

lam_tr

Top Contributor
Hallo zusammen,

ich bin dabei einen Client zu schreiben der SMS Notification am Android zur PC JavaFX Application weiterleitet. Mein Problem grad ist nur, wie kann ich bei Erhalt einer SMS Nachricht weiter an mein PC Client weiterleiten.

Hier wird gezeigt wie man eine SMS programmatisch bekommt
* https://stackoverflow.com/questions/11435354/receiving-sms-on-android-app

An sich kann ich dann bei eingehende SMS über Sockets die es weiter an den PC Client schicken

Ich glaube nicht dass es so sinnvoll ist, wenn der Socket Server die ganze Zeit läuft und bein Einkommen einer SMS die Nachricht weiterreicht. Es würde auf jeden Fall sehr viel Akku in Anspruch nehmen, denke ich mal zumindest.

Was wäre da der bessere Weg?

Viele Grüße
lam
 
kneitzel

kneitzel

Top Contributor
Also auf Android musst du nicht die ganze Zeit einen Socket offen halten. Du baust die Verbindung vom Handy zum Rechner auf. Somit muss die Applikation auf dem Computer auf eingehende Verbindungen warten (so du dies so entwickeln möchtest).

Aber dazu müsste der PC auch vom Handy aus erreichbar sein, also z.B. in gleichen WLAN sein.
 
L

lam_tr

Top Contributor
Also auf Android musst du nicht die ganze Zeit einen Socket offen halten. Du baust die Verbindung vom Handy zum Rechner auf. Somit muss die Applikation auf dem Computer auf eingehende Verbindungen warten (so du dies so entwickeln möchtest).

Aber dazu müsste der PC auch vom Handy aus erreichbar sein, also z.B. in gleichen WLAN sein.
Das heißt, der Rechner ist in dem Fall der Socket Server und Handy dann der Client, der die eingehende SMS weiterleitet? Stimmt, warum nicht umgekehrt :)

Gibt es weiter eine Möglichkeit, dem Client zu sagen, dass er die Socket Server Addresse auswählen kann. Weil sonst muss ich immer zuerst die IP vom Rechner per ipconfig herausfinden und in dem Client eintragen, damit die Verbindung hergestellt werden kann.
 
kneitzel

kneitzel

Top Contributor
Dazu dient in der Regel ein DNS Server. Die DNS Server werden dann z.B. vom DHCP Server (Der vergibt in einem Netz IP Adressen) aktualisiert. Oder man nutzt etwas wie Dynamisches DNS, d.h. eine Software teilt dem DNS Server die aktuelle Adresse mit.

Es ist aber durchaus üblich, dass bei so Servern die Adresse relativ fest ist und sich in der Regel nicht ändert. Nur eben ist es bei Dir "nur" ein Client.

So es nur im lokalen WLAN funktionieren muss, könntest Du Deinem Rechner ggf. eine feste IP zuordnen...
 
L

lam_tr

Top Contributor
Dazu dient in der Regel ein DNS Server. Die DNS Server werden dann z.B. vom DHCP Server (Der vergibt in einem Netz IP Adressen) aktualisiert. Oder man nutzt etwas wie Dynamisches DNS, d.h. eine Software teilt dem DNS Server die aktuelle Adresse mit.

Es ist aber durchaus üblich, dass bei so Servern die Adresse relativ fest ist und sich in der Regel nicht ändert. Nur eben ist es bei Dir "nur" ein Client.

So es nur im lokalen WLAN funktionieren muss, könntest Du Deinem Rechner ggf. eine feste IP zuordnen...
Okay diesen Punkt muss ich ein bisschen genauer anschauen.

Und wenn ich eine SMS direkt vom JavaFX Client zu Android schicken möchte, muss ich da den Socket Server laufen lassen oder? Die JavaFX Anwendung soll theoretisch gesagt empfangen und senden können. Ist das möglich, falls ja wie? Auf Android und JavaFX jeweils Socket Server laufen lassen ist doch verkehrt oder?
 
kneitzel

kneitzel

Top Contributor
Also die umgekehrte Richtung ist einfacher, denn da brauchst Du keinerlei Sockets.

Google hat sogenannte Push Notifications eingebaut. Das war früher mal das Google Cloud Messaging (GCM) und wurde dann in Firebase integriert (Firebase Cloud Messaging FCM): https://firebase.google.com/docs/cloud-messaging

Die Problematik ist dabei aber, dass der Client einmal seine ID an den Server geben können muss. Also einmalig ist so eine Verbindung schon notwendig. Aber dann kann der Client über Firebase Nachrichten an Deine App schicken.
 
L

lam_tr

Top Contributor
Also die umgekehrte Richtung ist einfacher, denn da brauchst Du keinerlei Sockets.

Google hat sogenannte Push Notifications eingebaut. Das war früher mal das Google Cloud Messaging (GCM) und wurde dann in Firebase integriert (Firebase Cloud Messaging FCM): https://firebase.google.com/docs/cloud-messaging

Die Problematik ist dabei aber, dass der Client einmal seine ID an den Server geben können muss. Also einmalig ist so eine Verbindung schon notwendig. Aber dann kann der Client über Firebase Nachrichten an Deine App schicken.

Und wie wird so eine ID generiert?

Auf der Google Seite sehe sowas Link

Code:
// Add the public key generated from the console here.
messaging.usePublicVapidKey("BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");

D.h. für jedes Handy oder Google Account müsste ich für meine Clients eine Vapid Key besorgen oder?
 
kneitzel

kneitzel

Top Contributor
Also du hast erst einmal eine Registrierung bei Firebase.
Dann erzeugst Du ein Projekt und im Rahmen des Projektes bekommst Du dann erste IDs und so. Die sind dann bei Android in einer json Datei, die Du mit einbinden musst in Dein Projekt (google-services.json mit project_number, firebase_url, project_id, ....).

Das ist erst einmal der Rahmen. In der Applikation holt man sich die FirebaseInstance und davon dann die Id. Das ist aber alles sehr genua dokumentiert. Bei einem früheren Projekt von mir war das z.B.:
Code:
        // Initialize Firebase and get token
        FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(task -> {
            // Check if task was successful.
            if (!task.isSuccessful()) {
                Log.e(TAG, "Unable to get Firebase InstanceId!");
                return;
            }

            // Get Instance Id token
            String token = task.getResult().getToken();
            config.setFirebaseId(token);

            // Log and toast
            String msg = "Firebase Token: " + token;
            Log.d(TAG, msg);
        });

config war eine Instanz einer Klasse, die die Konfiguration gespeichert hat.

Der letzte Part ist dann das Senden von Nachrichten an Clients. Dazu hat man zum einen wieder Daten des Projekts und man kann dann Nachrichten an einen oder mehrere Clients senden. Adressiert wird über die Token des Clients.

Aber das ist jetzt extrem oberflächig - geh die Dokumentation einmal in Ruhe durch. Das ist auch wichtig, denn es gibt einiges an Feinheiten, die man verstehen sollte.
 
L

lam_tr

Top Contributor
Also du hast erst einmal eine Registrierung bei Firebase.
Dann erzeugst Du ein Projekt und im Rahmen des Projektes bekommst Du dann erste IDs und so. Die sind dann bei Android in einer json Datei, die Du mit einbinden musst in Dein Projekt (google-services.json mit project_number, firebase_url, project_id, ....).

Das ist erst einmal der Rahmen. In der Applikation holt man sich die FirebaseInstance und davon dann die Id. Das ist aber alles sehr genua dokumentiert. Bei einem früheren Projekt von mir war das z.B.:
Code:
        // Initialize Firebase and get token
        FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(task -> {
            // Check if task was successful.
            if (!task.isSuccessful()) {
                Log.e(TAG, "Unable to get Firebase InstanceId!");
                return;
            }

            // Get Instance Id token
            String token = task.getResult().getToken();
            config.setFirebaseId(token);

            // Log and toast
            String msg = "Firebase Token: " + token;
            Log.d(TAG, msg);
        });

config war eine Instanz einer Klasse, die die Konfiguration gespeichert hat.

Der letzte Part ist dann das Senden von Nachrichten an Clients. Dazu hat man zum einen wieder Daten des Projekts und man kann dann Nachrichten an einen oder mehrere Clients senden. Adressiert wird über die Token des Clients.

Aber das ist jetzt extrem oberflächig - geh die Dokumentation einmal in Ruhe durch. Das ist auch wichtig, denn es gibt einiges an Feinheiten, die man verstehen sollte.
Das Ganze ist interessant, aber wenn ich irgendwann diese JavaFX Anwendung mit dem Android Client verteilen sollte , ist das zuerstmal nervig wenn jeder Benutzer noch bei Firebase eine Registrierung machen muss, um die Anwendung benutzen zu können oder?
 
kneitzel

kneitzel

Top Contributor
Nein, die Registrierung musst Du als Entwickler machen. Die Anwender müssen da nichts machen.
 
Anzeige


Oben