为什么从 Activity 传递到广播接收器时字符串值为空?

问题描述 投票:0回答:4

我正在将一个值从活动传递到广播接收器:

我的活动代码:

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
) 发送的消息。

android android-intent
4个回答
0
投票

好吧,再看一遍你的代码,我注意到一条可能导致问题的鱼线。

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();
            }
        }
    }
}

0
投票

为什么我收到的是空面包?

您的

stringBuilder
变量 - 您未将其包含在代码中 - 为空。


0
投票

您似乎混淆了两件不同的事情。您已在清单中注册了

BroadcastReceiver
,以便由传入的短信触发。当这种情况发生时,您的
BroadcastReceiver.onReceive()
将被调用,并带有包含
Intent
ACTION="android.provider.Telephony.SMS_RECEIVED"
。该广播
Intent
由Android框架发送,不会包含您的“额外内容”。

您还有一个

Activity
,正在向您的
Intent
发送广播
BroadcastReceiver
。在这种情况下,
Intent
包含您的“额外内容”但没有操作,因此它不会进入您的
if
块。


0
投票

您可以将待处理的意图设置为函数:

 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"/>
© www.soinside.com 2019 - 2024. All rights reserved.