http://www.eoeandroid.com/forum.php?mod=viewthread&tid=274138
首先感谢原帖给我滴参考http://www.apkbus.com/android-13446-1-1.html, 进行了一点改进
Android发送短信十分简单,利用SmsManager.sendTextMessage方法即可实现
方法参数有 String destinationAddress, 目标地址(必须).即你需要发送的目标手机号码 String scAddress, 服务中心号码(可选).null时即为手机默认服务中心号,一般传入null不做特殊设置 String text, 发送内容(必须).需要发送的短信内容 PendingIntent sentIntent, 发送状态回执(可选).将之与一个广播绑定,则发送短信后会向绑定的广播接受者发送一条发送状态的回执广播 PendingIntent deliveryIntent 接受状态回执(可选)).将之与一个广播绑定,则对方接收短信后会向绑定的广播接受者发送一条接收状态的回执广播
只发送短信不管是否成功与否的话,只要传入2个必须的参数即可
核心类的代码如下
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
package com.boredream.demo.sendsms; import java.util.ArrayList; import android.app.Activity; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.os.Bundle; import android.telephony.SmsManager; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class SendSmsActivity extends Activity { private static final String TAG = "SendSmsActivity" ; String SENT_SMS_ACTION = "SENT_SMS_ACTION" ; //发送状态回执广播的Action String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION" ; //接受状态回执广播的Action String sendPhoneNumber; String sendMsg; Context mContext = null ; EditText editText1; //目标手机号输入框 EditText editText2; //短信内容输入框 Button button; //点击发送滴按钮 @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button) findViewById(R.id.button1); editText1 = (EditText) findViewById(R.id.edittext1); editText2 = (EditText) findViewById(R.id.edittext2); mContext = this ; button.setOnClickListener( new OnClickListener() { @Override public void onClick(View view) { String number = editText1.getText().toString().trim(); //输入的手机号 String text = editText2.getText().toString(); //输入的短信内容 sendSMS(number, text); // recordAfterSendSms(number, text); //此处调用的话,短信发送失败也会记录 } }); // 注册广播 registerReceiver(sendMessage, new IntentFilter(SENT_SMS_ACTION)); registerReceiver(receiver, new IntentFilter(DELIVERED_SMS_ACTION)); } @Override protected void onDestroy() { super .onDestroy(); // 取消注册 unregisterReceiver(sendMessage); unregisterReceiver(receiver); } /** * 短信发送状态的广播接收者 */ private BroadcastReceiver sendMessage = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //判断短信是否发送成功 switch (getResultCode()) { case Activity.RESULT_OK: recordAfterSendSms(sendPhoneNumber, sendMsg); //短信发送成功时才在"已发送"里记录 Log.i(TAG, "短信发送成功" ); Toast.makeText(context, "短信发送成功" , Toast.LENGTH_SHORT).show(); break ; default : Toast.makeText(mContext, "短信发送失败" , Toast.LENGTH_LONG).show(); Log.i(TAG, "短信发送失败" ); break ; } } }; /** * 短信接收状态的广播接收者 * * <p> * 接收状态一直没有试出来,有待完善,哪位大哥整出来这个了还请指教下 */ private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //表示对方成功收到短信 Log.i(TAG, "对方接收成功" ); Toast.makeText(mContext, "对方接收成功" ,Toast.LENGTH_LONG).show(); } }; /** * 发送短信 * * @param phoneNumber 发送的号码 * @param message 发送的内容 */ private void sendSMS(String phoneNumber, String message) { Toast.makeText( this , "send sms" , 0 ).show(); //记录发送的内容 sendPhoneNumber = phoneNumber; sendMsg = message; // 获取短信管理者 SmsManager sms = SmsManager.getDefault(); // 与回执意图所绑定的广播接收者,即发送以后触发,向广播发送一条广播信息 Intent sentIntent = new Intent(SENT_SMS_ACTION); // 新建发送状态回执意图 PendingIntent sentPI = PendingIntent.getBroadcast( this , 0 , sentIntent, 0 ); // 与回执意图所绑定的广播接收者,即接收以后触发,向广播发送一条广播信息 Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION); // 新建接收状态回执意图 PendingIntent deliverPI = PendingIntent.getBroadcast( this , 0 , deliverIntent, 0 ); //如果短信内容超过70个字符 将这条短信拆成多条短信发送出去 if (message.length() > 70 ) { ArrayList<String> msgs = sms.divideMessage(message); for (String msg : msgs) { sms.sendTextMessage(phoneNumber, null , msg, sentPI, deliverPI); } } else { sms.sendTextMessage(phoneNumber, null , message, sentPI, deliverPI); } } /** * 记录已发送的短信(不调用此方法的话,只发送短信但手机的"已发送"中无法查询到记录) * * @param phoneNumber 目标手机号 * @param message 发送短信内容 * * <p> * 及时发送短信失败此处代码也可以调用使用,你可以做一款模拟短信滴软件调戏下基友</br> * 比如:2月14号之后的一周左右,拿基友的手机,模拟一条女朋友的短信,内容的话:"我..了",咳咳 */ private void recordAfterSendSms(String phoneNumber, String message) { /**将发送的短信插入数据库**/ ContentValues values = new ContentValues(); //发送时间 values.put( "date" , System.currentTimeMillis()); //阅读状态 values.put( "read" , 0 ); //1为收 2为发 values.put( "type" , 2 ); //送达号码 values.put( "address" , phoneNumber); //送达内容 values.put( "body" , message); //插入短信库 getContentResolver().insert(Uri.parse( "content://sms" ),values); } } |
注意:只调用sendTextMessage方法发送的话,实际短信会发送出去,但是在手机的"已发送"里找不到记录. 这样简单的发送只需要一个权限: <!-- 发送消息--> <uses-permission android:name="android.permission.SEND_SMS"/>
如果要记录发送的短信,需要利用上面核心类中的方法recordAfterSendSms()手动向数据库里存, 这种发送短信需要的权限如下: <!-- 发送消息--> <uses-permission android:name="android.permission.SEND_SMS"/> <!-- 阅读消息--> <uses-permission android:name="android.permission.READ_SMS"/> <!-- 写入消息--> <uses-permission android:name="android.permission.WRITE_SMS" /> <!-- 接收消息 --> <uses-permission android:name="android.permission.RECEIVE_SMS" /> 这个方法的独立存在的,即不发送短信时,发送失败时等都可以单独调用此方法保存记录,因而也可以模拟虚假的数据.
测试的时候如果用模拟器的话,如果模拟器是5554则对应号码为155 5521 5554, 5556则对应155 5521 5556.
最后,程序测试通过没有问题,手机模拟器都可以,但是我测试的时候接收状态的触发还是存在问题,接收状态回执广播接收不到,谁知道情况可以和我说下,3Q~