La Vista previa para desarrolladores de Android 11 ya está disponible. Pruébala y comparte tus comentarios.

API de Verificar aplicaciones de SafetyNet

La API de Verificar aplicaciones de SafetyNet permite que tu app interactúe de manera programática con la función Verificar aplicaciones de un dispositivo, lo que lo protege contra apps potencialmente dañinas.

Si tu app maneja datos sensibles del usuario, como información financiera, debes confirmar que el dispositivo actual está protegido contra apps maliciosas y que no cuenta con apps que puedan suplantarlo o realizar otras acciones maliciosas. Si la seguridad del dispositivo no cumple con las medidas de seguridad mínimas, puedes inhabilitar la funcionalidad dentro de tu propia app a fin de reducir el peligro para el usuario.

Como parte de su compromiso continuo de hacer que el ecosistema de Android sea lo más seguro posible, Google supervisa y perfila el comportamiento de las apps de Android. Si la función Verificar aplicaciones detecta una app potencialmente peligrosa, se notifica a todos los usuarios que la instalaron y se les recomienda que la desinstalen de inmediato. Este proceso protege la seguridad y la privacidad de estos usuarios.

La API de Verificar aplicaciones de SafetyNet te permite aprovechar esta función para proteger los datos de tu app. Si usas esta API, puedes determinar si el dispositivo de un usuario está protegido por la función Verificar aplicaciones, alentar a los usuarios que aún no la usan a que comiencen a hacerlo e identificar cualquier app conocida potencialmente dañina que esté instalada en el dispositivo.

Precaución: Aunque SafetyNet alerta a los usuarios sobre apps potencialmente dañinas, algunos optan por no desinstalar estas apps o no ven la notificación de advertencia. Por lo tanto, un dispositivo podría tener instaladas este tipo de aplicaciones, incluso cuando la función Verificar aplicaciones está habilitada.

Condiciones del Servicio adicionales

Cuando accedes a las API de SafetyNet o las usas, aceptas las Condiciones del Servicio de las API de Google y estas Condiciones adicionales. Asegúrate de leer y entender todos los términos y las políticas aplicables antes de acceder a las API.

Verifica las Condiciones del Servicio de la API de Verificar aplicaciones

Los análisis de apps que identifican aplicaciones potencialmente dañinas pueden generar falsos positivos y falsos negativos. Los resultados (o la falta de ellos) que se muestran en este paquete de API se presentan de la mejor manera posible. Reconoces y comprendes que no se garantiza que los resultados que muestra este paquete de API de SafetyNet sean exactos en todo momento.

Cómo habilitar la verificación de apps

La API de Verificar aplicaciones de SafetyNet proporciona dos métodos para habilitar la función Verificar aplicaciones. Puedes determinar si la verificación de apps está habilitada usando isVerifyAppsEnabled(), y puedes solicitar la habilitación de la verificación de apps usando enableVerifyApps().

La diferencia entre estos dos métodos es que mientras isVerifyAppsEnabled() informa el estado actual de la función Verificar aplicaciones, enableVerifyApps() solicita de manera explícita al usuario su consentimiento para usar la función. Si deseas que tu app solo conozca el estado de la función para tomar una decisión basada en la seguridad, debes llamar a isVerifyAppsEnabled(). Sin embargo, si quieres asegurarte de que tu app pueda enumerar las apps instaladas que son potencialmente dañinas, debes llamar a enableVerifyApps().

Cómo determinar si la verificación de apps está habilitada

El método isVerifyAppsEnabled() asíncrono permite que tu app determine si el usuario habilitó la función Verificar aplicaciones. Este método muestra un objeto VerifyAppsUserResult, que contiene información sobre todas las acciones que el usuario realizó en relación con la función Verificar aplicaciones, incluida la habilitación.

En el siguiente fragmento de código, se muestra cómo crear la devolución de llamada asociada con este método:

Kotlin

    SafetyNet.getClient(this)
            .isVerifyAppsEnabled
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    if (task.result.isVerifyAppsEnabled) {
                        Log.d("MY_APP_TAG", "The Verify Apps feature is enabled.")
                    } else {
                        Log.d("MY_APP_TAG", "The Verify Apps feature is disabled.")
                    }
                } else {
                    Log.e("MY_APP_TAG", "A general error occurred.")
                }
            }
    

Java

    SafetyNet.getClient(this)
        .isVerifyAppsEnabled()
        .addOnCompleteListener(new OnCompleteListener<VerifyAppsUserResponse>() {
            @Override
            public void onComplete(Task<VerifyAppsUserResponse> task) {
                if (task.isSuccessful()) {
                    VerifyAppsUserResponse result = task.getResult();
                    if (result.isVerifyAppsEnabled()) {
                        Log.d("MY_APP_TAG", "The Verify Apps feature is enabled.");
                    } else {
                        Log.d("MY_APP_TAG", "The Verify Apps feature is disabled.");
                    }
                } else {
                    Log.e("MY_APP_TAG", "A general error occurred.");
                }
            }
        });
    

Cómo solicitar la habilitación de la verificación de apps

El método enableVerifyApps() asíncrono permite que tu app invoque un diálogo a fin de solicitar que el usuario habilite la función Verificar aplicaciones. Este método muestra un objeto VerifyAppsUserResult, que contiene información sobre todas las acciones que el usuario realizó en relación con la función Verificar aplicaciones, incluido su consentimiento para habilitarla.

