为什么字符串值从 activity 传递到广播接收器时为空?
Why is the string value null when passed from activity to broadcast receiver?
我正在将一个值从 activity 传递给广播接收器:
我的activity代码:
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
在这两种情况下都是相同的,当从 activity 传递时,我的广播接收器中的值仍然返回 null。我 运行 不知道如何将值从 activity 传递给广播接收器。请帮助我。
我只想检查我的广播接收器 (String message = sb.toString();
) 收到的消息是否等于从 activity (stringBuilder
) 发送的消息。
Why am I receiving an empty toast?
您的 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();
}
}
}
}
您似乎混淆了两件事。您已在清单中注册了 BroadcastReceiver
以由传入的 SMS 触发。发生这种情况时,您的 BroadcastReceiver.onReceive()
将使用包含 ACTION="android.provider.Telephony.SMS_RECEIVED"
的 Intent
进行调用。此广播 Intent
由 Android 框架发送,不会包含您的“额外内容”。
您还有一个 Activity
正在向您的 BroadcastReceiver
发送广播 Intent
。在这种情况下,Intent
包含您的“extras”但没有 ACTION,因此它不会进入您的 if
块。
我正在将一个值从 activity 传递给广播接收器:
我的activity代码:
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
在这两种情况下都是相同的,当从 activity 传递时,我的广播接收器中的值仍然返回 null。我 运行 不知道如何将值从 activity 传递给广播接收器。请帮助我。
我只想检查我的广播接收器 (String message = sb.toString();
) 收到的消息是否等于从 activity (stringBuilder
) 发送的消息。
Why am I receiving an empty toast?
您的 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();
}
}
}
}
您似乎混淆了两件事。您已在清单中注册了 BroadcastReceiver
以由传入的 SMS 触发。发生这种情况时,您的 BroadcastReceiver.onReceive()
将使用包含 ACTION="android.provider.Telephony.SMS_RECEIVED"
的 Intent
进行调用。此广播 Intent
由 Android 框架发送,不会包含您的“额外内容”。
您还有一个 Activity
正在向您的 BroadcastReceiver
发送广播 Intent
。在这种情况下,Intent
包含您的“extras”但没有 ACTION,因此它不会进入您的 if
块。