# FAQ zum Pushwoosh Android SDK

* [Wie sehen Android-Push-Token und HWID aus?](#wie-sehen-android-push-token-und-hwid-aus)
* [Wie erhalte ich das Push-Token meines Android-Geräts?](#wie-erhalte-ich-das-push-token-meines-android-geräts)
* [Welche Berechtigungen sind notwendig und welche sind optional?](#welche-berechtigungen-sind-notwendig-und-welche-sind-optional)
* [Wie setze ich eine UserID?](#wie-setze-ich-eine-userid)
* [Wie genau ist die Gesamtzahl der Android-Abonnenten?](#wie-genau-ist-die-gesamtzahl-der-android-abonnenten)
* [Kann ich HTML-Tags in Push-Nachrichten verwenden, die an Android gesendet werden?](#kann-ich-html-tags-in-push-nachrichten-verwenden-die-an-android-gesendet-werden)
* [Wie stellt man ein Benachrichtigungssymbol in Android Lollipop (und späteren Versionen) ein?](#wie-stellt-man-ein-benachrichtigungssymbol-in-android-lollipop-und-späteren-versionen-ein)
* [Verwendung des Pushwoosh SDK mit anderen FCM-Diensten](#verwendung-des-pushwoosh-sdk-mit-anderen-fcm-diensten)
* [Verwendung von Pushwoosh mit den Bibliotheken LeakCanary oder AppMetrica](#verwendung-von-pushwoosh-mit-den-bibliotheken-leakcanary-oder-appmetrica)
* [Löschen einer empfangenen Benachrichtigung von einem Gerät](#löschen-einer-bestimmten-empfangenen-benachrichtigung-von-einem-gerät)

### Wie sehen Android-Push-Token und HWID aus?

Android-Geräte-Push-Tokens unterscheiden sich in der Länge (weniger als 255 Zeichen) und beginnen mit **APA91b**, zum Beispiel:

`APA91bFoi3lMMre9G3XzR1LrF4ZT82_15MsMdEICogXSLB8-MrdkRuRQFwNI5u8Dh0cI90ABD3BOKnxkEla8cGdisbDHl5cVIkZah5QUhSAxzx4Roa7b4xy9tvx9iNSYw-eXBYYd8k1XKf8Q_Qq1X9-x-U-Y79vdPq`

Tokens enthalten oft ein durch einen Doppelpunkt getrenntes Präfix vor **APA91b**, zum Beispiel: `eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...`

Pushwoosh verwendet UUID als HWIDs, d.h. zufällig generierte Zeichenketten von 32 alphanumerischen Zeichen: `123e4567-e89b-12d3-a456-426655440000`

### Wie erhalte ich das Push-Token meines Android-Geräts?

Sie können das Push-Token Ihres Android-Geräts im Konsolenprotokoll erhalten. Verwenden Sie das logcat-Tool in [Android Studio](https://developer.android.com/studio).

Öffnen Sie **monitor.bat** in `%USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat`, verbinden Sie Ihr Gerät mit dem PC und erlauben Sie USB-Debugging in den Android-Einstellungen. Führen Sie Ihre Anwendung auf dem Gerät aus. Suchen Sie nach `/registerDevice` und finden Sie das Push-Token für Ihr Gerät, um es später in den Testgeräten zu verwenden.

<img src="/android-push-notifications-android-faq-1.webp" alt="Screenshot, der die logcat-Ausgabe mit Informationen zur Registrierung des Push-Tokens in Android Studio anzeigt"/>

### Welche Berechtigungen sind notwendig und welche sind optional?

Wenn die Anwendung auf einem Android-Gerät installiert wird, fragt sie in Verbindung mit dem Pushwoosh SDK nach den folgenden Berechtigungen:

```java
<!-- FCM connects to Firebase Services. -->
 <uses-permission android:name="android.permission.INTERNET"/>

<!-- Keeps the processor from sleeping when a message is received. -->
 <uses-permission android:name="android.permission.WAKE_LOCK"/>

 <!-- This permission is used to determine whether the device can access the network. -->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- This app has permission to register and receive data message. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
```

Unser SDK fragt nicht nach der Berechtigung, auf Bilder, Gerätekontakte usw. zuzugreifen.

### Wie setze ich eine UserID?

Sie können eine [Benutzerkennung (UserID)](/de/developer/first-steps/collecting-user-ids/) festlegen, die eine Facebook-ID, ein Benutzername, eine E-Mail-Adresse oder eine andere eindeutige Benutzer-ID sein kann. Dies ermöglicht es Ihnen, Daten und Ereignisse über mehrere Geräte hinweg abzugleichen, die mit demselben Benutzer verknüpft sind. Um die UserID festzulegen, rufen Sie die Methode **setUserId** auf.

**Beispiel**

```
Pushwoosh.getInstance().setUserId("testUser");
```

### Wie genau ist die Gesamtzahl der Android-Abonnenten?

Pushwoosh löscht abgemeldete Android-Geräte aus der Datenbank, sobald die Antwort „NotRegistered“ von FCM empfangen wird, die nach dem zweiten Versuch, ein bestimmtes Gerät zu erreichen, zurückgegeben werden kann. Das bedeutet, dass Sie 2 Push-Nachrichten an ein abgemeldetes Gerät senden müssen, damit es aus der Datenbank entfernt wird.

Das folgende ist das häufigste Szenario, das in der [FCM-Dokumentation](https://firebase.google.com/docs/cloud-messaging/) beschrieben wird:

1. Ihr Abonnent deinstalliert die App.
2. Pushwoosh sendet eine Nachricht an den FCM-Server.
3. Der FCM-Server sendet die Nachricht an das Gerät Ihres Benutzers.
4. Der FCM-Client auf dem Gerät empfängt die Nachricht und stellt fest, dass Ihre Anwendung deinstalliert wurde; die Details der Erkennung hängen von der Plattform ab, auf der die App läuft.
5. Der FCM-Client auf dem Gerät informiert den FCM-Server, dass die App deinstalliert wurde.
6. Der FCM-Server markiert die Registrierungs-ID zum Löschen.
7. Pushwoosh sendet eine weitere Nachricht an FCM.
8. FCM gibt eine NotRegistered-Nachricht zurück.
9. Pushwoosh entfernt das Push-Token aus Ihrer Benutzerbasis.

Es kann eine Weile dauern, bis die Registrierungs-ID vollständig aus FCM entfernt ist. Daher ist es möglich, dass eine in Schritt 7 gesendete Nachricht eine gültige Nachrichten-ID als Antwort erhält, obwohl die Nachricht nicht an die Client-App zugestellt wird.

### Kann ich HTML-Tags in Push-Nachrichten verwenden, die an Android gesendet werden?

Ja, in Android können Sie die folgenden HTML-Tags verwenden, um das Aussehen einer Push-Nachricht zu ändern:

```txt
<span style="color: green;"><b><i><span style="text-decoration: underline;">Hello world!
Hello hi hey</span></i></b></span>
```

Platzieren Sie diese HTML-Tags im Eingabefeld **Nachricht** und verwenden Sie sie auch in der API-Anfrage. Einige Android-Geräte verarbeiten diese HTML-Tags möglicherweise nicht korrekt, aber die meisten Geräte zeigen die Formatierung richtig an.

### Wie stellt man ein Benachrichtigungssymbol in Android Lollipop (und späteren Versionen) ein?

In Android Lollipop wurden die Symbole so geändert, dass sie nur noch weiß sind. Wenn Sie also **targetSdkVersion >= 21** in Ihrer **AndroidManifest.xml**-Datei auswählen, verwendet Android nur den Alpha-Kanal des Symbols.\
Weitere Informationen zum Verhalten finden Sie in der [Android-Dokumentation](https://developer.android.com/docs).

Das System ignoriert alle Nicht-Alpha-Kanäle in Aktionssymbolen und im Hauptbenachrichtigungssymbol. Gehen Sie davon aus, dass diese Symbole nur Alpha-Kanäle haben. Das System zeichnet Benachrichtigungssymbole in Weiß und Aktionssymbole in Dunkelgrau. _Dies liegt außerhalb der Kontrolle des Pushwoosh SDK_.

**1.** Erstellen Sie das Benachrichtigungssymbol gemäß den [Android-Richtlinien](https://material.io/design/platform-guidance/android-notifications.html#style). Gemäß der [Dokumentation](https://developer.android.com/about/versions/lollipop/android-5.0-changes) wird das System alle Farben ignorieren.

**2.** Nennen Sie das Symbol `pw_notification.png` und legen Sie es im Ordner **res/drawable** ab. Das Pushwoosh SDK wird dieses Symbol als Standard für Benachrichtigungen verwenden.

**3.** Alternativ können Sie die Remote-API verwenden und den Wert des Parameters `"android_icon"` auf das Symbolbild (ohne Dateierweiterung) setzen.

### Verwendung des Pushwoosh SDK mit anderen FCM-Diensten

Sie können Pushwoosh zusammen mit anderen SDKs verwenden, die FCM für Push-Nachrichten nutzen. Erstellen Sie dazu einen Router-Dienst, um Ereignisse zwischen den Diensten zu verteilen. Fügen Sie zunächst die Abhängigkeit **pushwoosh-firebase** neben dem Hauptmodul von Pushwoosh hinzu:

```groovy title="build.gradle"
implementation 'com.pushwoosh:pushwoosh-firebase:6.0.3'
```

Erstellen Sie die Routing-Klasse:

<Tabs>
<TabItem label="FirebaseMessagingRouterService.kt">
```kotlin
import com.pushwoosh.firebase.PushwooshFcmHelper;

class FirebaseMessagingRouterService : FirebaseMessagingService() {

    override fun onNewToken(token: String?) {
        super.onNewToken(token)
        PushwooshFcmHelper.onTokenRefresh(token)
        sendTokenToAnotherService(token)
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) {
           //this is a Pushwoosh push, SDK will handle it automatically
            PushwooshFcmHelper.onMessageReceived(this, remoteMessage)
        } else {
            //this is not a Pushwoosh push, you should handle it by yourself
            dispatchNonPushwooshMessage(remoteMessage);
        }
    }

    private fun dispatchNonPushwooshMessage(remoteMessage: RemoteMessage) {
       // Implement your push handling logics here
   }
}
```
</TabItem>

<TabItem label="FirebaseMessagingRouterService.java">
```java
import com.pushwoosh.firebase.PushwooshFcmHelper;

public class FirebaseMessagingRouterService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        PushwooshFcmHelper.onTokenRefresh(token);
        sendTokenToAnotherService(token);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (PushwooshFcmHelper.isPushwooshMessage(remoteMessage)) {
            //this is a Pushwoosh push, SDK will handle it automatically
            PushwooshFcmHelper.onMessageReceived(this, remoteMessage);
        } else {
            //this is not a Pushwoosh push, you should handle it by yourself
            dispatchNonPushwooshMessage(remoteMessage);
        }
    }

    private void dispatchNonPushwooshMessage(RemoteMessage remoteMessage) {
        // Implement your push handling logics here
    }
}
```
</TabItem>
</Tabs>

Registrieren Sie die Router in Ihrer AndroidManifest.xml:

```txt title="AndroidManifest.xml"
<service
    android:name=".FirebaseMessagingRouterService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
```

### Verwendung von Pushwoosh mit den Bibliotheken LeakCanary oder AppMetrica

Wenn Sie Analyse-Tools wie LeakCanary, AppMetrica oder andere integrieren, starten diese Bibliotheken einen neuen Prozess und erstellen eine neue Instanz der App. Da Sie in einem anderen Prozess nicht auf Push-Benachrichtigungen lauschen können, führt dies dazu, dass eine `java.lang.NullPointerException` ausgelöst wird.

Wenn Sie `registerForPushNotifications` innerhalb von `Application.onCreate()` aufrufen, sollten Sie prüfen, ob Sie sich im Hauptprozess der Anwendung befinden. Verwenden Sie den folgenden Code, um diese Prüfung durchzuführen:

```java
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses();
if (runningAppProcesses != null && runningAppProcesses.size() != 0) {
    for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : runningAppProcesses) {
        boolean isCurrentProcess = runningAppProcessInfo.pid == android.os.Process.myPid();
        boolean isMainProcessName = getPackageName().equals(runningAppProcessInfo.processName);
        if (isCurrentProcess && isMainProcessName) {

            Pushwoosh.getInstance().registerForPushNotifications(...);
            break;
        }
    }
}
```

### Löschen einer bestimmten empfangenen Benachrichtigung von einem Gerät lokal

Wenn Sie eine nicht relevante Push-Nachricht entfernen möchten, wenn Sie eine bestimmte Aktion in Ihrer Anwendung ausführen, können Sie den folgenden Ansatz verwenden:

```java title="MainActivity.java"
public class MainActivity extends AppCompatActivity {

	List<NotificationCreatedEvent> savedPushes = new ArrayList<>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Pushwoosh.getInstance().registerForPushNotifications();

		PushwooshNotificationSettings.setMultiNotificationMode(true);

		findViewById(R.id.clear_button).setOnClickListener( v -> {
			cancelPushes();
		});

		EventBus.subscribe(NotificationCreatedEvent.class, event -> {
			try {
				if (event.getMessage().getCustomData() == null)
					return;

				//cancel pushes only with a specific flag
				if (new JSONObject(event.getMessage().getCustomData()).getBoolean("cancel")) {
					savedPushes.add(event);
				}
			} catch (JSONException e) {
			}
		});
	}
	private void cancelPushes() {
		NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

		if (manager == null) {
			return;
		}

		for (NotificationCreatedEvent event : savedPushes) {
			manager.cancel(event.getMessageTag(), event.getMessageId());
		}
	}
}
```

## Teilen Sie uns Ihr Feedback mit

Ihr Feedback hilft uns, eine bessere Erfahrung zu schaffen. Wenn Sie während des SDK-Integrationsprozesses auf Schwierigkeiten stoßen, teilen Sie uns Ihre Gedanken [über dieses Formular](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform) mit.