7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Android SDK

So tätigen Sie Anrufe und verwenden SMS in Android-Apps

Scroll to top
Read Time: 11 mins

German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)

In diesem Tutorial erfahren Sie mehr über die Android-Telefonie- und SMS-API. Sie erfahren, wie Sie über Ihre App einen Anruf tätigen und Telefonanrufereignisse überwachen sowie SMS senden und empfangen.

1. So tätigen Sie einen Anruf

Zu Beginn zeige ich Ihnen, wie Sie einen Anruf über Ihre Anwendung entweder über die Telefonwähler-App oder direkt über Ihre App einleiten können, um es Ihren Benutzern zu erleichtern.

Erstellen Sie ein neues Android Studio-Projekt

Starten Sie Android Studio und erstellen Sie ein neues Projekt mit einer leeren Aktivität namens MainActivity.

Android Studio create a new Activity screenshotAndroid Studio create a new Activity screenshotAndroid Studio create a new Activity screenshot

Den Bildschirm auslegen

Im Moment hat unser Layout nur ein EditText-Feld und eine Wähltaste:

Emulator dial screen with phone number givenEmulator dial screen with phone number givenEmulator dial screen with phone number given

Ändern Sie die MainActivity-Klasse

Im Codeblock unten erstellen wir einen ACTION_DIAL-Intent, um den Telefonwähler anzuzeigen. Die Telefonnummer wird von unserem tel-URI-Schema geparst: tel:XXXXXXXX. Beachten Sie, dass Sie dafür keine Berechtigung benötigen:

Wenn Sie die App ausführen und auf die Wählschaltfläche klicken, werden Sie zur Wähl-App weitergeleitet und müssen von dort aus die Nummer wählen. Sie können diesen Ablauf ändern, um den Anruf tatsächlich von Ihrer App aus zu tätigen, indem Sie stattdessen einfach den Intent ACTION_DIAL in ACTION_CALL ändern. Dies erfordert jedoch die Berechtigung android.permission.CALL_PHONE.

Emulator screen defualt phone dialer with the phone numberEmulator screen defualt phone dialer with the phone numberEmulator screen defualt phone dialer with the phone number

2. Überwachung von Telefonanrufereignissen

In diesem Abschnitt erfahren Sie, wie Sie Telefonanrufereignisse im Android-System überwachen. Das Telefon kann sich in drei Zuständen befinden:

  1. idle (wenn es nicht benutzt wird)
  2. ringing (bei eingehendem Anruf)
  3. off-hook (wenn der Anruf entgegengenommen wird)

Berechtigung hinzufügen

Wir benötigen die Berechtigung READ_PHONE_STATE, um den Telefonstatus überwachen zu können. Fügen Sie es zu AndroidManifest.xml hinzu:

Erstellen Sie das PhoneStateListener-Objekt

Wir erstellen ein Objekt der PhoneStateListener-Klasse und überschreiben dann seine onCallStateChanged()-Methode (in IntelliJ ist dies einfach mit Control-O zu tun und dann die zu überschreibende Methode auszuwählen oder zu suchen). Wir behandeln Änderungen an den Anrufstatusänderungen, indem wir einen Toast anzeigen. Beachten Sie, dass wir auch auf die eingehenden Telefonnummern zugreifen können, wenn diese Methode ausgelöst wird:

Abhängig von Ihren Anwendungsanforderungen können Sie auch eine dieser anderen Ereignismethoden überschreiben: onCellInfoChanged(), onCallForwardingIndicatorChanged(), onCellLocationChanged() oder onSignalStrengthChanged().

Anhören des Anrufstatus

Um mit dem Abhören des Anrufstatus zu beginnen, müssen wir den TelephonyManager vom Systemdienst abrufen und in onCreate() initialisieren.

In der Methode onResume() können wir mit dem Hören beginnen, indem wir die Methode TelephonyManager listen() verwenden, indem wir ihr die PhoneStateListener-Instanz und den statischen LISTEN_CALL_STATE übergeben. Wir beenden das Zuhören in der Methode onStop(), indem wir LISTEN_NONE als zweites Argument an listen() übergeben.

Andere mögliche Telefonhöroptionen sind LISTEN_CELL_LOCATION, LISTEN_SIGNAL_STRENGTH, LISTEN_CALL_FORWARDING_INDICATOR und LISTEN_CELL_INFO.

Führen Sie abschließend die App aus und stellen Sie sicher, dass ein eingehender Anruf eingeht.

