【问题标题】:Unable to catch SMS received with android.provider.Telephony.SMS_RECEIVED无法捕获使用 android.provider.Telephony.SMS_RECEIVED 收到的短信
【发布时间】:2013-12-12 04:16:05
【问题描述】:

收到短信时,我无法捕捉到意图。以下是我的服务代码。我能够捕捉到“Intent.ACTION_SCREEN_ON”和“Intent.ACTION_SCREEN_OFF”但我无法捕捉到SMS_RECEIVED 意图“android.provider.Telephony.SMS_RECEIVED”。

衷心感谢任何提示我在这里做错了什么?

public class SmsCatcher extends Service{

BroadcastReceiver myBroadcast = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.i("myBroadcast SmsCatcher", "Entered onReceive method");
        if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.i("myBroadcast SmsCatcher", "Caught SCREEN_OFF");
        }
        if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.i("myBroadcast SmsCatcher", "Caught SCREEN_ON");
        }

        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            Log.i("myBroadcast SmsCatcher", "SMS_RECEIVED");
        }
    }
};

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    Log.i("neil SmsCatcher", "Entered onCreate() in 'SmsCatcher extends Service'");
    Toast.makeText(this, "Entered onCreate() in 'SmsCatcher extends Service'", Toast.LENGTH_LONG).show();

    registerReceiver(myBroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
    registerReceiver(myBroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));

}

@Override
public void onDestroy() {
    super.onDestroy();

    Log.i("neil SmsCatcher", "Entered onDestroy() in 'SmsCatcher extends Service'");
    Toast.makeText(this, "Entered onDestroy() in 'SmsCatcher extends Service'", Toast.LENGTH_LONG).show();
}


}

更新 1:从我正在进行的调试中添加更多信息: 我用 AppInternal Broadcasts Monitor 看到有广播的时候收到短信却什么都看不到,很奇怪。可能是什么原因? 我安装了其他 SMS 应用程序(环聊、AT&T 消息)- 它们不能抑制广播吗?

更新 2:发现问题但不知道如何解决 我卸载了Google Hangouts (replaces Talk) 应用程序,它工作正常!!! 有什么解决方案吗? (我应该按照 stackoverflow 规则打开一个单独的线程吗?)

更新 3:找到根本原因(当然需要以下帮助,谢谢) 事实证明,由于新的 Google Hangouts App,我需要setPriority(int)。我在Enabling SMS support in Hangouts 2.0 breaks the BroadcastReceiver of SMS_RECEIVED in my app 找到了解决方案

【问题讨论】:

    标签: android android-intent sms broadcastreceiver intentfilter


    【解决方案1】:

    您需要注册android.provider.Telephony.SMS_RECEIVEDintent过滤器,只有注册了才能在onRecivelike中查看intent

        IntentFilter filter = new IntentFilter(android.provider.Telephony.SMS_RECEIVED);
    this.registerReceiver(myBroadcastReceiver, filter);
    

    问题更新: 事实证明,Google Hangouts App 收到短信后会立即中止广播,因此在 Hangouts 2.0 中禁用短信支持可能会解决此问题。

    【讨论】:

    • 谢谢,我添加了 registerReceiver(...) 但我仍然没有抓住意图。我用更多的调试更新了这个问题,我不认为正在生成广播,奇怪:S
    • 我将您的答案标记为答案,因为您设置 IntentFilter 的方式最容易设置为 setPriority(int) [根据我上面的更新 3]。谢谢。
    • 我也会将其添加到答案中以供将来帮助
    【解决方案2】:

    您没有注册意图过滤器:

    @Override
    public void onCreate() {
        // ..
        registerReceiver(myBroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
        registerReceiver(myBroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));
        registerReceiver(myBroadcast, new IntentFilter("android.provider.Telephony.SMS_RECEIVED")); // missing in your code
    }
    

    请在AndroidManifest.xml 中检查您对android.permission.RECEIVE_SMS 的权限。

    【讨论】:

    • 很好,感谢下面的@insomniac,但我添加了 registerReceiver(...) 但我仍然没有触发那个 Intent 过滤器。使用“android.provider.Telephony.SMS_RECEIVED”是正确的还是应该是别的东西?我的清单文件中已经有权限:
    • 我有线索,请参阅上面的更新 2。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多