smsManager.sendTextMessage() 发送短信息

利用类 SmsManager 发送信息, smsManager 为 SmsManager 一个默认的实例. SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)
destinationAddress: 收件人号码
scAddress: 短信中心服务号码, 这里设置为null
text: 发送内容
sentIntent: 发送短信结果状态信号(是否成功发送),new 一个Intent , 操作系统接收到信号后将广播这个Intent.此过程为异步.
deliveryIntent: 对方接收状态信号(是否已成功接收).
由于需要用到系统发送信息功能, 要在AndroidMainfest.xml 加入 <uses-permission android: name=”android.permisson.SEND_SMS” />
AndroidMainfest.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.PhoneSMS.melody”
android:versionCode=”1″
android:versionName=”1.0″>
<uses-sdk android:minSdkVersion=”10″/>

<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<activity android:name=”.PhoneSMSActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN”/>
<category android:name=”android.intent.category.LAUNCHER”/>
</intent-filter>
</activity>

</application>
<uses-permission android:name=”android.permission.SEND_SMS”/>
</manifest>
1.界面设计 res/layout/main.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical” android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>
<!– 编辑接收号码 –>
<TextView android:layout_width=”fill_parent”
android:layout_height=”wrap_content” android:text=”@string/textSMSTo”/>
<EditText android:layout_width=”fill_parent”
android:layout_height=”wrap_content” android:lines=”3″ android:hint=”@string/edtSMSTo”
android:id=”@+id/edtSMSTo”/>
<!– 编辑发送内容 –>
<TextView android:layout_width=”fill_parent”
android:layout_height=”wrap_content” android:text=”@string/textContent”/>
<EditText android:layout_width=”fill_parent”
android:layout_height=”wrap_content” android:lines=”3″
android:hint=”@string/edtContent” android:id=”@+id/edtContent”/>
<!– 发送 –>
<Button android:layout_width=”wrap_content”
android:layout_height=”wrap_content” android:text=”@string/btnSent”
android:id=”@+id/btnSent”/>

</LinearLayout>
2.字符变量 res/values/strings.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<resources>
<string name=”hello”>Hello World, PhoneSMSActivity!</string>
<string name=”app_name”>PhoneSMS</string>
<string name=”textSMSTo”>收件人</string>
<string name=”edtSMSTo”>收件人号码</string>
<string name=”textContent”>发送内容</string>
<string name=”edtContent”>输入内容</string>
<string name=”btnSent”>发送</string>
</resources>

3.Activity代码编写

PhoneSMSActivity.java

package com.PhoneSMS.melody;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class PhoneSMSActivity extends Activity implements OnClickListener {
private EditText edtSMSTo = null; // 收件人控件
private EditText edtContent = null; // 发送内容控件
private Button btnSent = null; // 发送btn 控件
private String SMSTo = null; // 收件人号码
private String SMSContent = null; // 发送内容

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

/**
* 获取控件
*/
edtSMSTo = (EditText) this.findViewById(R.id.edtSMSTo);
edtContent = (EditText) this.findViewById(R.id.edtContent);
btnSent = (Button) this.findViewById(R.id.btnSent);

// 获取收件人号码
SMSTo = edtSMSTo.getText().toString();
// 获取发送内容
SMSContent = edtContent.getText().toString();
// 设置监听事件
btnSent.setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSent:
/**
* 实现短信发送功能
*/
// 获取默认短信管理对象
SmsManager smsManager = SmsManager.getDefault();
// 判断发送内容字数(一件信息最多70 字)
if(SMSContent.length() <= 70) {
smsManager.sendTextMessage(SMSTo, null, SMSContent, null, null);
}else{
// SmsManger 类中 divideMessage 会将信息按每70 字分割
List<String> smsDivs = smsManager.divideMessage(SMSContent);
for(String sms : smsDivs) {
smsManager.sendTextMessage(SMSTo, null, sms, null, null);

}
}
Toast.makeText(PhoneSMSActivity.this, “信息已发送”, Toast.LENGTH_SHORT);
break;
}
}
}

Android SMS—— 读取短信