Emulator incoming call states Emulator incoming call states Emulator incoming call states

Diese Überwachung funktioniert nur, wenn sich die App im Vordergrund befindet. Damit dies im Hintergrund funktioniert (wenn unsere Anwendung nicht ausgeführt wird), müssen wir einen BroadcastReceiver erstellen, damit wir auch dann, wenn die App nicht ausgeführt wird, den Status von Telefonanrufen überwachen können. Abhängig von Ihren App-Anforderungen kann dies eine viel bessere Möglichkeit sein, um auf Änderungen des Anrufstatus zu achten. Wie das geht, zeige ich Ihnen im nächsten Abschnitt.

Beachten Sie, dass wir nur eingehende Anrufe überwachen. Damit wir ausgehende Anrufe überwachen können, benötigen wir zusätzliche Berechtigungen. Um ausgehende Anrufe zu überwachen, fügen Sie die folgende Zeile in Ihre AndroidManifest.xml-Datei ein.

So verwenden Sie den Emulator, um Anrufe zu tätigen und SMS-Nachrichten zu senden Message

Sie können Ihren Emulator verwenden, um einen Anruf oder das Senden einer SMS-Nachricht zu simulieren, aber Sie müssen ein wenig einrichten. Öffnen Sie Ihren Emulator, klicken Sie auf die letzte Schaltfläche in der rechten Navigationsleiste, um den erweiterten Steuerungsdialog zu öffnen, und wählen Sie dann die Telefonsteuerungsschaltfläche aus.

Using emulator to make call and send SMSUsing emulator to make call and send SMSUsing emulator to make call and send SMS

3. Überwachung von Telefonanrufereignissen im Hintergrund

Erstellen Sie einen BroadcastReceiver

Genau wie im vorherigen Abschnitt müssen wir einen Ereignis-Listener erstellen, um Änderungen des Telefonstatus zu überwachen. Der Hauptunterschied besteht darin, dass wir diesmal die BroadcastReceiver-Basisklasse erweitern, sodass wir auch dann auf den Anrufstatus achten können, wenn die Anwendung nicht ausgeführt wird. Achten Sie darauf, den Hörer nicht mehr als einmal zu registrieren! Unser Scheck dafür ist in Zeile 36.

Ändern Sie AndroidManifest.xml

Ein Rundfunkempfänger funktioniert nur, wenn er registriert ist. Wir müssen dem Android-System unseren Broadcast-Empfänger mitteilen, indem wir ihn in der Datei AndroidManifest.xml registrieren, indem wir unsere PhoneCallStateReceiver-Klasse mit dem <intent-filter> verbinden, der den System-Broadcast beschreibt, den wir empfangen möchten – in diesem Fall PHONE_STATE.

Ausgehende Anrufe überwachen

Bei ausgehenden Anrufen müssen Sie die Aktionsabsicht NEW_OUTGOING_CALL <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> in den <intent-filter> des Empfängers in AndroidManifest.xml aufnehmen.

Um die Telefonnummer des beabsichtigten ausgehenden Anrufs zu erhalten, erhalten wir innerhalb der onReceive(Context, Intent)-Methode die Nummer aus dem Intent als Extra. Um zu verhindern, dass dieser beabsichtigte Aufruf durchgeführt wird, können wir setResultData() aufrufen und ihm ein Null-Argument übergeben. Die resultData wird als die eigentliche anzurufende Nummer verwendet.

In unserem Tutorial hier auf Envato Tuts+ erfahren Sie mehr über Broadcasts und Broadcast-Empfänger:

4. Senden von SMS-Nachrichten

Sie haben nur zwei Möglichkeiten zum Senden von SMS: Verwenden der SMS-Client-Anwendung des Geräts oder Überspringen des Clients, indem Sie die SMS direkt von Ihrer App aus senden. Wir werden uns beide Szenarien ansehen und Sie können entscheiden, welches für Ihren Anwendungsfall besser ist. Beginnen wir mit dem Senden einer SMS mit dem SMS-Client des Geräts.

Einrichten des Layouts

Zuerst müssen wir unser Hauptlayout so ändern, dass es ein EditText-Feld für die Nachricht und eine Schaltfläche Nachricht senden enthält.

Ändern Sie die MainActivity

Erstellen Sie in unserer onCreate()-Methode in unserer MainActivity-Klasse eine Absicht mit ACTION_SENDTO als erstem Argument und einem smsto:<phone number>-URI als zweitem Argument. Die Textnachricht ist der Wert des sms_body-Extras:

