在一个BroadcastReceiver(Android)中接收和发送短信

时间:2014-08-29 10:43:00

标签: android sms broadcastreceiver

我试图建立一个接收短信和发送状态的课程。 这就是我的清单查找此任务的方式:

        <receiver android:name=".SmsListener" android:permission="android.permission.BROADCAST_SMS" android:exported="true">
            <intent-filter android:priority="5822">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
                <action android:name="android.provider.Telephony.SMS_SENT" />
            </intent-filter>
        </receiver>

我收到了收到的消息,但是没有收到SENT消息,我的Manifest声明有问题吗?

      PendingIntent _pendingIntent;
      Intent _intent = new Intent();
      _intent.setClass(ParkingOptionsActivity.this, SmsListener.class); // SmsListener extends BroadcastReceiver
      _intent.putExtra("test","test");
      _pendingIntent =  PendingIntent.getActivity(ParkingOptionsActivity.this, 0, _intent, 0);
      SmsManager sms = SmsManager.getDefault();
      sms.sendTextMessage(phoneNumber, null, "test message", _pendingIntent, null);

1 个答案:

答案 0 :(得分:3)

您需要使用PendingIntent而不是getBroadcast()获取getActivity(),因为您要向BroadcastReceiver发送广播,而不是Activity

在您当前的代码中,您只需更改一行:

_pendingIntent = PendingIntent.getBroadcast(ParkingOptionsActivity.this, 0, _intent, 0);

此外,当前SDK中不存在"android.provider.Telephony.SMS_SENT"操作,并且在发送SMS时没有系统广播。您的应用并不真正需要清单条目中的<action>,因为Intent明确定位到您的Receiver类。

如果您计划将该操作用于其他内容 - 例如,区分onReceive()中的广播,接收来自其他应用的隐式广播等等 - 那么您可以考虑将其更改为使用{{1}以外的其他内容1}}包名称,以免在将来引起潜在的不良行为或混淆。我想说,使用自己应用程序的软件包名称是常态。