Android SMS Read

  1. package com.homer.sms;
  2. import java.sql.Date;
  3. import java.text.SimpleDateFormat;
  4. import android.app.Activity;
  5. import android.database.Cursor;
  6. import android.database.sqlite.SQLiteException;
  7. import android.net.Uri;
  8. import android.os.Bundle;
  9. import android.util.Log;
  10. import android.widget.ScrollView;
  11. import android.widget.TableLayout;
  12. import android.widget.TextView;
  13. /**
  14.  * 读取手机短信
  15.  *
  16.  * @author sunboy_2050
  17.  * @since  http://blog.csdn.net/sunboy_2050
  18.  * @date   2012.03.06
  19.  */
  20. public class smsRead extends Activity {
  21.     @Override
  22.     public void onCreate(Bundle savedInstanceState) {
  23.         super.onCreate(savedInstanceState);
  24.         TextView tv = new TextView(this);
  25.         tv.setText(getSmsInPhone());
  26.         ScrollView sv = new ScrollView(this);
  27.         sv.addView(tv);
  28.         setContentView(sv);
  29.     }
  30.     public String getSmsInPhone() {
  31.         final String SMS_URI_ALL = “content://sms/”;
  32.         final String SMS_URI_INBOX = “content://sms/inbox”;
  33.         final String SMS_URI_SEND = “content://sms/sent”;
  34.         final String SMS_URI_DRAFT = “content://sms/draft”;
  35.         final String SMS_URI_OUTBOX = “content://sms/outbox”;
  36.         final String SMS_URI_FAILED = “content://sms/failed”;
  37.         final String SMS_URI_QUEUED = “content://sms/queued”;
  38.         StringBuilder smsBuilder = new StringBuilder();
  39.         try {
  40.             Uri uri = Uri.parse(SMS_URI_ALL);
  41.             String[] projection = new String[] { “_id”, “address”, “person”, “body”, “date”, “type” };
  42.             Cursor cur = getContentResolver().query(uri, projection, null, null, “date desc”);      // 获取手机内部短信
  43.             if (cur.moveToFirst()) {
  44.                 int index_Address = cur.getColumnIndex(“address”);
  45.                 int index_Person = cur.getColumnIndex(“person”);
  46.                 int index_Body = cur.getColumnIndex(“body”);
  47.                 int index_Date = cur.getColumnIndex(“date”);
  48.                 int index_Type = cur.getColumnIndex(“type”);
  49.                 do {
  50.                     String strAddress = cur.getString(index_Address);
  51.                     int intPerson = cur.getInt(index_Person);
  52.                     String strbody = cur.getString(index_Body);
  53.                     long longDate = cur.getLong(index_Date);
  54.                     int intType = cur.getInt(index_Type);
  55.                     SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”);
  56.                     Date d = new Date(longDate);
  57.                     String strDate = dateFormat.format(d);
  58.                     String strType = “”;
  59.                     if (intType == 1) {
  60.                         strType = “接收”;
  61.                     } else if (intType == 2) {
  62.                         strType = “发送”;
  63.                     } else {
  64.                         strType = “null”;
  65.                     }
  66.                     smsBuilder.append(“[ “);
  67.                     smsBuilder.append(strAddress + “, “);
  68.                     smsBuilder.append(intPerson + “, “);
  69.                     smsBuilder.append(strbody + “, “);
  70.                     smsBuilder.append(strDate + “, “);
  71.                     smsBuilder.append(strType);
  72.                     smsBuilder.append(” ]\n\n”);
  73.                 } while (cur.moveToNext());
  74.                 if (!cur.isClosed()) {
  75.                     cur.close();
  76.                     cur = null;
  77.                 }
  78.             } else {
  79.                 smsBuilder.append(“no result!”);
  80.             } // end if
  81.             smsBuilder.append(“getSmsInPhone has executed!”);
  82.         } catch (SQLiteException ex) {
  83.             Log.d(“SQLiteException in getSmsInPhone”, ex.getMessage());
  84.         }
  85.         return smsBuilder.toString();
  86.     }
  87. }

AndroidManifest.xml 权限