En el siguiente fragmento de código, se muestra cómo crear la devolución de llamada asociada con este método:

Kotlin

    SafetyNet.getClient(this)
            .enableVerifyApps()
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    if (task.result.isVerifyAppsEnabled) {
                        Log.d("MY_APP_TAG", "The user gave consent to enable the Verify Apps feature.")
                    } else {
                        Log.d(
                                "MY_APP_TAG",
                                "The user didn't give consent to enable the Verify Apps feature."
                        )
                    }
                } else {
                    Log.e("MY_APP_TAG", "A general error occurred.")
                }
            }
    

Java

    SafetyNet.getClient(this)
        .enableVerifyApps()
        .addOnCompleteListener(new OnCompleteListener<VerifyAppsUserResponse>() {
            @Override
            public void onComplete(Task<VerifyAppsUserResponse> task) {
                if (task.isSuccessful()) {
                    VerifyAppsUserResponse result = task.getResult();
                    if (result.isVerifyAppsEnabled()) {
                        Log.d("MY_APP_TAG", "The user gave consent " +
                              "to enable the Verify Apps feature.");
                    } else {
                        Log.d("MY_APP_TAG", "The user didn't give consent " +
                              "to enable the Verify Apps feature.");
                    }
                } else {
                    Log.e("MY_APP_TAG", "A general error occurred.");
                }
            }
        });
    

Tu app puede encontrar varios casos límite cuando usa este método:

  • Si la función Verificar aplicaciones ya está habilitada, el diálogo no aparece y la API se comporta como si el usuario hubiera dado su consentimiento para habilitar la función.
  • Si el usuario se aleja del diálogo, este se destruye y la API asume que el usuario no dio su consentimiento para habilitar la función.
  • Si tu app y otra app llaman a este método de forma simultánea, solo aparecerá un diálogo, y el método mostrará a las apps valores idénticos.

Lista de aplicaciones potencialmente dañinas instaladas

El listHarmfulApps() asíncrono permite obtener una lista de todas las aplicaciones potencialmente dañinas que el usuario instaló en su dispositivo. Esta lista incluye categorías para estas aplicaciones identificadas, a fin de que tu app pueda tomar las medidas adecuadas.

En el siguiente fragmento de código, se muestra cómo crear la devolución de llamada asociada con este método:

Kotlin

    SafetyNet.getClient(this)
            .listHarmfulApps()
            .addOnCompleteListener { task ->
                Log.d(TAG, "Received listHarmfulApps() result")

                if (task.isSuccessful) {
                    val result = task.result
                    val scanTimeMs = result.lastScanTimeMs

                    val appList = result.harmfulAppsList
                    if (appList?.isNotEmpty() == true) {
                        Log.e("MY_APP_TAG", "Potentially harmful apps are installed!")

                        for (harmfulApp in appList) {
                            Log.e("MY_APP_TAG", "Information about a harmful app:")
                            Log.e("MY_APP_TAG", "  APK: ${harmfulApp.apkPackageName}")
                            Log.e("MY_APP_TAG", "  SHA-256: ${harmfulApp.apkSha256}")

                            // Categories are defined in VerifyAppsConstants.
                            Log.e("MY_APP_TAG", "  Category: ${harmfulApp.apkCategory}")
                        }
                    } else {
                        Log.d("MY_APP_TAG", "There are no known potentially harmful apps installed.")
                    }
                } else {
                    Log.d(
                            "MY_APP_TAG",
                            "An error occurred. Call isVerifyAppsEnabled() to ensure that the user "
                                    + "has consented."
                    )
                }
            }
    

Java

    SafetyNet.getClient(this)
        .listHarmfulApps()
        .addOnCompleteListener(new OnCompleteListener<HarmfulAppsResponse>() {
            @Override
            public void onComplete(Task<HarmfulAppsResponse> task) {
                Log.d(TAG, "Received listHarmfulApps() result");

                if (task.isSuccessful()) {
                    HarmfulAppsResponse result = task.getResult();
                    long scanTimeMs = result.getLastScanTimeMs();

                    List<HarmfulAppsData> appList = result.getHarmfulAppsList();
                    if (appList.isEmpty()) {
                        Log.d("MY_APP_TAG", "There are no known " +
                              "potentially harmful apps installed.");
                    } else {
                        Log.e("MY_APP_TAG",
                              "Potentially harmful apps are installed!");

                        for (HarmfulAppsData harmfulApp : appList) {
                            Log.e("MY_APP_TAG", "Information about a harmful app:");
                            Log.e("MY_APP_TAG",
                                  "  APK: " + harmfulApp.apkPackageName);
                            Log.e("MY_APP_TAG",
                                  "  SHA-256: " + harmfulApp.apkSha256);

                            // Categories are defined in VerifyAppsConstants.
                            Log.e("MY_APP_TAG",
                                  "  Category: " + harmfulApp.apkCategory);
                        }
                    }
                } else {
                    Log.d("MY_APP_TAG", "An error occurred. " +
                          "Call isVerifyAppsEnabled() to ensure " +
                          "that the user has consented.");
                }
            }
        });