首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android -监听传入的SMS消息

Android -监听传入的SMS消息
EN

Stack Overflow用户
提问于 2011-08-17 15:38:07
回答 10查看 175.2K关注 0票数 172

我试图创建一个应用程序来监测传入的短信,并通过传入的短信推出一个程序,它也应该从短信读取的内容。

工作流程:

  • 短信发送至安卓设备
  • 自执行应用程序
  • 读取短信信息
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-08-24 15:17:21

代码语言:javascript
复制
public class SmsListener extends BroadcastReceiver{

    private SharedPreferences preferences;

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

        if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){
            Bundle bundle = intent.getExtras();           //---get the SMS message passed in---
            SmsMessage[] msgs = null;
            String msg_from;
            if (bundle != null){
                //---retrieve the SMS message received---
                try{
                    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]);
                        msg_from = msgs[i].getOriginatingAddress();
                        String msgBody = msgs[i].getMessageBody();
                    }
                }catch(Exception e){
//                            Log.d("Exception caught",e.getMessage());
                }
            }
        }
    }
}

注意:在清单文件中添加BroadcastReceiver-

代码语言:javascript
复制
<receiver android:name=".listener.SmsListener">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

添加此权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.RECEIVE_SMS" />
票数 275
EN

Stack Overflow用户

发布于 2014-05-19 15:51:59

请注意,在某些设备上,如果没有android:priority="1000" in intent filter,您的代码将无法工作:

代码语言:javascript
复制
<receiver android:name=".listener.SmsListener">
    <intent-filter android:priority="1000">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

下面是一些优化:

代码语言:javascript
复制
public class SmsListener extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
            for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
                String messageBody = smsMessage.getMessageBody();
            }
        }
    }
}

备注

值必须为整数,如"100“。数字越高,优先级越高。默认值为0。该值必须大于-1000且小于1000。

Here's a link.

票数 70
EN

Stack Overflow用户

发布于 2017-01-17 06:55:54

@Mike M.和我发现了一个被接受的答案的问题(参见我们的评论):

基本上,如果我们不是每次都连接多部分消息,那么通过for循环是没有意义的:

代码语言:javascript
复制
for (int i = 0; i < msgs.length; i++) {
    msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
    msg_from = msgs[i].getOriginatingAddress();
    String msgBody = msgs[i].getMessageBody();
}

请注意,我们只是将msgBody设置为消息的各个部分的字符串值,而不管我们在哪个索引上,这使得遍历SMS消息的不同部分的整个点变得无用,因为它将被设置为最后一个索引值。相反,我们应该使用+=,或者像Mike提到的那样,使用StringBuilder

总之,我的接收代码是这样的:

代码语言:javascript
复制
if (myBundle != null) {
    Object[] pdus = (Object[]) myBundle.get("pdus"); // pdus is key for SMS in bundle

    //Object [] pdus now contains array of bytes
    messages = new SmsMessage[pdus.length];
    for (int i = 0; i < messages.length; i++) {
         messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); //Returns one message, in array because multipart message due to sms max char
         Message += messages[i].getMessageBody(); // Using +=, because need to add multipart from before also
    }

    contactNumber = messages[0].getOriginatingAddress(); //This could also be inside the loop, but there is no need
}

只是把这个答案放在那里,以防其他人也有同样的困惑。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7089313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档