Hier überwacht der SMS-Client den Status der Nachrichtenzustellung.

Führen Sie die App aus

Wenn alle erforderlichen Felder ausgefüllt sind, wird durch Klicken auf die Schaltfläche SMS senden der SMS-Client des Benutzers geöffnet oder dem Benutzer die Möglichkeit geboten, eine App auszuwählen, falls noch keine ausgewählt wurde.

Send SMS flow Send SMS flow Send SMS flow

5. Direktes Senden von SMS-Nachrichten

Als Nächstes sehen wir uns an, wie Sie die SMS direkt aus unserer Anwendung senden können, anstatt den SMS-Client des Geräts zu verwenden.

Berechtigung in AndroidManifest.xml hinzufügen

Wie üblich müssen wir die Berechtigung in AndroidManifest.xml registrieren.

Ändern Sie die MainActivity-Klasse

Als Nächstes müssen wir für Android 6.0 (API-Level 23) und höher während der Laufzeit die SEND_SMS-Berechtigung anfordern.

Um mehr über Android-Laufzeitberechtigungen und deren Änderungen in Version 6.0 zu erfahren, sehen Sie sich unser Tutorial hier auf Envato Tuts+ an:

Um eine SMS zu senden, rufen wir die Standardinstanz von SmsManager ab und rufen dann ihre sendTextMessage()-Methode auf, wobei wir die Telefonnummer als erstes Argument und die Nachricht als zweites Argument übergeben:

Um den Zustellungsstatus zu überwachen, verfügt die SMSManager-Methode sendTextMessage() über zwei optionale PendingIntent-Parameter: sentIntent und deliveryIntent.

Wenn Sie sentIntent verwenden möchten, achten Sie bei Erfolg auf den Ergebniscode Activity.RESULT_OK oder einen von RESULT_ERROR_GENERIC_FAILURE, RESULT_ERROR_RADIO_OFF und RESULT_ERROR_NULL_PDU, um einen Fehler anzuzeigen.

6. Empfangen einer SMS-Nachricht

Damit Ihre App beginnen kann, SMS-Nachrichten vom Telefon des Benutzers zu empfangen, ist es am besten, einen Broadcast-Empfänger zu registrieren, damit er benachrichtigt werden kann, wenn eine neue SMS eingeht, auch wenn Ihre App nicht im Vordergrund ausgeführt wird.

Berechtigung hinzufügen

Fügen Sie die Berechtigung RECEIVE_SMS zu AndroidManifest.xml hinzu:

Als nächstes müssen wir überprüfen, ob die App zur Laufzeit berechtigt ist, SMS-Nachrichten zu empfangen. Überprüfen Sie daher in der MainActivity-Klasse die RECEIVE_SMS-Berechtigung. Wenn es nicht gefunden wird, fordern Sie es an.

Erstellen Sie einen Broadcast-Empfänger

Wir rufen jedes Objekt der SmsMessage-Klasse ab, indem wir die Methode createFromPdu(byte[] pdu) verwenden und ihm eine PDU (Protokolldateneinheit) übergeben. Wir fügen es dann zu unserem Nachrichten-Array hinzu.

Um API 23 und höher zu unterstützen, sollten Sie das Format String extra angeben (entweder "3gpp" für GSM/UMTS/LTE-Nachrichten im 3GPP-Format oder "3gpp2" für CDMA/LTE-Nachrichten im 3GPP2-Format).

Führen Sie nun die App aus, schließen Sie sie und senden Sie Ihrem emulierten Telefon eine SMS.

Emulator showing a toast when it receives an SMS in the backgroundEmulator showing a toast when it receives an SMS in the backgroundEmulator showing a toast when it receives an SMS in the background

Abschluss

In diesem Tutorial haben Sie Folgendes gelernt:

  • einen Anruf über Ihre App tätigen
  • Überwachung von Telefonanrufereignissen
  • Senden von SMS-Nachrichten entweder über die Geräte-Messaging-App oder direkt über Ihre eigene App
  • Empfangen von SMS-Nachrichten im Hintergrund

Es gibt noch viel mehr, was Sie mit Telefonanrufen und SMS-Nachrichten in Android tun können. Besuchen Sie die Android-Telefonie-API und die SMSManager-API-Dokumentation, um mehr zu erfahren.

Sehen Sie sich in der Zwischenzeit einige unserer anderen Beiträge zur Android-Entwicklung an!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.