记得在AndroidManifest.xml中加入android.permission.READ_SMS这个permission

<uses-permission android:name=”android.permission.READ_SMS” />

 

运行结果:

 

代码示例

 
URI主要有:

content://sms/               所有短信
content://sms/inbox        收件箱
content://sms/sent          已发送
content://sms/draft         草稿
content://sms/outbox     发件箱
content://sms/failed       发送失败
content://sms/queued    待发送列表

sms主要结构:

  1. _id => 短消息序号 如100
  2. thread_id => 对话的序号 如100
  3. address => 发件人地址,手机号.如+8613811810000
  4. person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null
  5. date => 日期  long型。如1256539465022
  6. protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO
  7. read => 是否阅读 0未读, 1已读
  8. status => 状态 -1接收,0 complete, 64 pending, 128 failed
  9. type => 类型 1是接收到的,2是已发出
  10. body => 短消息内容
  11. service_center => 短信服务中心号码编号。如+8613800755500

String[] projection = new String[]{“address”, “body”};
Cursor cursor = getContentResolver().query(uri, projection, “where ..” new String[]{“”, “”}, “order by ..”) 

Android短信存储数据库

偶然发现了Android源码中的一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mmssms.db中。

公开的SDK中没有这个类,不能直接使用。于是自己写了一个SQLiteOpenHelper,但是查询的时候发生SQL异常。看来不能为所欲为了,不过据网上资料介绍可以拷贝db文件来实现短信数据备份。

MmsSmsDatabaseHelper.java在Android源码中的路径:

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java

 

sms数据库中的字段如下:

_id               一个自增字段,从1开始
thread_id    序号,同一发信人的id相同
address      发件人手机号码
person        联系人列表里的序号,陌生人为null
date            发件日期
protocol      协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO
read           是否阅读 0未读, 1已读
status         状态 -1接收,0 complete, 64 pending, 128 failed
type
    ALL    = 0;
INBOX  = 1;
SENT   = 2;
DRAFT  = 3;
OUTBOX = 4;
FAILED = 5;
QUEUED = 6;

body                     短信内容
service_center     短信服务中心号码编号
subject                  短信的主题
reply_path_present     TP-Reply-Path
locked

 

sms数据库表字段类型的源码:

  1. private void createSmsTables(SQLiteDatabase db) {
  2.         // N.B.: Whenever the columns here are changed, the columns in
  3.         // {@ref MmsSmsProvider} must be changed to match.
  4.         db.execSQL(“CREATE TABLE sms (” +
  5.                    “_id INTEGER PRIMARY KEY,” +
  6.                    “thread_id INTEGER,” +
  7.                    “address TEXT,” +
  8.                    “person INTEGER,” +
  9.                    “date INTEGER,” +
  10.                    “date_sent INTEGER DEFAULT 0,” +
  11.                    “protocol INTEGER,” +
  12.                    “read INTEGER DEFAULT 0,” +
  13.                    “status INTEGER DEFAULT -1,” + // a TP-Status value
  14.                                                   // or -1 if it
  15.                                                   // status hasn’t
  16.                                                   // been received
  17.                    “type INTEGER,” +
  18.                    “reply_path_present INTEGER,” +
  19.                    “subject TEXT,” +
  20.                    “body TEXT,” +
  21.                    “service_center TEXT,” +
  22.                    “locked INTEGER DEFAULT 0,” +
  23.                    “error_code INTEGER DEFAULT 0,” +
  24.                    “seen INTEGER DEFAULT 0” +
  25.                    “);”);
  26. ….
  27. }

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java

 

联系人为空

短 信数据库里面如果你是先受到陌生短信之后再把陌生人添加到联系人列表的话,短信数据库里面的person字段就为null,如果你是先添加联系人再发短信 的话,短信数据库里面的person字段就不为空了,所以你要是想通过短信数据库里的字段取得联系人的其他信息的话,只能通过地址来取。
 

参考推荐:

Android SMS Messaging

 

Android删除短信的方法

