常量:
1)、首先,编辑布局文件res/layout/main.xml,达到我们想要的结果,界面如下:
android:background="@drawable/white"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_textview"
android:textSize="16sp"
android:layout_x="0px"
android:layout_y="12px"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="18sp"
android:layout_x="60px"
android:layout_y="2px"
>
android:layout_width="fill_parent"
android:layout_height="223px"
android:text=""
android:textSize="18sp"
android:layout_x="0px"
android:layout_y="52px"
>
2010-06-14 16:44 by 吴秦, 13437 visits, 收藏, 编辑
本文通过运行两个Android模拟器,介绍在Android中如何实现短信服务(SMS,short message service)的功能。通过这个例子,我想带给大家的是:更加熟悉之前介绍过的Android应用程序的概念及技术细节,且通过实例调度大家的兴趣。我之所以选择SMS为例子,主要原因是SMS已经非常成熟了,从中可以发掘更多的信息和技术细节,而且我相信大部分人发短信比打电话多。
本文的主要内容如下:
广播接收者:一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数据
BroadcastReceiver类:是接受sendBroadcast()发送的意图(intents)的基类。可以用Context.registerReceiver()动态地注册这个类的实例,或者通过AndroidManifest.xml中
广播接收者不显示一个用户界面。然而,它们启动一个活动去响应收到的信息,或者他们可能使用NotificationManager
去通知用户。通知可以使用多种方式获得用户的注意——闪烁的背光、振动设备、播放声音等等。典型的是放在一个持久的图标在状态栏,用户可以打开获取信息。
实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。
公有方法:
常量:
1)、首先,编辑布局文件res/layout/main.xml,达到我们想要的结果,界面如下:
android:background="@drawable/white"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/str_textview"
android:textSize="16sp"
android:layout_x="0px"
android:layout_y="12px"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="18sp"
android:layout_x="60px"
android:layout_y="2px"
>
android:layout_width="fill_parent"
android:layout_height="223px"
android:text=""
android:textSize="18sp"
android:layout_x="0px"
android:layout_y="52px"
>
2)、做完这些准备工作之后,我么要开始编写代码实现简单的短信发送了。
package irdc.EX05_03;
import android.app.Activity; /*必需引用PendingIntent类才能使用getBrocast()*/
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle; /*必需引用telephony.gsm.SmsManager类才能使用sendTextMessage()*/
import android.telephony.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EX05_03 extends Activity
{
/* 声明变量一个Button与两个EditText */
private Button mButton1;
private EditText mEditText1;
private EditText mEditText2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* 透过findViewById建构子来建构EditText1,EditText2与Button对象 */
mEditText1 = (EditText) findViewById(R.id.myEditText1);
mEditText2 = (EditText) findViewById(R.id.myEditText2);
mButton1 = (Button) findViewById(R.id.myButton1);
/* 将默认文字加载EditText中 */
mEditText1.setText("请输入电话号码");
mEditText2.setText("请输入短信内容!!");
/* 设定onClickListener 让使用者点选EditText时做出反应 */
mEditText1.setOnClickListener(new EditText.OnClickListener()
{
public void onClick(View v)
{
/* 点选EditText时清空内文 */
mEditText1.setText("");
}
});
/* 设定onClickListener 让使用者点选EditText时做出反应 */
mEditText2.setOnClickListener(new EditText.OnClickListener()
{
public void onClick(View v)
{
/* 点选EditText时清空内文 */
mEditText2.setText("");
}
});
/* 设定onClickListener 让使用者点选Button时做出反应 */
mButton1.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
/* 由EditText1取得简讯收件人电话 */
String strDestAddress = mEditText1.getText().toString();
/* 由EditText2取得简讯文字内容 */
String strMessage = mEditText2.getText().toString();
/* 建构一取得default instance的 SmsManager对象 */
SmsManager smsManager = SmsManager.getDefault();
// TODO Auto-generated method stub
/* 检查收件人电话格式与简讯字数是否超过70字符 */
if (isPhoneNumberValid(strDestAddress) == true
&& iswithin70(strMessage) == true)
{
try
{
/*
* 两个条件都检查通过的情况下,发送简讯 *
* 先建构一PendingIntent对象并使用getBroadcast()方法进行Broadcast *
* 将PendingIntent,电话,简讯文字等参数传入sendTextMessage()方法发送简讯
*/
PendingIntent mPI = PendingIntent.getBroadcast(EX05_03.this, 0,
new Intent(), 0);
smsManager.sendTextMessage(strDestAddress, null, strMessage, mPI,
null);
} catch (Exception e)
{
e.printStackTrace();
}
Toast.makeText(EX05_03.this, "送出成功!!", Toast.LENGTH_SHORT).show();
mEditText1.setText("");
mEditText2.setText("");
}
/* 电话格式与简讯文字不符合条件时,使用Toast告知用户检查 */
else
{
/* 电话格式不符 */
if (isPhoneNumberValid(strDestAddress) == false)
{
/* 且字数超过70字符 */
if (iswithin70(strMessage) == false)
{
Toast.makeText(EX05_03.this, "电话号码格式错误+短信内容超过70字,请检查!!",
Toast.LENGTH_SHORT).show();
} else
{
Toast
.makeText(EX05_03.this, "电话号码格式错误,请检查!!", Toast.LENGTH_SHORT)
.show();
}
}
/* 字数超过70字符 */
else if (iswithin70(strMessage) == false)
{
Toast.makeText(EX05_03.this, "短信内容超过70字,请删除部分内容!!",
Toast.LENGTH_SHORT).show();
}
}
}
});
}
/* 检查字符串是否为电话号码的方法,并回传true or false的判断值 */
public static boolean isPhoneNumberValid(String phoneNumber)
{
boolean isValid = false;
/*
* 可接受的电话格式有: * ^\\(? : 可以使用 "(" 作为开头 * (\\d{3}): 紧接着三个数字 * \\)? : 可以使用")"接续
* * [- ]? : 在上述格式后可以使用具选择性的 "-". * (\\d{3}) : 再紧接着三个数字 * [- ]? : 可以使用具选择性的
* "-" 接续. * (\\d{4})$: 以四个数字结束. * 可以比对下列数字格式: * (123)456-7890,
* 123-456-7890, 1234567890, (123)-456-7890
*/
String expression = "^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$";
/*
* 可接受的电话格式有: * ^\\(? : 可以使用 "(" 作为开头 * (\\d{2}): 紧接着两个数字 * \\)? : 可以使用")"接续
* * [- ]? : 在上述格式后可以使用具选择性的 "-". * (\\d{4}) : 再紧接着四个数字 * [- ]? : 可以使用具选择性的
* "-" 接续. * (\\d{4})$: 以四个数字结束. * 可以比对下列数字格式: * (123)456-7890,
* 123-456-7890, 1234567890, (123)-456-7890
*/
String expression2 = "^\\(?(\\d{2})\\)?[- ]?(\\d{4})[- ]?(\\d{4})$";
CharSequence inputStr = phoneNumber;
/* 建立Pattern */Pattern pattern = Pattern.compile(expression);
/* 将Pattern 以参数传入Matcher作Regular expression */
Matcher matcher = pattern.matcher(inputStr);
/* 建立Pattern2 */Pattern pattern2 = Pattern.compile(expression2);
/* 将Pattern2 以参数传入Matcher2作Regular expression */
Matcher matcher2 = pattern2.matcher(inputStr);
if (matcher.matches() || matcher2.matches())
{
isValid = true;
}
return isValid;
}
public static boolean iswithin70(String text)
{
if (text.length() <= 70)
return true;
else
return false;
}
}