# Preguntas frecuentes sobre el SDK de Pushwoosh para Android

* [¿Qué aspecto tienen el token push de Android y el HWID?](#que-aspecto-tienen-el-token-push-de-android-y-el-hwid)
* [¿Cómo puedo obtener el token push de mi dispositivo Android?](#como-puedo-obtener-el-token-push-de-mi-dispositivo-android)
* [¿Qué permisos son necesarios y cuáles son opcionales?](#que-permisos-son-necesarios-y-cuales-son-opcionales)
* [¿Cómo configuro un UserID?](#como-configuro-un-userid)
* [¿Qué tan preciso es el número total de suscriptores de Android?](#que-tan-preciso-es-el-numero-total-de-suscriptores-de-android)
* [¿Puedo usar etiquetas HTML en las notificaciones push enviadas a Android?](#puedo-usar-etiquetas-html-en-las-notificaciones-push-enviadas-a-android)
* [¿Cómo configurar un icono de notificación en Android Lollipop (y versiones posteriores)?](#como-configurar-un-icono-de-notificacion-en-android-lollipop-y-versiones-posteriores)
* [Usar el SDK de Pushwoosh con otros servicios de FCM](#usar-el-sdk-de-pushwoosh-con-otros-servicios-de-fcm)
* [Usar Pushwoosh con las bibliotecas LeakCanary o AppMetrica](#usar-pushwoosh-con-las-bibliotecas-leakcanary-o-appmetrica)
* [Eliminar una notificación recibida de un dispositivo](#eliminar-notificaciones-recibidas-especificas-de-un-dispositivo-localmente)

### ¿Qué aspecto tienen el token push de Android y el HWID?

Los tokens push de dispositivos Android difieren en longitud (menos de 255 caracteres) y comienzan con **APA91b**, por ejemplo:

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

Los tokens a menudo contienen un prefijo separado por dos puntos antes de **APA91b**, por ejemplo: `eQnyCE6ULAQ:APA91bGrh4ya3b_owo9tshZNVAGhZdGMGb3sA5HbM...`

Pushwoosh utiliza UUID como HWID, es decir, cadenas generadas aleatoriamente de 32 caracteres alfanuméricos: `123e4567-e89b-12d3-a456-426655440000`

### ¿Cómo puedo obtener el token push de mi dispositivo Android?

Puede obtener el token push de su dispositivo Android en el registro de la consola. Use la herramienta logcat en [Android Studio](https://developer.android.com/studio).

Abra **monitor.bat** en `%USERPROFILE%\AppData\Local\Android\sdk\tools\monitor.bat`, conecte su dispositivo a la PC y permita la depuración USB en la configuración de Android. Ejecute su aplicación en el dispositivo. Localice `/registerDevice`, encuentre el token push para su dispositivo para usarlo más tarde en Dispositivos de Prueba.

<img src="/android-push-notifications-android-faq-1.webp" alt="Captura de pantalla que muestra la salida de logcat con la información de registro del token push en Android Studio"/>

### ¿Qué permisos son necesarios y cuáles son opcionales?

Cuando se instala en un dispositivo Android, la aplicación solicitará los siguientes permisos en conexión con el SDK de Pushwoosh:

```java
<!-- FCM se conecta a los servicios de Firebase. -->
 <uses-permission android:name="android.permission.INTERNET"/>

<!-- Evita que el procesador entre en modo de suspensión cuando se recibe un mensaje. -->
 <uses-permission android:name="android.permission.WAKE_LOCK"/>

 <!-- Este permiso se usa para determinar si el dispositivo puede acceder a la red. -->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- Esta aplicación tiene permiso para registrarse y recibir mensajes de datos. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
```

Nuestro SDK no solicita permiso para acceder a imágenes, contactos del dispositivo, etc.

### ¿Cómo configuro un UserID?

Puede establecer un [identificador de usuario (UserID)](/es/developer/first-steps/collecting-user-ids/), que podría ser un ID de Facebook, nombre de usuario, correo electrónico o cualquier otro ID de usuario único. Esto le permite hacer coincidir datos y eventos en múltiples dispositivos asociados con el mismo usuario. Para establecer el UserID, llame al método **setUserId**.

**Ejemplo**

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

### ¿Qué tan preciso es el número total de suscriptores de Android?

Pushwoosh elimina los dispositivos Android no suscritos de la base de datos al recibir la respuesta "NotRegistered" de FCM, que puede devolverse después del segundo intento de contactar un dispositivo específico. Esto significa que debe enviar 2 notificaciones push a un dispositivo no suscrito para que se elimine de la base de datos.

El siguiente es el escenario más común descrito en la [documentación de FCM](https://firebase.google.com/docs/cloud-messaging/):

1. Su suscriptor desinstala la aplicación.
2. Pushwoosh envía un mensaje al servidor FCM.
3. El servidor FCM envía el mensaje al dispositivo de su usuario.
4. El cliente FCM en el dispositivo recibe el mensaje y detecta que su aplicación ha sido desinstalada; los detalles de la detección dependen de la plataforma en la que se ejecuta la aplicación.
5. El cliente FCM en el dispositivo informa al servidor FCM que la aplicación fue desinstalada.
6. El servidor FCM marca el ID de registro para su eliminación.
7. Pushwoosh envía otro mensaje a FCM.
8. FCM devuelve un mensaje NotRegistered.
9. Pushwoosh elimina el token push de su base de usuarios.

Puede tomar un tiempo para que el ID de registro se elimine por completo de FCM. Por lo tanto, es posible que un mensaje enviado en el paso 7 anterior obtenga un ID de mensaje válido como respuesta, aunque el mensaje no se entregará a la aplicación cliente.

### ¿Puedo usar etiquetas HTML en las notificaciones push enviadas a Android?

Sí, en Android puede usar las siguientes etiquetas HTML para modificar la apariencia de una notificación push:

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

Coloque estas etiquetas HTML en el campo de entrada **Mensaje** y úselas también en la solicitud de la API. Es posible que algunos dispositivos Android no procesen estas etiquetas HTML correctamente, pero la mayoría de los dispositivos muestran el formato correctamente.

### ¿Cómo configurar un icono de notificación en Android Lollipop (y versiones posteriores)?

En Android Lollipop, los iconos se cambiaron para que fueran solo blancos. Por lo tanto, si selecciona **targetSdkVersion >= 21** en su archivo **AndroidManifest.xml**, Android solo usará el canal alfa del icono.\
Vea más sobre el comportamiento en la [documentación de Android](https://developer.android.com/docs).

El sistema ignora todos los canales no alfa en los iconos de acción y en el icono de notificación principal. Asuma que estos iconos serán solo alfa. El sistema dibuja los iconos de notificación en blanco y los iconos de acción en gris oscuro. _Esto está fuera del control del SDK de Pushwoosh_.

**1.** Cree el icono de notificación de acuerdo con las [directrices de Android](https://material.io/design/platform-guidance/android-notifications.html#style). Según la [documentación](https://developer.android.com/about/versions/lollipop/android-5.0-changes), el sistema ignorará todos los colores.

**2.** Nombre el icono como `pw_notification.png` y colóquelo en la carpeta **res/drawable**. El SDK de Pushwoosh usará este icono como predeterminado para las notificaciones.

**3.** Alternativamente, puede usar la API remota y establecer el valor del parámetro `"android_icon"` en la imagen del icono (sin extensión de archivo).

### Usar el SDK de Pushwoosh con otros servicios de FCM

Puede usar Pushwoosh junto con otros SDK que usan FCM para la mensajería push. Para hacerlo, cree un servicio de enrutador para distribuir eventos entre los servicios. Primero, agregue la dependencia **pushwoosh-firebase** junto con el módulo principal de Pushwoosh:

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

Cree la clase de enrutamiento:

<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)) {
           //esta es una notificación push de Pushwoosh, el SDK la manejará automáticamente
            PushwooshFcmHelper.onMessageReceived(this, remoteMessage)
        } else {
            //esta no es una notificación push de Pushwoosh, debe manejarla usted mismo
            dispatchNonPushwooshMessage(remoteMessage);
        }
    }

    private fun dispatchNonPushwooshMessage(remoteMessage: RemoteMessage) {
       // Implemente su lógica de manejo de notificaciones push aquí
   }
}
```
</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)) {
            //esta es una notificación push de Pushwoosh, el SDK la manejará automáticamente
            PushwooshFcmHelper.onMessageReceived(this, remoteMessage);
        } else {
            //esta no es una notificación push de Pushwoosh, debe manejarla usted mismo
            dispatchNonPushwooshMessage(remoteMessage);
        }
    }

    private void dispatchNonPushwooshMessage(RemoteMessage remoteMessage) {
        // Implemente su lógica de manejo de notificaciones push aquí
    }
}
```
</TabItem>
</Tabs>

Registre los enrutadores en su AndroidManifest.xml:

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

### Usar Pushwoosh con las bibliotecas LeakCanary o AppMetrica

Cuando integra herramientas de análisis como LeakCanary, AppMetrica u otras, estas bibliotecas inician un nuevo proceso, creando una nueva instancia de la aplicación. Dado que no puede escuchar las notificaciones push en otro proceso, esto da como resultado que se lance una `java.lang.NullPointerException`.

Si llama a `registerForPushNotifications` dentro de `Application.onCreate()`, debe verificar si se encuentra en el proceso principal de la aplicación. Use el siguiente código para realizar esta verificación:

```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;
        }
    }
}
```

### Eliminar notificaciones recibidas específicas de un dispositivo localmente

Si desea eliminar una notificación push no relevante al realizar una acción específica dentro de su aplicación, puede usar el siguiente enfoque:

```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;

				//cancelar notificaciones push solo con una bandera específica
				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());
		}
	}
}
```

## Comparta sus comentarios con nosotros

Sus comentarios nos ayudan a crear una mejor experiencia. Si encuentra alguna dificultad durante el proceso de integración del SDK, comparta sus pensamientos con nosotros [a través de este formulario](https://docs.google.com/forms/d/e/1FAIpQLSd_0b8jwn-V_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).