我正在编写一个需要接收短信的应用程序,每个人都在他们的代码中使用“android.provider.Telephony.SMS_RECEIVED_ACTION”意图操作,但看起来 API 级别 17 不再支持它了!现在在哪里?我也没有在“android.telephony”类中找到 SMS_RECEIVED_ACTION!请有人告诉我,我完全糊涂了。我应该使用旧的 API 吗?
4 回答
Telephony 类在 API 19 (4.4 - KitKat) 之前没有文档化的 API。没有上课并不意味着您尝试做的事情不起作用。您需要请求此权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
如果您在清单中注册接收器,它将如下所示:
<receiver android:name=".SmsIntentReceiver">
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
从 android.provider.Telephony AOSP:
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
这是对源代码的 grepcode.com 参考:
注意类声明之前的“@hide”——它在那里,但没有暴露给开发人员。这就是为什么它在 ADT 中不被识别的原因。
我们需要阅读这份文件。
Android 开发者博客 - 让您的 SMS 应用程序为 KitKat 做好准备
从 Android 4.4 开始,您应该停止侦听 SMS_RECEIVED_ACTION 广播,您可以在运行时通过检查平台版本然后使用 PackageManager.setComponentEnabledSetting() 禁用 SMS_RECEIVED_ACTION 的广播接收器来执行此操作。但是,如果您的应用只需要读取特殊的 SMS 消息(例如执行电话号码验证),您可以继续收听该广播。请注意 - 从 Android 4.4 开始 - 您的应用程序中止 SMS_RECEIVED_ACTION 广播的任何尝试都将被忽略,因此所有感兴趣的应用程序都有机会接收它。
我认为我们必须为 KitKat 做准备。这是一件令人烦恼的事情。:)
您可以Telephony.Sms.Intents.SMS_RECEIVED_ACTION
在您的代码中使用。
以下是我的工作代码:
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
}
}
}
你必须导入import android.provider.Telephony;
android.telephony
类提供有关 api 级别 1 中引入的电话状态的信息。有关更多详细信息,请阅读此android.telephony
android.telephony.SmsManager
用于从设备收件箱中获取消息信息。你可以在这里看一下telephony.SmsManager
没有迹象表明它们在 api 级别 17 中已被弃用。