SMS检索器API在模拟器中不起作用

时间:2019-01-28 18:54:49

标签: android sms google-play-services

@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鼓励使用其SMS Reytriever API的建议方式。此方法旨在在BroadcastReceiver查找传入的SMS消息之前启动客户端。这里的问题是,永远不会调用onSuccess和onFailure,它们都不被调用,仅在Android模拟器中发生。我放置了一些断点和日志以确认这一点,客户端从不通知发生了什么。

这不是哈希问题,因为这仅与SmsRetrieverClient的初始化有关。

我真的很困惑,不知道发生了什么。从不通知侦听器是任何人都不会想到的行为,我什至认为该问题可能与其他因素有关,因为我重新格式化了计算机并重新安装了最新的Android Studio,因为在此之前,此代码在两个模拟器上均有效和物理设备。

1 个答案:

答案 0 :(得分:1)

尝试在第二行中删除多余的client.startSmsRetriever();

确保模拟器/设备上的播放服务版本为> 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;