【问题标题】:how to call BroadcastReceiver to Activity如何调用 BroadcastReceiver 到 Activity
【发布时间】:2014-01-20 09:23:49
【问题描述】:

您好,我的要求是从特定号码接收短信。我想在 textview 中显示收到的消息。但我无法在我的活动中从 BroadcastReceiver 获取值。我不知道我在哪里做错了。请告诉我

我的代码是

短信接收器

public class SmsReceiver extends BroadcastReceiver {

public String str=null;

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    Bundle bundle = intent.getExtras();
    SmsMessage[] msgs = null;

    if (bundle != null) {

        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsMessage[pdus.length];

        for (int i = 0; i < msgs.length; i++) 
        {
            msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);

            //for get sms from special number===============================
            String msg_from = msgs[i].getOriginatingAddress();
            Log.v("msg_from >>",msg_from);     
            if(msg_from.equals("XXXXXXXX"))
            {
                //===============================
            str += "SMS from " + msgs[i].getOriginatingAddress();
            str += " :";
            str += msgs[i].getMessageBody().toString();
            str += "\n";    
            Intent act = new Intent(context, MainActivity.class);
            act.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            act.putExtra("message", str);
            context.startActivity(act);

            this.abortBroadcast();
            }

        }
        // ---display the new SMS message---
        // Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
    }

}
 } 

主活动

public class MainActivity extends Activity {

private TextView showText;
private String receivedSms;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent intent = getIntent();
    receivedSms =intent.getStringExtra("message");
    Log.e("mysms", receivedSms);
    showText = (TextView)findViewById(R.id.showText);
    showText.setText(receivedSms);
}   

  }

【问题讨论】:

  • 发生了什么错误??
  • 打印 Log.e() 消息时产生 nullpointerException,如果我删除了 Log.e,它不会显示 textview 中的任何值
  • receivedSms 为空??
  • 是的 recevedSms 为空
  • 在 onReceive 中记录 msg

标签: android sms


【解决方案1】:

将此添加到您的清单文件中:

<uses-permission
android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission
android:name="android.permission.SEND_SMS"></uses-permission>

<receiver android:name=".IncomingSms">   
   <intent-filter>
     <action android:name="android.provider.Telephony.SMS_RECEIVED" />
   </intent-filter>  </receiver>

// 在你的接收器类中

最终捆绑包 = intent.getExtras();试试 {

if (bundle != null) {

    final Object[] pdusObj = (Object[]) bundle.get("pdus");

    for (int i = 0; i < pdusObj.length; i++) {

        SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
        String phoneNumber = currentMessage.getDisplayOriginatingAddress();

        String senderNum = phoneNumber;
        String message = currentMessage.getDisplayMessageBody();

    }
  }   
} 
catch (Exception e) {
e.printstacktrac(); 
}

将消息字符串传递给您的活动。

【讨论】:

  • 然后将您的具体号码与收到的号码进行比较。
  • 我写了与你发布的相同的代码,但在 logcat Log.e("CHEKING", message);没有打印消息
  • 根据我的建议,不要使用广播接收器在您的应用中接收消息。
  • 尝试使用 ContentObserver 获取新消息
  • B'coz 在更高的 api 级别(例如来自 api 11)b'receiver 不会调用新消息接收。
【解决方案2】:

尝试改变:

public String str=null;

到:

public String str="";

我建议改用 StringBuffer 并将字符串附加到其中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多