как инициализировать окончательный переменный логический массив в методе void - PullRequest
0 голосов
/ 15 ноября 2018

мое приложение проверит, активированы ли настройки защиты от воспроизведения.

public static boolean checkGooglePlayProtectSettings(Context context){
    final boolean[] enabled = new boolean[]{false};
    try{
        SafetyNet.getClient(context).isVerifyAppsEnabled().addOnCompleteListener(new OnCompleteListener<SafetyNetApi.VerifyAppsUserResponse>() {

            @Override
                    public void onComplete(@NonNull Task<SafetyNetApi.VerifyAppsUserResponse> task) {
                        if(task.isSuccessful()){
                            SafetyNetApi.VerifyAppsUserResponse result = task.getResult();
                            if(result != null){
                                if(result.isVerifyAppsEnabled()){
                                    enabled[0] = true;
                                }else{
                                    enabled[0] = false;

                                }
                            }
                        }else{
                            Log.e("GoogleProtectPermission", "A general error occurred.");
                        }
                    }
                });
    }catch (Exception e){
        e.printStackTrace();
    }

    if (enabled[0]){
        Log.d("GoogleProtectPermission", "Is enabled");
    }else {
        Log.d("GoogleProtectPermission", "Is disabled");
    }
    return false;
}

в этом случае я пытался записать окончательные результаты, но всегда не активен в результатах журнала. Как получить хорошие результаты, чтобы проверить, активен ли режим воспроизведения или нет?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Метод isVerifyAppsEnabled() является асинхронным, он вызывает метод OnCompleteListener onComplete, чтобы уведомить о готовности результата.

Вероятно, этот блок выполняется до запуска OnCompleteListener, поэтому значение enabled[0] остается неизменным на этом этапе.

if (enabled[0]) {
    Log.d("GoogleProtectPermission", "Is enabled");
} else {
    Log.d("GoogleProtectPermission", "Is disabled");
}

Поскольку синхронного метода для получения нетв результате вам, вероятно, придется каким-то образом изменить свой подход, чтобы учесть эту асинхронность и выполнить зависимые операции, когда результаты обратного вызова готовы или ( крайне не рекомендуется ) выполнить блокирующее ожидание до тех пор, пока не вернется Taskна isVerifyAppsEnabled завершено.

Кроме того, не обращая внимания на вопрос, в вашем текущем коде, похоже, нет смысла использовать логический массив вместо просто логического для этого, и это

if(result.isVerifyAppsEnabled()) {
    enabled[0] = true;
} else {
    enabled[0] = false;
}

можно упростить до этого enabled[0] = result.isVerifyAppsEnabled()

0 голосов
/ 15 ноября 2018

Вы можете сделать так:

final StringBuilder sb = new StringBuilder();
...
if(result.isVerifyAppsEnabled()){
    sb.append("good");
}else{
    sb.append("bad");
}
...
if(sb.toString().equals("good")){
    Log.d("GoogleProtectPermission", "Is enabled");
}
if(sb.toString().equals("bad")){
    Log.d("GoogleProtectPermission", "Is disabled");
}

Отредактировано: Да, в качестве комментариев, Мой ответ неверный.поэтому есть два способа:

1 напрямую выводить информацию журнала

   if(result.isVerifyAppsEnabled()){
       Log.d("GoogleProtectPermission", "Is enabled");
    }else{
        Log.d("GoogleProtectPermission", "Is disabled");
    }

2, используя интерфейсный обратный вызов

   public interface Callback {  //add an interface 
        void onResponse(String message);
    }

    final StringBuilder sb = new StringBuilder();
    ...
    if(result.isVerifyAppsEnabled()){
        sb.append("good");
    }else{
        sb.append("bad");
    }
    callback.onResponse(sb.toString()); //add this line

и подписывать интерфейс в каком-то месте.

...