1.删除短信的函数,一条一条的删除所有短信

  1. /*
  2.  * Delete all SMS one by one
  3.  */
  4. public void deleteSMS() {
  5.     try {
  6.         ContentResolver CR = getContentResolver();
  7.         // Query SMS
  8.         Uri uriSms = Uri.parse(“content://sms/sent”);
  9.         Cursor c = CR.query(uriSms,
  10.                 new String[] { “_id”, “thread_id” }, null, null, null);
  11.         if (null != c && c.moveToFirst()) {
  12.             do {
  13.                 // Delete SMS
  14.                 long threadId = c.getLong(1);
  15.                 CR.delete(Uri.parse(“content://sms/conversations/” + threadId),
  16.                         null, null);
  17.                 Log.d(“deleteSMS”, “threadId:: “+threadId);
  18.             } while (c.moveToNext());
  19.         }
  20.     } catch (Exception e) {
  21.         // TODO: handle exception
  22.         Log.d(“deleteSMS”, “Exception:: ” + e);
  23.     }
  24. }

 

2.在AndroidManifest.xml中增加读取短信的权限

  1. <uses-permission android:name=”android.permission.READ_SMS” />
  2. <uses-permission android:name=”android.permission.WRITE_SMS” />

Android-拦截接收短信

(1) 这个例子没有Activity,类SmsReceiver继承于BroadcastReceiver
01    public class SmsReceiver extends BroadcastReceiver {
02
03       @Override
04        public void onReceive(Context context, Intent intent) {
05            // 判断是系统短信;
06            if (intent.getAction()
07                    .equals(“android.provider.Telephony.SMS_RECEIVED”)) {
08                // 不再往下传播;
09                this.abortBroadcast();
10                StringBuffer sb = new StringBuffer();
11                String sender = null;
12                String content = null;
13                String sendtime = null;
14                Bundle bundle = intent.getExtras();
15                if (bundle != null) {
16                    // 通过pdus获得接收到的所有短信消息,获取短信内容;
17                    Object[] pdus = (Object[]) bundle.get(“pdus”);
18                    // 构建短信对象数组;
19                    SmsMessage[] mges = new SmsMessage[pdus.length];
20                    for (int i = 0; i < pdus.length; i++) {
21                        // 获取单条短信内容,以pdu格式存,并生成短信对象;
22                        mges[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
23                    }
24                    for (SmsMessage mge : mges) {
25                        sb.append(“短信来自:” + mge.getDisplayOriginatingAddress()
26                                + “\n”);
27                        sb.append(“短信内容:” + mge.getMessageBody());
28
29                        sender = mge.getDisplayOriginatingAddress();// 获取短信的发送者
30                        content = mge.getMessageBody();// 获取短信的内容
31                        Date date = new Date(mge.getTimestampMillis());
32                        SimpleDateFormat format = new SimpleDateFormat(
33                                “yyyy-MM-dd HH:mm:ss”);
34                        sendtime = format.format(date);// 获取短信发送时间;
35                        // SmsManager manager = SmsManager.getDefault();
36                        // manager.sendTextMessage(“5556″,
37                        // null,”发送人:”+sender+”—–发送时间:”+sendtime+”—-内容:”+content,
38                        // null, null);//把拦截到的短信发送到指定的手机,此处为5556;
39                        // if (“5556″.equals(sender)){
40                        // //屏蔽手机号为5556的短信,这里还可以时行一些处理,如把该信息发送到第三人的手机等等。
41                        // abortBroadcast();
42                        // }
43                    }
44                    Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG)
45                            .show();        }
46
47
48        }
49
50    }
代码中:this.abortBroadcast(); 让广播机制不再传播下去。

在AndroidManifest.xml中配置的代码如下:
1    <receiver android:name=”.SmsReceiver”>
2              <intent-filter android:priority=”800″>
3                  <action android:name=”android.provider.Telephony.SMS_RECEIVED”/>
4              </intent-filter>
5          </receiver>
广播有两种不同的类型:普通广播(Normal Broadcasts)和有序广播(Ordered Broadcasts)。普通广播是完全异步的,可以被所有的接收者接收到,并且接收者无法终止广播的传播,而有序广播是按照接收者声明的优先级别,被接收者依次接收到,注意:优先级相同,则根据包名依次传递广播。
由于短信广播是一种有序广播,该有序广播会先发送给优先级最高的那个Receiver,而代码中SmsReceiver中的优先级为 800:<intent-filter android:priority=”800″>。(优先级的大小范围为 -1000 到 1000)这个优先级比收到短信的那个软件优先级高。所以SmsReceiver接收到了短信并不再往下传了,起到了拦截短信的作用。

还有,接收短信需要权限,在AndroidManifest.xml中配置:

<uses-permission android:name=”android.permission.RECEIVE_SMS”/>

若想删除收件箱中已存在的短信,请参考Android源码SmsProvider类,可以在你的应用中使用ContentProvider机制进行操作。

Context.sendBroadcast():发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast():发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者。

系统发送android.provider.Telephony.SMS_RECEIVED广播是有序广播(参见源码:SMSDispatcher.java)

(1) 这个例子没有Activity,类SmsReceiver继承于BroadcastReceiver

01 public class SmsReceiver extends BroadcastReceiver { 
02   
03    @Override
04     public void onReceive(Context context, Intent intent) {
05         // 判断是系统短信;
06         if (intent.getAction()
07                 .equals("android.provider.Telephony.SMS_RECEIVED")) {
08             // 不再往下传播;
09             this.abortBroadcast();
10             StringBuffer sb = new StringBuffer();
11             String sender = null;
12             String content = null;
13             String sendtime = null;
14             Bundle bundle = intent.getExtras();
15             if (bundle != null) {
16                 // 通过pdus获得接收到的所有短信消息,获取短信内容;
17                 Object[] pdus = (Object[]) bundle.get("pdus");
18                 // 构建短信对象数组;
19                 SmsMessage[] mges = new SmsMessage[pdus.length];
20                 for (int i = 0; i < pdus.length; i++) {
21                     // 获取单条短信内容,以pdu格式存,并生成短信对象;
22                     mges[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
23                 }
24                 for (SmsMessage mge : mges) {
25                     sb.append("短信来自:" + mge.getDisplayOriginatingAddress()
26                             + "\n");
27                     sb.append("短信内容:" + mge.getMessageBody());
28
29                     sender = mge.getDisplayOriginatingAddress();// 获取短信的发送者
30                     content = mge.getMessageBody();// 获取短信的内容
31                     Date date = new Date(mge.getTimestampMillis());
32                     SimpleDateFormat format = new SimpleDateFormat(
33                             "yyyy-MM-dd HH:mm:ss");
34                     sendtime = format.format(date);// 获取短信发送时间;
35                     // SmsManager manager = SmsManager.getDefault();
36                     // manager.sendTextMessage("5556",
37                     // null,"发送人:"+sender+"-----发送时间:"+sendtime+"----内容:"+content,
38                     // null, null);//把拦截到的短信发送到指定的手机,此处为5556;
39                     // if ("5556".equals(sender)){
40                     // //屏蔽手机号为5556的短信,这里还可以时行一些处理,如把该信息发送到第三人的手机等等。
41                     // abortBroadcast();
42                     // }
43                 }
44                 Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG)
45                         .show();        } 
46           
47           
48     
49       
50 }

代码中:this.abortBroadcast(); 让广播机制不再传播下去。

在AndroidManifest.xml中配置的代码如下:

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

广播有两种不同的类型:普通广播(Normal Broadcasts)和有序广播(Ordered Broadcasts)。普通广播是完全异步的,可以被所有的接收者接收到,并且接收者无法终止广播的传播,而有序广播是按照接收者声明的优先级别,被接 收者依次接收到,注意:优先级相同,则根据包名依次传递广播。
由于短信广播是一种有序广播,该有序广播会先发送给优先级最高的那个Receiver,而代码中SmsReceiver中的优先级为 800:<intent-filter android:priority=”800″>。(优先级的大小范围为 -1000 到 1000)这个优先级比收到短信的那个软件优先级高。所以SmsReceiver接收到了短信并不再往下传了,起到了拦截短信的作用。

还有,接收短信需要权限,在AndroidManifest.xml中配置:

<uses-permission android:name=”android.permission.RECEIVE_SMS”/>

若想删除收件箱中已存在的短信,请参考Android源码SmsProvider类,可以在你的应用中使用ContentProvider机制进行操作。

Context.sendBroadcast():发送的是普通广播,所有订阅者都有机会获得并进行处理。

Context.sendOrderedBroadcast():发送的是有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者。

系统发送android.provider.Telephony.SMS_RECEIVED广播是有序广播(参见源码:SMSDispatcher.java)

实现 Android 发短信功能

From: http://blog.chinaunix.net/uid-25422700-id-368672.html
运行效果如图所示:
首先新建一个android project
在string.xml中定义需要用到的字符串:
  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <resources>
  3.     <string name=”hello”>Hello World, MainActivity!>
  4.     <string name=”app_name”>发短信程序</string>
  5.     <string name=”str_input_phone_number”>请输入手机号</string>
  6.     <string name=”str_input_sms_content”>请输入短信内容</string>
  7.     <string name=”str_send_sms”>发送短信</string>
  8.     <string name=”str_remind_input_phone_number”>请输入手机号</string>
  9.     <string name=”str_remind_sms_send_finish”>发送完成</string>
  10. </resources>
在main.xml中编辑界面控件代码:
  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3.     android:orientation=”vertical”
  4.     android:layout_width=”fill_parent”
  5.     android:layout_height=”fill_parent”
  6.     >
  7.     <TextView
  8.      android:layout_width=”fill_parent”
  9.      android:layout_height=”wrap_content”
  10.      android:text=”@string/str_input_phone_number”
  11.      />
  12.     <EditText
  13.         android:layout_width=”fill_parent”
  14.         android:layout_height=”wrap_content”
  15.         android:id=”@+id/phone_number_editText”
  16.         />
  17.     <TextView
  18.         android:layout_width=”fill_parent”
  19.         android:layout_height=”wrap_content”
  20.         android:text=”@string/str_input_sms_content”
  21.         />
  22.     <EditText
  23.         android:layout_width=”fill_parent”
  24.         android:layout_height=”wrap_content”
  25.         android:id=”@+id/sms_content_editText”
  26.         />
  27.     <Button
  28.         android:layout_width=”wrap_content”
  29.         android:layout_height=”wrap_content”
  30.         android:text=”@string/str_send_sms”
  31.         android:id=”@+id/send_sms_button”
  32.         />
  33. </LinearLayout>
最后在MainActivity中编写发送短信的逻辑代码:
  1. package com.sms.ui;
  2. import java.util.List;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.telephony.SmsManager;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import android.widget.Toast;
  11. public class MainActivity extends Activity {
  12.     /** Called when the activity is first created. */
  13.     @Override
  14.     public void onCreate(Bundle savedInstanceState) {
  15.         super.onCreate(savedInstanceState);
  16.         setContentView(R.layout.main);
  17.         phone_number_editText = (EditText) findViewById(R.id.phone_number_editText);
  18.         sms_content_editText = (EditText) findViewById(R.id.sms_content_editText);
  19.         send_sms_button = (Button) findViewById(R.id.send_sms_button);
  20.         send_sms_button.setOnClickListener(new OnClickListener() {
  21.             @Override
  22.             public void onClick(View arg0) {
  23.                 String phone_number = phone_number_editText.getText().toString().trim();
  24.                 String sms_content = sms_content_editText.getText().toString().trim();
  25.                 if(phone_number.equals(“”)) {
  26.                     Toast.makeText(MainActivity.this, R.string.str_remind_input_phone_number, Toast.LENGTH_LONG).show();
  27.                 } else {
  28.                     SmsManager smsManager = SmsManager.getDefault();
  29.                     if(sms_content.length() > 70) {
  30.                         List<String> contents = smsManager.divideMessage(sms_content);
  31.                         for(String sms : contents) {
  32.                             smsManager.sendTextMessage(phone_number, null, sms, null, null);
  33.                         }
  34.                     } else {
  35.                      smsManager.sendTextMessage(phone_number, null, sms_content, null, null);
  36.                     }
  37.                     Toast.makeText(MainActivity.this, R.string.str_remind_sms_send_finish, Toast.LENGTH_SHORT).show();
  38.                 }
  39.             }
  40.         });
  41.     }
  42.     private EditText phone_number_editText;
  43.     private EditText sms_content_editText;
  44.     private Button send_sms_button;
  45. }
在功能清单文件中声明发短信权限:

android 中调用接口发送短信

android中可以通过两种方式发送短信

第一:调用系统短信接口直接发送短信;主要代码如下:

Java代码  收藏代码
  1. //直接调用短信接口发短信
  2. SmsManager smsManager = SmsManager.getDefault();
  3. List<String> divideContents = smsManager.divideMessage(content);
  4. for (String text : divideContents) {
  5.     smsManager.sendTextMessage(“150xxxxxxxx”, null, text, sentPI, deliverPI);
  6. }

第二:调起系统发短信功能;主要代码如下:

Java代码  收藏代码
  1. Uri uri = Uri.parse(“smsto:10010”);
  2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);
  3. it.putExtra(“sms_body”, “102”);
  4. activity.startActivity(it);


这里主要讲解第一种方法,其中大部分信息来源于互联网

1.获取短信管理器

Java代码  收藏代码
  1. SmsManager smsManager = SmsManager.getDefault();

2.拆分短信内容(手机短信长度限制)

Java代码  收藏代码
  1. List<String> divideContents = smsManager.divideMessage(content);

3.发送拆分后的内容

Java代码  收藏代码
  1. List<String> divideContents = smsManager.divideMessage(content);
  2. for (String text : divideContents) {
  3.     smsManager.sendTextMessage(“150xxxxxxxx”, null, text, sentPI, deliverPI);
  4. }

4.处理返回的发送状态

Java代码  收藏代码
  1. String SENT_SMS_ACTION = “SENT_SMS_ACTION”;
  2. Intent sentIntent = new Intent(SENT_SMS_ACTION);
  3. PendingIntent sentPI = PendingIntent.getBroadcast(context, 0, sentIntent,
  4.         0);
  5. // register the Broadcast Receivers
  6. context.registerReceiver(new BroadcastReceiver() {
  7.     @Override
  8.     public void onReceive(Context _context, Intent _intent) {
  9.         switch (getResultCode()) {
  10.         case Activity.RESULT_OK:
  11.             Toast.makeText(context,
  12.         “短信发送成功”, Toast.LENGTH_SHORT)
  13.         .show();
  14.         break;
  15.         case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
  16.         break;
  17.         case SmsManager.RESULT_ERROR_RADIO_OFF:
  18.         break;
  19.         case SmsManager.RESULT_ERROR_NULL_PDU:
  20.         break;
  21.         }
  22.     }
  23. }, new IntentFilter(SENT_SMS_ACTION));

5.处理返回的接收状态

Java代码  收藏代码
  1. String DELIVERED_SMS_ACTION = “DELIVERED_SMS_ACTION”;
  2. // create the deilverIntent parameter
  3. Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);
  4. PendingIntent deliverPI = PendingIntent.getBroadcast(context, 0,
  5.        deliverIntent, 0);
  6. context.registerReceiver(new BroadcastReceiver() {
  7.    @Override
  8.    public void onReceive(Context _context, Intent _intent) {
  9.        Toast.makeText(context,
  10.   “收信人已经成功接收”, Toast.LENGTH_SHORT)
  11.   .show();
  12.    }
  13. }, new IntentFilter(DELIVERED_SMS_ACTION));

发送短信的参数说明

Java代码  收藏代码
  1. smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)

— destinationAddress:目标电话号码
— scAddress:短信中心号码,测试可以不填
— text: 短信内容
— sentIntent:发送 –>中国移动 –> 中国移动发送失败 –> 返回发送成功或失败信号 –> 后续处理   即,这个意图包装了短信发送状态的信息
— deliveryIntent: 发送 –>中国移动 –> 中国移动发送成功 –> 返回对方是否收到这个信息 –> 后续处理  即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。