android中发送短信的三种方法

本文详细介绍在安卓平台上通过四种不同方式发送短信的方法,并提供代码示例。同时,文章还介绍了如何接收短信并解析短信内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 安卓发送短信的三种方法::::

首先要在Mainfest.xml中加入所需要的权限:

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

为了后面测试方便,干脆把SMS的所有权限加上。

方法1:

01public class testSms extends Activity {
02 
03...
04 
05    private void send1(String phone, String message){
06 
07        PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, testSms.class), 0);
08 
09        SmsManager sms = SmsManager.getDefault();
10 
11        sms.sendTextMessage(phone, null, message, pi, null);
12 
13    }
14 
15}

方法2:

如果想知道短信发送后的状态,需要两个Receiver来实现

01private void send2(String number, String message){
02    String SENT = "sms_sent";
03    String DELIVERED = "sms_delivered";
04    
05    PendingIntent sentPI = PendingIntent.getActivity(this, 0, new Intent(SENT), 0);
06    PendingIntent deliveredPI = PendingIntent.getActivity(this, 0, new Intent(DELIVERED), 0);
07    
08    registerReceiver(new BroadcastReceiver(){
09 
10            @Override
11            public void onReceive(Context context, Intent intent) {
12                switch(getResultCode())
13                {
14                    case Activity.RESULT_OK:
15                        Log.i("====>", "Activity.RESULT_OK");
16                        break;
17                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
18                        Log.i("====>", "RESULT_ERROR_GENERIC_FAILURE");
19                        break;
20                    case SmsManager.RESULT_ERROR_NO_SERVICE:
21                        Log.i("====>", "RESULT_ERROR_NO_SERVICE");
22                        break;
23                    case SmsManager.RESULT_ERROR_NULL_PDU:
24                        Log.i("====>", "RESULT_ERROR_NULL_PDU");
25                        break;
26                    case SmsManager.RESULT_ERROR_RADIO_OFF:
27                        Log.i("====>", "RESULT_ERROR_RADIO_OFF");
28                        break;
29                }
30            }
31    }, new IntentFilter(SENT));
32    
33    registerReceiver(new BroadcastReceiver(){
34        @Override
35        public void onReceive(Context context, Intent intent){
36            switch(getResultCode())
37            {
38                case Activity.RESULT_OK:
39                    Log.i("====>", "RESULT_OK");
40                    break;
41                case Activity.RESULT_CANCELED:
42                    Log.i("=====>", "RESULT_CANCELED");
43                    break;
44            }
45        }
46    }, new IntentFilter(DELIVERED));
47    
48        SmsManager smsm = SmsManager.getDefault();
49        smsm.sendTextMessage(number, null, message, sentPI, deliveredPI);
50}

在模拟器上是看不到Receiver中的log信息的,据网上说在手机上是可以实现的,只可惜手中无机,也只能纸上谈兵了。

方法3:

上面都是发送文本文件,如果想发送一些非文本,比如加密数据,可以用以下方法:

1private void send2(String number, String message){
2    SmsManager smsm = SmsManager.getDefault();
3    short port = 1000;
4    PendingIntent pi = PendingIntent.getBroadcast(test.this, 0, new Intent(), 0);
5    smsm.sendDataMessage(number, null, port, message.getBytes(), pi, null);
6}

方法4:

调用系统的短信界面,这个方法需要用户自己输入接收方的电话号码

1private void send(String message){
2    Intent sendIntent = new Intent(Intent.ACTION_VIEW);
3    sendIntent.putExtra("sms_body", message);
4    sendIntent.setType("vnd.android-dir/mms-sms");
5}

这个方法自动设置接收方的号码

1private void send1(String number, String message){
2    Uri uri = Uri.parse("smsto:" + number);
3    Intent sendIntent = new Intent(Intent.ACTION_VIEW, uri);
4    sendIntent.putExtra("sms_body", message);
5    startActivity(sendIntent);
6}

短信的接受,需要实现BroadcastReceiver类,监听系统消息

首先在Mainfest.xml中加入申明,SmsReceiver为实现类

1<receiver android:name=".SmsReceiver">
2 
3<intent-filter>
4    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
5</intent-filter>
6 
7</receiver>

 

如果是方法3,使用sendDataMessage时需要加入

01<receiver android:name=".SmsReceiver">
02 
03<intent-filter>
04    <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
05    <data android:scheme="sms" />
06    <data android:host="localhost" />
07    <data android:port="1000" />
08</intent-filter>
09 
10</receiver>

将其中的dat数据注释掉,模拟器上也可以接收到短信; port跟sendDataMessage中的端口值不一致时,也没有问题,太神奇了

01public class SmsReceiver extends BroadcastReceiver {
02 
03    @Override
04    public void onReceive(Context context, Intent intent) {
05        Bundle bundle = intent.getExtras();
06        SmsMessage[] msgs = null;
07        String phone;
08        String message;
09                
10        if(bundle != null){
11            Object[] pdus = (Object[])bundle.get("pdus");
12            msgs = new SmsMessage[pdus.length];
13            for(int i = 0; i < msgs.length; i++){
14                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
15                phone = msgs[i].getOriginatingAddress();
16                message = msgs[i].getMessageBody();
17            }
18        }
19    }
20}

如果是sendDataMessage发送:

01public class SmsReceiver extends BroadcastReceiver {
02 
03    @Override
04    public void onReceive(Context context, Intent intent) {
05        Bundle bundle = intent.getExtras();
06        SmsMessage[] msgs = null;
07             String phone;
08             String message;
09                
10        if(bundle != null){
11            Object[] pdus = (Object[])bundle.get("pdus");
12            msgs = new SmsMessage[pdus.length];
13            for(int i = 0; i < msgs.length; i++){
14                msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
15                phone = msgs[i].getOriginatingAddress();
16                byte data[] = SmsMessage.createFromPdu((byte[])pdus[i]).getUserData();
17                message = new String(data);
18            }
19        }
20    }
21}

不一样的地方是message的获取时使用getUserData()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值