我正在将一个值从活动传递到广播接收器:
我的活动代码:
String stringBuilder = "Hello";
String phone_no = "1234567890";
try{
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phone_no, null, stringBuilder, null, null);
Intent broadcastIntent = new Intent(contacts.this, Receiver.class);
broadcastIntent.putExtra("message",stringBuilder);
sendBroadcast(broadcastIntent);
}catch (Exception e) {
e.printStackTrace();
}
我的广播接收器代码:
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//String msg= intent.getStringExtra("message") //returns null
Bundle bundle = intent.getExtras();
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
String msg= intent.getStringExtra("message") //returns null
if (bundle != null){
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus.length == 0) {
return;
}
// large message might be broken into many
SmsMessage[] messages = new SmsMessage[pdus.length];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
sb.append(messages[i].getMessageBody());
}
String sender = messages[0].getOriginatingAddress();
String message = sb.toString();
if (message.equals(msg)) {
//do something
}
}
Toast.makeText(context,message,Toast.LENGTH_SHORT).show(); //empty toast
}
}
这是我的清单:
<receiver
android:name=".Receiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
<intent-filter android:priority="2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
正如您所看到的
key
在这两种情况下是相同的,当从活动传递时,该值在我的广播接收器中仍然返回 null。关于如何将活动的值传递给广播接收器,我已经没有想法了。请帮助我。
我只想检查广播接收器 (
String message = sb.toString();
) 中收到的消息是否等于从活动 (stringBuilder
) 发送的消息。
好吧,再看一遍你的代码,我注意到一条可能导致问题的鱼线。
broadcastIntent.putExtra("message",stringBuilder);
您的意思是像这样使用它吗:
broadcastIntent.putExtra(android.content.Intent.EXTRA_TEXT,stringBuilder);
然后您可以通过以下方式获取:
intent.getStringExtra(android.content.Intent.EXTRA_TEXT);
或者如果想发送多件东西:
broadcastIntent.putExtra(android.content.Intent.EXTRA_TEXT, new String[] { stringBuilder, phone_no } );
要获得它们:
String[] str = intent.getStringArrayExtra(android.content.Intent.EXTRA_TEXT);
String message = str[0];
String phone_no = str[1];
或者您也可以使用
Bundle
。
Bundle bundle = new Bundle();
bundle.putCharSequence("message", stringBuilder);
bundle.putCharSequence("phone_no", phone_no);
broadcastIntent.putExtras(bundle);
稍后您可以使用以下方法检索它们:
public class Receiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
{
//String message= intent.getStringExtra("message") //returns null
Bundle bundle = intent.getExtras();
if(bundle != null) {
String message = bundle.getString("message");
Toast.makeText(context,message,Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,"Bundle is null",Toast.LENGTH_SHORT).show();
}
}
}
}
为什么我收到的是空面包?
您的
stringBuilder
变量 - 您未将其包含在代码中 - 为空。
您似乎混淆了两件不同的事情。您已在清单中注册了
BroadcastReceiver
,以便由传入的短信触发。当这种情况发生时,您的 BroadcastReceiver.onReceive()
将被调用,并带有包含 Intent
的 ACTION="android.provider.Telephony.SMS_RECEIVED"
。该广播Intent
由Android框架发送,不会包含您的“额外内容”。
您还有一个
Activity
,正在向您的 Intent
发送广播 BroadcastReceiver
。在这种情况下,Intent
包含您的“额外内容”但没有操作,因此它不会进入您的if
块。
您可以将待处理的意图设置为函数:
private fun sendSms(num : String , sms : String){
try {
val smsManager: SmsManager = SmsManager.getDefault()
val intent = Intent(this , SendBroadCast::class.java)
intent.putExtra("sms", "Send to $num")
val sentIntent = PendingIntent.getBroadcast(this, 47, intent ,
PendingIntent.FLAG_IMMUTABLE)
val intent1 = Intent(this , DeliveredBroadcast::class.java)
intent1.putExtra("sms", "Delivered to $num")
val deliveredIntent = PendingIntent.getBroadcast(this, 47, intent1,
PendingIntent.FLAG_IMMUTABLE)
smsManager.sendTextMessage(num, null, sms, sentIntent, deliveredIntent)
} catch (ex: Exception) {
Toast.makeText(this, ex.message.toString(), Toast.LENGTH_LONG).show()
ex.printStackTrace()
}
}
对于每个待处理的意图,您需要创建广播接收器类的对象,
收听发送消息:
class SendBroadCast: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context, intent?.extras?.getString("sms").toString(), Toast.LENGTH_SHORT).show()
}
}
以及听取传递消息
class DeliveredBroadcast : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Toast.makeText(context, intent?.extras?.getString("sms").toString(), Toast.LENGTH_SHORT).show()
}
}
并且不要忘记在文件清单中声明您的广播接收器
<receiver android:name=".SendBroadCast"/>
<receiver android:name=".DeliveredBroadcast"/>
就我而言,当我使用短信管理器时,我需要向文件清单添加权限
<uses-permission android:name="android.permission.SEND_SMS"/>