5

我正在编写一个需要接收短信的应用程序,每个人都在他们的代码中使用“android.provider.Telephony.SMS_RECEIVED_ACTION”意图操作,但看起来 API 级别 17 不再支持它了!现在在哪里?我也没有在“android.telephony”类中找到 SMS_RECEIVED_ACTION!请有人告诉我,我完全糊涂了。我应该使用旧的 API 吗?

4

4 回答 4

11

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 参考:

http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/2.3.2_r1/android/provider/Telephony.java/?v=source

注意类声明之前的“@hide”——它在那里,但没有暴露给开发人员。这就是为什么它在 ADT 中不被识别的原因。

于 2014-01-01T18:57:03.687 回答
6

我们需要阅读这份文件。

Android 开发者博客 - 让您的 SMS 应用程序为 KitKat 做好准备

从 Android 4.4 开始,您应该停止侦听 SMS_RECEIVED_ACTION 广播,您可以在运行时通过检查平台版本然后使用 PackageManager.setComponentEnabledSetting() 禁用 SMS_RECEIVED_ACTION 的广播接收器来执行此操作。但是,如果您的应用只需要读取特殊的 SMS 消息(例如执行电话号码验证),您可以继续收听该广播。请注意 - 从 Android 4.4 开始 - 您的应用程序中止 SMS_RECEIVED_ACTION 广播的任何尝试都将被忽略,因此所有感兴趣的应用程序都有机会接收它。

我认为我们必须为 KitKat 做准备。这是一件令人烦恼的事情。:)

于 2013-10-31T04:08:37.197 回答
2

您可以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;

于 2015-02-27T08:12:47.193 回答
0

android.telephony类提供有关 api 级别 1 中引入的电话状态的信息。有关更多详细信息,请阅读此android.telephony

android.telephony.SmsManager用于从设备收件箱中获取消息信息。你可以在这里看一下telephony.SmsManager

没有迹象表明它们在 api 级别 17 中已被弃用。

于 2013-08-28T17:39:42.797 回答