SmsManager(短信管理器)是Android提供的另一个非常常见的服务,用于管理手机短信,一般用于实现在app中发送短信的功能SmsManager提供了系列sendXxxMessage()方法用于发送短信。
调用SmsManager提供的短信接口sendTextMessage函数即可。
public void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
用到的参数:
package com.example.administrator.sendsms;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
EditText numberET,contentET;//numberEditText,contentEditText
Button send;
SmsManager sMananger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取SmsManager
sMananger = SmsManager.getDefault();
// 获取程序界面上的两个文本框和按钮
numberET = (EditText) findViewById(R.id.number);
contentET = (EditText) findViewById(R.id.content);
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phone = numberET.getText().toString();
String context = contentET.getText().toString();
ArrayList list = sMananger.divideMessage(context);
//因为一条短信有字数限制,因此要将长短信拆分
for(String text:list)
{
sMananger.sendTextMessage(phone,null,text,null,null);
}
Toast.makeText(getApplicationContext(),"发送完毕",Toast.LENGTH_SHORT).show();
}
});
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/number"
/>
<EditText
android:id="@+id/number"
android:layout_height="wrap_content"
android:layout_width="match_parent"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/content"
/>
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="2"
/>
<Button
android:id="@+id/send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:layout_gravity="center_horizontal"
/>
LinearLayout>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.sendsms">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<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>
<string name="app_name">04-SendSMSstring>
<string name="hello">Hello World, SendSms!string>
<string name="number">收件人号码:string>
<string name="content">短信内容:string>
<string name="send">发送string>
首先要通过getDefault方法获取SmsManager:
// 获取SmsManager
sMananger = SmsManager.getDefault();
获取了SmsManager之后,调用了divideMessage方法分割长短信:
ArrayList<String> list = sMananger.divideMessage(context);
之后调用sendTextMessage方法发送短信:
sMananger.sendTextMessage(phone,null,text,null,null);
此例中String.xml的代码如下:
<string name="app_name">04-SendSMSstring>
<string name="hello">Hello World, SendSms!string>
<string name="number">收件人号码:string>
<string name="content">短信内容:string>
<string name="send">发送string>
从xml语法的角度分析,resources拥有元素内容,因为它包含了其他元素(若干个string),而这若干个string元素除了拥有属性app_name、hello等等,又包含了文本内容。
我们再看activity_main.xml中关于某个TextView的代码:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/number"
/>
这个TextView的android:text属性是@string/number,意思是属性为number的一个string。也就是说,在执行activity_main.xml文件时,它会自动去资源库String.xml里寻找需要的内容。这意味着,如果按照这种方式写,当我们修改String.xml里的内容时,就可以很快改掉activity_main.xml中的内容。
一条短信只可容纳70个中文,所以当短信长度超过70个中文字符时程序就要特殊处理了。divideMessage主要用于处理这种情况。
有两种方式可以处理,一种是本例中用到的,用sendTextMessage方法:
if (message.length() > 70)
{
ArrayList<String> msgs = sms.divideMessage(message);
for (String msg : msgs)
{
sms.sendTextMessage(phoneNumber, null, msg, null, null);
}
}
else
{
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
}
一种是用sendMultipartTextMessage方法:
if (message.length() > 70)
{
ArrayList<String> msgs = sms.divideMessage(message);
ArrayList sentIntents = new ArrayList();
for(int i = 0;inull, msgs, sentIntents, null);
}
else
{
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliverPI);
}