SMS Retriever API 在模拟器中不工作
SMS Retriever API not working in emulator
@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 查找传入的短信之前启动客户端。这里的问题是永远不会调用 onSuccess 和 onFailure,其中 none 个,并且只发生在 Android 个模拟器上。我放置了一些断点和日志来确认这一点,客户端从不通知发生了什么。
这不是哈希问题,因为这仅与 SmsRetrieverClient 的初始化有关。
我真的很困惑,不知道发生了什么。从不通知听众是一种没有人会想到的行为,我什至认为这个问题可能与其他因素有关,因为我最近格式化了我的电脑并重新安装了最新的Android Studio,因为在此之前这段代码是在模拟器和物理设备上工作。
尝试删除第二行中多余的 client.startSmsRetriever();
。
确保 emulator/device 上的播放服务版本 > 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;
@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 查找传入的短信之前启动客户端。这里的问题是永远不会调用 onSuccess 和 onFailure,其中 none 个,并且只发生在 Android 个模拟器上。我放置了一些断点和日志来确认这一点,客户端从不通知发生了什么。
这不是哈希问题,因为这仅与 SmsRetrieverClient 的初始化有关。
我真的很困惑,不知道发生了什么。从不通知听众是一种没有人会想到的行为,我什至认为这个问题可能与其他因素有关,因为我最近格式化了我的电脑并重新安装了最新的Android Studio,因为在此之前这段代码是在模拟器和物理设备上工作。
尝试删除第二行中多余的 client.startSmsRetriever();
。
确保 emulator/device 上的播放服务版本 > 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;