API SMS Retriever не работает в эмуляторе - PullRequest
0 голосов
/ 28 января 2019
@Override
public void startClient(final Callback callback) {
    SmsRetrieverClient client = SmsRetriever.getClient(context);
    client.startSmsRetriever();
    Task<Void> task = client.startSmsRetriever();
    task.addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            callback.onSuccess();
        }
    });
    task.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            callback.onFail(e);
        }
    });
}

Приведенный выше код является рекомендуемым способом, который Google рекомендует использовать их API-интерфейс SMS Reytriever.Этот метод предназначен для запуска клиента до того, как BroadcastReceiver выполнит поиск входящих SMS-сообщений.Проблема здесь в том, что onSuccess и onFailure никогда не вызываются, ни один из них, и происходит только с эмуляторами Android.Я поставил несколько точек останова и логов, чтобы подтвердить это, клиент никогда не уведомляет о том, что произошло.

Это не проблема хеширования, поскольку она связана только с инициализацией SmsRetrieverClient.

Я действительно смущен и не знаю, что происходит.Никогда не уведомлять слушателя - это поведение, которого никто не ожидал, я даже думаю, что эта проблема может быть связана с другими факторами, так как я недавно отформатировал свой компьютер и переустановил последнюю версию Android Studio, потому что до этого этот код работал на обоих эмуляторахи физические устройства.

1 Ответ

0 голосов
/ 28 января 2019

Попробуйте удалить избыточную client.startSmsRetriever(); во второй строке.

Убедитесь, что версия службы воспроизведения на вашем эмуляторе / устройстве имеет>> 1004 * 10.2.0

Выможете проверить версию сервисов воспроизведения, используя -

private static final String MIN_SUPPORTED_PLAY_SERVICES_VERSION = "10.2";

public static boolean isSmsRetrieverApiAvailable(Context context) {

    if (!isPlayServicesAvailable(context)) {
        return false;
    }

    try {
        String playServicesVersionName = context.getPackageManager().getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0).versionName; // should be >10.2.0
        return playServicesVersionName.compareTo(MIN_SUPPORTED_PLAY_SERVICES_VERSION) > 0;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

private static boolean isPlayServicesAvailable(Context context) {
    GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
    int resultCode = googleApiAvailability.isGooglePlayServicesAvailable(context);
    return resultCode == ConnectionResult.SUCCESS;
...