【问题标题】:"android.provider.Telephony.SMS_RECEIVED" not working on my device (HTC Wildfire) - how to debug?“android.provider.Telephony.SMS_RECEIVED”在我的设备(HTC Wildfire)上不起作用 - 如何调试?
【发布时间】:2013-02-21 16:31:11
【问题描述】:

我面临着非常令人沮丧的问题。

我创建了 SMS 接收器,正如大多数在线和书籍教程所说的那样。

AndroidManifest.xml:

<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

<application android:name="roboguice.application.RoboApplication"
             android:icon="@drawable/icon"
             android:label="@string/app_name"
             android:debuggable="true" >    

    <!-- ... other stuffs here ... -->

    <receiver android:name=".receivers.SmsReceiver"> 
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
</application>

SmsReceiver.java:

public class SmsReceiver extends BroadcastReceiver {

    public static final String TAG = "SmsReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "SMS received!");
        Toast.makeText(context, "SMS received.", Toast.LENGTH_LONG).show();
    }
}

虽然它在 Emulator (Android 2.2) 上正常工作,但在我的 HTC Wildfire 上却不能工作(Android 2.2.1,未植根)。

主要问题是我是 Android 开发新手,完全不知道如何调试它。

当我的 HTC 设备接收 SMS 消息时,我能否找到一些有用的 LogCat 日志?为什么我的设备不一样!?

【问题讨论】:

  • SMS 广播是有序的,所以第 1 步是把你的接收者的优先级拉高一些。您可以通过将意图过滤器上的 android:priority 属性设置为不计后果的高值并再次测试来做到这一点。试试 2147483647 之类的东西。
  • 它不会改变任何东西 :(。没有登录 LogCat,没有显示 Toast,设备上什么也没有(在模拟器上它按预期工作)。我想知道为什么我在 LogCat 中得到这样的日志当手机收到短信时:“11-06 23:43:20.540: DEBUG/SMSDispatcher(171): dispatchWapPushToCIQ >>>”。这可能是原因还是任何痕迹?
  • 嗯,尝试下载现有的 SMS 过滤器(从 Market)或类似于 Wildfire 的东西,然后先进行测试 - 这可能是 HTC 手机中的问题(以前发生过......)跨度>
  • 谢谢 :),这是很好的跟踪。我发现“GO SMS Pro”应用程序阻止了我的应用程序的此 Intent(更多详细信息请参阅我的解决方案 - 对此主题的答案)。

标签: android


【解决方案1】:

原因及解决方案

我已经解决了。 “android.provider.Telephony.SMS_RECEIVED”无法正常工作,因为我的设备上安装了“GO SMS Pro”应用程序并且选中了“禁用其他消息通知”选项(“在通知中禁用其他与 SMS 相关的应用程序的通知)栏,避免重复通知。”)。取消选中它解决了我的问题。

即使其他应用程序阻止它,如何确保我的广播接收器会收到此意图?由于“android:priority”(Intercept SMS messages in Android and prevent them appearing in Messaging App),我如何知道“GO SMS Pro”应用设置的“优先级”是什么?

【讨论】:

  • thx,这个工作,在“高级设置”->“其他设置”->(取消选中)“禁用其他消息通知”。
【解决方案2】:

对于您的原因和解决方案

Intent intent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = getPackageManager().queryBroadcastReceivers(intent, 0);
for (ResolveInfo info : infos) {
    System.out.println("Receiver name:" + info.activityInfo.name + "; priority=" + info.priority);
}

只需查看您的输出,看看是否有 GO SMS Pro 废话。它可能高得离谱。

【讨论】:

  • 谢谢百万:)!现在我看到“GO SMS Pro”中的人制作了两个优先级等于最大整数值(2147483647)的接收器。他们的应用程序可能正在 SMS_RECEIVED 上调用 abortBroadcast()。那么有什么办法可以与他们的应用程序对抗吗?文档没有说明优先级相同时会发生什么,但是当我发现“Go SMS Pro”应用程序首先被调用时,消耗了我的 SMS_RECEIVED 意图,因此我的应用程序没有被调用:(。
  • 如果我没记错的话,它是“先安装胜出”。最好的办法是警告客户 GO SMS Pro 是一个已知问题(对话框、通知或您有什么)。
  • 再次感谢。可能最好的解决方案是对您编写的内容进行一些扩展:使用上面的代码并检查是否有任何其他接收者注册了具有最高优先级的 SMS_RECEIVED 意图。然后警告用户列出的应用程序可能会导致问题。
  • 一个小建议:你最好使用Telephony.Sms.Intents.SMS_RECEIVED_ACTIONconstant
【解决方案3】:

GO SMS PRO 的优先级为 2^31-1 = 2147483647。因此您的应用无法接收任何消息,因为 GO SMS 服务中止了其他广播。

【讨论】:

    【解决方案4】:

    我很确定这段代码是正确的。您可能看不到Toast 消息,但日志会出现。检查 Logcat,您应该会看到您放置的日志。

    您应该在BroadcastReceivers 中使用Notifications 而不是Toasts。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      相关资源
      最近更新 更多