# Uso del módulo de localización de Pushwoosh en aplicaciones de Android

<Aside type="caution">
Tenga en cuenta que la mensajería basada en la geolocalización no está disponible para dispositivos HMS (Huawei Mobile Services), ya que se basa en los servicios de localización de Google.
</Aside>

Existen dos categorías de acceso a la localización en Android:

*   **Acceso a la localización en primer plano**
*   **Acceso a la localización en segundo plano**

Para actualizar la ubicación del usuario en **primer plano**, se debe cumplir una de las siguientes condiciones:

*   Una de las actividades de la aplicación está activa
*   Se ha iniciado un servicio en primer plano del tipo foregroundServiceType = “location” para la aplicación

El acceso en **segundo plano** permite a la aplicación obtener la geolocalización del usuario mientras la aplicación está inactiva y no se han iniciado servicios en primer plano del tipo “location” para esa aplicación.

## Acceso a la localización en primer plano

Si va a utilizar el módulo de localización de Pushwoosh para actualizar la ubicación del usuario solo cuando su aplicación esté activa, añada el módulo `pushwoosh-location` a su **app/build.gradle**:

```java title="build.gradle"
implementation 'com.pushwoosh:pushwoosh-location:6.+'
```

<Aside>
Obtenga la última versión del módulo en el repositorio de Github de Pushwoosh: [https://github.com/Pushwoosh/pushwoosh-android-sdk/releases](https://github.com/Pushwoosh/pushwoosh-android-sdk/releases)
</Aside>

Para iniciar el módulo, utilice el método `startLocationTracking`:

<Tabs>
<TabItem label="Java">
```java
PushwooshLocation.startLocationTracking();
```
</TabItem>

<TabItem label="Kotlin">
```kotlin
PushwooshLocation.startLocationTracking()
```
</TabItem>
</Tabs>

<Aside type="note">
El módulo `pushwoosh-location` solicitará todos los permisos necesarios al usuario (ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION).
</Aside>

## Uso de ForegroundService para realizar solicitudes de localización cuando su aplicación está en segundo plano

<Aside type="caution" title="Obsoleto">

Debido a las actualizaciones de Android 12, ForegroundService no puede funcionar correctamente, por lo que está obsoleto y se eliminará del SDK de Pushwoosh en el futuro.

Aquí hay algunas soluciones para rastrear la ubicación de los usuarios en segundo plano:

1.  Utilice targetSdkVersion 30 en lugar de 31. Tenga en cuenta que las características presentes en Android 12 no estarán disponibles en ese caso.
2.  Pida a sus usuarios que desactiven la optimización de la batería para su aplicación para permitir que el ForegroundService se inicie en segundo plano.
</Aside>

Para iniciar el **ForegroundService** cuando se llama al método `startLocationTracking`, lo que permite obtener la geolocalización del usuario cuando su aplicación está en segundo plano, siga los pasos descritos en el [párrafo anterior](#acceso-a-la-localizacin-en-primer-plano) y, a continuación, añada los siguientes metadatos a su **AndroidManifest.xml**:

```txt
...
<application>
....
    <meta-data
        android:name="com.pushwoosh.start_foreground_service"
        android:value="true" />
...
</application>
...
```

Cuando se inicia el **ForegroundService**, se crea una notificación. Puede personalizar la notificación especificando los metadatos adicionales en el **AndroidManifest.xml** de su proyecto:

```txt
...
<application>
....
    <meta-data
        android:name="com.pushwoosh.foreground_service_notification_text"
        android:value="My notification text" />
    <meta-data
        android:name="com.pushwoosh.foreground_service_notification_channel_name"
        android:value="My notification channel name" />
...
</application>
...
```

## Acceso a la localización en segundo plano

Para actualizar la geolocalización en segundo plano sin iniciar un ForegroundService, necesitará lo siguiente:

*   Obtener la aprobación de Google Play para que su aplicación acceda a la localización en segundo plano (consulte [https://support.google.com/googleplay/android-developer/answer/9799150?hl=es](https://support.google.com/googleplay/android-developer/answer/9799150?hl=es) para más detalles)
*   Añadir el permiso a su AndroidManifest.xml:

```txt
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
```

*   Solicitar el permiso del usuario para actualizar la localización en segundo plano después de recibir el permiso de localización en primer plano (encuentre las directrices en la documentación para desarrolladores de Android: [https://developer.android.com/training/location/permissions#background-dialog-target-android-11](https://developer.android.com/training/location/permissions#background-dialog-target-android-11) )

En la versión 6.3.2 del módulo `pushwoosh-location`, hemos incluido un método adicional que abre la pantalla de configuración de permisos de localización si se cumplen las siguientes condiciones:

*   La aplicación tiene concedido el permiso de localización en primer plano;
*   El permiso de usuario `ACCESS_BACKGROUND_LOCATION` está presente en el AndroidManifest.xml de la aplicación.

<Aside type="caution">
Asegúrese de explicar claramente a los usuarios por qué razones y con qué fines su aplicación necesita acceso a su localización en segundo plano. Consulte las [guías para desarrolladores de Android](https://developer.android.com/training/location/permissions#background-dialog-target-android-11) para más detalles.
</Aside>

Llame al método de la siguiente manera:

<Tabs>
<TabItem label="Java">
```java
PushwooshLocation.requestBackgroundLocationPermission();
```
</TabItem>

<TabItem label="Kotlin">
```
PushwooshLocation.requestBackgroundLocationPermission()
```
</TabItem>
</Tabs>

## Tipos de permiso en Android 12+

[A partir de Android 12](https://developer.android.com/about/versions/12/approximate-location), cuando se le solicita el permiso de acceso a la localización en primer plano, un usuario puede elegir con qué frecuencia y con qué precisión la aplicación obtendrá su localización.

Hay dos tipos de permisos:

1.  Localización aproximada, que es igual a ACCESS_COARSE_LOCATION
2.  Localización precisa, que es igual a ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION

<Aside type="caution">
Tenga en cuenta que las solicitudes de localización de aplicaciones con Manifest.permission.ACCESS_COARSE_LOCATION y no Manifest.permission.ACCESS_FINE_LOCATION se limitarán automáticamente a un intervalo más lento, y el objeto de localización se ofuscará para mostrar solo un nivel de precisión aproximado. Consulte [https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest](https://developers.google.com/android/reference/com/google/android/gms/location/LocationRequest) para más detalles.
</Aside>

<Aside type="note">
Tenga en cuenta que el nivel de precisión depende del permiso que solicite:

*   ACCESS_COARSE_LOCATION – Proporciona una estimación de la localización del dispositivo, con una precisión de aproximadamente 1 milla (1,6 km).
*   ACCESS_FINE_LOCATION – Proporciona una estimación de la localización del dispositivo lo más precisa posible, generalmente dentro de unos 160 pies (50 metros) y a veces tan precisa como dentro de 10 pies (unos pocos metros) o mejor.

Fuente: [https://developer.android.com/training/location/permissions](https://developer.android.com/training/location/permissions)
</Aside>

## Comparta sus comentarios con nosotros

Sus comentarios nos ayudan a crear una mejor experiencia, por lo que nos encantaría saber de usted si tiene algún problema durante el proceso de integración del SDK. Si se enfrenta a alguna dificultad, no dude en compartir sus opiniones con nosotros [a través de este formulario](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).