O segundo Visualização do Desenvolvedor do Android 11 já está disponível, teste e compartilhe seu feedback.

API SafetyNet Verify Apps

A API SafetyNet Verify Apps permite que seu app interaja programaticamente com o recurso Verificar apps em um dispositivo, o que protege o dispositivo contra aplicativos potencialmente nocivos.

Se seu app processa dados confidenciais do usuário, como informações financeiras, confirme se o dispositivo atual está protegido contra apps maliciosos e não possui apps que possam fingir ser o app ou realizar outras ações maliciosas. Se a segurança do dispositivo não cumpre a abordagem de segurança mínima, você pode desativar a funcionalidade no seu app para reduzir o perigo para o usuário.

Como parte do compromisso contínuo de tornar o ecossistema do Android o mais seguro possível, o Google monitora e cria perfis de comportamento dos apps para Android. Se o recurso Verificar apps detectar um app potencialmente nocivo, todos os usuários que instalaram o app serão notificados e incentivados a desinstalá-lo imediatamente. Esse processo protege a segurança e a privacidade desses usuários.

A API SafetyNet Verify Apps permite que você use esse recurso para proteger os dados do seu app. Com essa API, você pode determinar se o dispositivo de um usuário é protegido pelo recurso Verificar apps, incentivar os usuários que ainda não usam o recurso a ativar a proteção dele e identificar os apps potencialmente nocivos conhecidos que estão instalados no dispositivo.

Cuidado: ainda que o SafetyNet alerte os usuários sobre apps potencialmente nocivos, alguns usuários optam por não desinstalar esses apps ou não veem a notificação de aviso. Portanto, um dispositivo pode ter apps potencialmente nocivos instalados mesmo quando o recurso Verificar apps está ativado.

Outros Termos de Serviço

Ao acessar ou usar as APIs SafetyNet, você concorda com os Termos de Serviço das APIs Google e com estes Outros Termos. Leia e entenda todos os termos e políticas aplicáveis antes de acessar as APIs.

Termos de Serviço da API Verify Apps

As análises que identificam apps potencialmente nocivos podem resultar em falsos positivos e falsos negativos. Os resultados (ou a falta deles) retornados desse conjunto de APIs são apresentados da melhor forma possível. Você reconhece e entende que os resultados retornados por esse conjunto da API SafetyNet não têm garantia de serem precisos em todos os momentos.

Ativar a verificação de apps

A API SafetyNet Verify Apps oferece dois métodos para ativar o recurso Verificar apps. Você pode determinar se a verificação de apps está habilitada usando isVerifyAppsEnabled() e solicitar a ativação da verificação de apps usando enableVerifyApps().

A diferença entre esses dois métodos é que, enquanto isVerifyAppsEnabled() informa o status atual do recurso Verificar apps, enableVerifyApps() pede explicitamente ao usuário permissão para usar o recurso. Se você quer que seu app só esteja ciente do status do recurso para tomar decisões voltadas à segurança, o app precisa chamar isVerifyAppsEnabled(). No entanto, se você quiser garantir que seu app possa listar os apps potencialmente nocivos instalados, chame enableVerifyApps().

Determinar se a verificação de apps está ativada

O método assíncrono isVerifyAppsEnabled() permite que seu app determine se o usuário está inscrito no recurso Verificar apps. Esse método retorna um objeto VerifyAppsUserResult, que contém informações sobre todas as ações que o usuário tenha tomado com relação ao recurso "Verificar apps", incluindo a ativação dele.

O snippet de código a seguir mostra como criar o callback associado a esse 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.");
                }
            }
        });
    

Solicitar a ativação da verificação de apps

O método assíncrono enableVerifyApps() permite que seu app invoque uma caixa de diálogo solicitando que o usuário ative o recurso Verificar apps. Esse método retorna um objeto VerifyAppsUserResult, que contém informações sobre todas as ações que o usuário tenha tomado com relação ao recurso "Verificar apps", inclusive se foi concedida permissão para a ativação dele.

O snippet de código a seguir mostra como criar o callback associado a esse 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.");
                }
            }
        });
    

Seu app pode encontrar vários casos isolados ao usar esse método:

  • Se o recurso Verificar apps já estiver ativado, a caixa de diálogo não será exibida e a API se comportará como se o usuário tivesse acabado de dar permissão para ativar esse recurso.
  • Se o usuário sair da caixa de diálogo, ela será destruída, e a API presumirá que o usuário não autorizou a ativação desse recurso.
  • Se seu aplicativo e outro app chamarem esse método simultaneamente, apenas uma caixa de diálogo será exibida, e todos os apps receberão valores de retorno idênticos do método.

Listar apps potencialmente nocivos instalados

O método listHarmfulApps() assíncrono permite que você receba uma lista de todos os apps potencialmente nocivos conhecidos que o usuário tenha instalado no dispositivo. Essa lista inclui categorias para os apps potencialmente nocivos identificados para que seu app possa tomar as medidas adequadas.

O snippet de código a seguir mostra como criar o callback associado a esse 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.");
                }
            }
        });