android 开发 短信,Android开发之短信发送

今天要讲的是使用Android开发发送短信程序。我们先来看下运行效果

0818b9ca8b590ca3270a3433284dd417.png   

0818b9ca8b590ca3270a3433284dd417.png

图(1)                                                                                   图(2)

0818b9ca8b590ca3270a3433284dd417.png

图(3)

图(1):当我们运行项目时,出现在屏幕的效果;

图(2):当我们输入错误格式的电话号码时,出现在屏幕的效果图;

图(3):当我们输入格式正确时,短信发送成功的效果。

下面,来讲解该项目的开发过程。

1、创建一个Android项目,这里命名为SendMessage。

2、修改程序的布局文件main.xml内容。具体代码如下:

android:id="@+id/widget1"

android:background="@drawable/white"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

xmlns:android="http://schemas.android.com/apk/res/android"

>

android:id="@+id/widget27"

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:id="@+id/myEditText1"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text=""

android:textSize="18sp"

android:layout_x="60px"

android:layout_y="2px"

>

android:id="@+id/myEditText2"

android:layout_width="fill_parent"

android:layout_height="223px"

android:text=""

android:textSize="18sp"

android:layout_x="0px"

android:layout_y="52px"

>

android:id="@+id/myButton1"

android:layout_width="162px"

android:layout_height="wrap_content"

android:text="@string/str_button1"

android:layout_x="80px"

android:layout_y="302px"

>

3、修改values目录下的string.xml文件,并在该目录下新建一个color.xml文件,具体代码如下:

string.xml:

SendMessage

发送

收件人

color.xml:

#808080

#FFFFFF

#0000FF

这里说一下,为什么我们要新建color.xml文件,因为我们布局文件中要用到。大家可能已经发现,我们运行效果图的背景颜色不是黑色而是白色,系统默认情况下,背景是黑色,这里我们使用color.xml文件来修改背景颜色。

4、修改主程序,MyActivity.java,该文件的具体代码如下:

public class MyActivity 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()广播

* 将PendingIntent,电话,短信文字等参数

* 传入sendTextMessage()方法发送短信

*/

PendingIntent mPI = PendingIntent.getBroadcast

(MyActivity.this, 0, new Intent(), 0);

smsManager.sendTextMessage

(strDestAddress, null, strMessage, mPI, null);

}

catch(Exception e)

{

e.printStackTrace();

}

Toast.makeText

(

MyActivity.this,"送出成功!!" ,

Toast.LENGTH_SHORT

).show();

}

else

{

/* 电话格式与短信文字不符合条件时,以Toast提醒 */

if (isPhoneNumberValid(strDestAddress)==false)

{ /*且字数超过70字符*/

if(iswithin70(strMessage)==false)

{

Toast.makeText

(

MyActivity.this,

"电话号码格式错误+短信内容超过70字,请检查!!",

Toast.LENGTH_SHORT

).show();

}

else

{

Toast.makeText

(

MyActivity.this,

"电话号码格式错误,请检查!!" ,

Toast.LENGTH_SHORT

).show();

}

}

/*字数超过70字符*/

else if (iswithin70(strMessage)==false)

{

Toast.makeText

(

MyActivity.this,

"短信内容超过70字,请删除部分内容!!",

Toast.LENGTH_SHORT

).show();

}

}

}

});

}

/*检查字符串是否为电话号码的方法,并返回true or false的判断值*/

public static boolean isPhoneNumberValid(String phoneNumber)

{

boolean isValid = false;

/* 可接受的电话格式有:

* ^\\(? : 可以使用 "(" 作为开头

* (\\d{3}): 紧接着三个数字

* \\)? : 可以使用")"接续

* [- ]? : 在上述格式后可以使用具选择性的 "-".

* (\\d{3}) : 再紧接着三个数字

* [- ]? : 可以使用具选择性的 "-" 接续.

* (\\d{5})$: 以五个数字结束.

* 可以比较下列数字格式:

* (123)456-7890, 123-456-7890, 1234567890, (123)-456-7890

*/

String expression =

"^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{5}){1}quot;;

/* 可接受的电话格式有:

* ^\\(? : 可以使用 "(" 作为开头

* (\\d{3}): 紧接着三个数字

* \\)? : 可以使用")"接续

* [- ]? : 在上述格式后可以使用具选择性的 "-".

* (\\d{4}) : 再紧接着四个数字

* [- ]? : 可以使用具选择性的 "-" 接续.

* (\\d{4})$: 以四个数字结束.

* 可以比较下列数字格式:

* (02)3456-7890, 02-3456-7890, 0234567890, (02)-3456-7890

*/

String expression2=

"^\\(?(\\d{3})\\)?[- ]?(\\d{4})[- ]?(\\d{4}){1}quot;;

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;

}

}

}

5、到此整个项目已经开发完毕!

到此本该结束,但是考虑到一些细节,有必要说下。

本项目的基本思想:在具体实现上,是通过SmsManager对象的sendTextMessage()方法来实现的,其中sendTextMessage()方法需要传入5个值,依次是:收件人地址String、发送地址String、正文String、发送服务PendingIntent和送达服务PendingInten。在这里我们还详细的定义了电话的格式,文中有详细的说明。还约束了短信内容的字长!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISP (互联网服务提供商)

ISP&#xff1a;全称为Internet Service Provider&#xff0c;即因特网服务提供商&#xff0c;能提供拨号上网服务、网上浏览、下载文件、收发电子邮件等服务&#xff0c;是网络最终用户进入Internet的入口和桥梁。它包括Internet接入服务和Internet内容提供服务。这里主要是In…

android远程命令行工具,Android 使用 adb命令 远程安装apk

【UWP】解析GB2312、GBK编码网页乱码问题在WebHttpRequest请求网页后,获取到的中文是乱码,类似这样: ˹ŵ&#xfffd;&#xfffd;Ϸ&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd; - &#xff…

多路径路由算法—ECMP、WCMP

传统的网络拓朴结构可以形象的表示为树结构&#xff0c;我们称之为“有中心的网络拓扑结构”&#xff0c;简单地认为很多流量请求最终会汇聚到主干网这样的路由中心&#xff0c;才能转发到下一条路径。 传统的路由协议都是采用单路径路由的方式&#xff0c;简单地认为&#xf…

新的JEP草案将简化Java中的撰写

偏爱继承而不是继承 有充分的理由&#xff0c;“在继承中偏爱组成”这一口头禅在文献中已多次重复。 但是&#xff0c;Java很少或根本没有语言支持来简化对象的组成。 但是&#xff0c;有了名为“简洁方法机构”的新的JEP草案&#xff0c;情况可能会略有改善。 Brian Goetz负责…

应用层组播、IP组播

通常说的组播一般指IP组播&#xff0c;IGMP协议等 什么是应用层组播&#xff1f; 应用层组播通过在应用层复制和缓存数据包而不是在路由器上复制数据包来避免IP组播的部署问题。应用层组播无须对路由器作任何修改,因此在 Internet 上非常容易部署 为了改善网络效率&#xff0…

android 酷炫倒计时,android 好用的倒计时

android倒计时 是在原有TextView的基础上进行二次开发的自定义View效果图这个主要是结合了android的CountDownTimer&#xff0c;这个一般就是发送短信的倒计时。包含功能倒计时时间超过一个小时显示 时&#xff1a;分&#xff1a;秒时间小于一小时显示&#xff1a;分 &#xff…

android 获取对象,在Android中获取LayoutInflater对象的方法

1、通过系统服务来获得&#xff0c;这是最标准的&#xff1a;LayoutInflater inflater (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);2、通过LayoutInflater的静态方法获得&#xff1a;LayoutInflater inflater LayoutInflater.from(context)…

音视频常见问题分析和解决:延迟(时延 delay)和抖动

延迟和抖动 延迟&#xff1a;是网络传输中的一个重要指标&#xff0c;测量了数据从一个端点到另外一个端点所需的时间。一般我们用毫秒作为其单位。通常我们也把延迟叫做延时&#xff0c;但是延时有时还会表示数据包发送端到接受端的往返时间。这个往返时间我们可以通过网络监…

forkjoin_应用ForkJoin –从最佳到快速

forkjoin到目前为止&#xff0c;JDK 7已很好地掌握在开发人员手中&#xff0c;并且大多数人都听说过ForkJoin&#xff0c;但是没有多少人有时间或机会去尝试它。 它引起了并且可能仍然引起一些混乱&#xff0c;与普通线程池有什么不同。 [1] 我在本文中的目标是通过一个代码示…

android usb触摸屏驱动 win10,Win10手机居然这样兼容安卓:直接运行apk!

摘要&#xff1a;“应用太少是硬伤&#xff01;”这是WP粉吐槽微软简洁而有力的一句话。最新的Win10Mobile预览版中首次引入了微软的安卓子系统&#xff0c;这也是微软推行的ProjectAstoria的一部分。那么Win10手机究竟要如何兼容安卓应用呢&#xff1f;微软最新一份招聘启事似…

GSM、UMTS、LTE

GSM 全球移动通信系统(Global System for Mobile Communications) &#xff0c;由欧洲电信标准组织ETSI制订的一个数字移动通信标准。它的空中接口采用时分多址技术。自90年代中期投入商用以来&#xff0c;被全球超过100个国家采用。GSM标准的无处不在使得在移动电话运营商之间…

Java应用程序中的验证

我经常看到的项目几乎没有任何有意识的数据验证策略。 他们的团队在截止日期&#xff0c;明确要求的巨大压力下工作&#xff0c;只是没有足够的时间以适当且一致的方式进行验证。 因此&#xff0c;数据验证代码随处可见&#xff1a;JavaScript片段&#xff0c;Java屏幕控制器&a…

android daemon 程序,(转)Android App Daemon

一直没空把App Daemon的原理整理一下&#xff0c;见不少人在问原理&#xff0c;我这里就把整个流程大概的说一下。关于进程守护&#xff0c;从接触Android没多久就一直想实现&#xff0c;网上给出的方案也是各种各样&#xff0c;有双服务方式&#xff0c;有利用系统定时器方式的…

什么是卫星的有效载荷?

直接执行特定卫星任务的仪器、设备或分系统就是卫星的有效载荷。 有效载荷是指航天器上装载的为直接实现航天器在轨运行要完成的特定任务的仪器、设备、人员、试验生物及试件等。 有效载荷的种类很多&#xff0c;即使是同一种类型的有效载荷&#xff0c;性能差别也很大。 返回型…

升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...

华为鸿蒙2.0系统升级了怎么退回EMUI11系统&#xff1f;很多用户升级了又不知道如何才能退回到原来的系统&#xff0c;下面就让老铁下载小编为大家带来&#xff0c;2.0系统升级退回EMUI11系统操作教程详解。这次开启华为鸿蒙2.0系统手机开发者beta版公测招募的机型有华为P40 、P…

OpenFlow和SDN的历史和原理介绍

OpenFlow相关的历史、新闻&#xff1a;http://blog.csdn.net/jincm13/article/details/7825754 起源与发展 【https://36kr.com/p/5035985】   OpenFlow起源于斯坦福大学的Clean Slate项目组 [1] 。CleanSlate项目的最终目的是要重新发明英特网&#xff0c;旨在改变设计已略…

可见性得以保障,并不意味着_战略模式并不意味着春天!

可见性得以保障,并不意味着是的&#xff0c;所以可以说您正在编写一个Spring MVC应用程序&#xff0c;然后您决定&#xff1a;“我想做一些单独的封装算法&#xff0c;这些算法可以互换来执行特定的行为”。 对此的经典回应是“您需要一个战略模式男孩&#xff01;”。 所以&a…

小米miuiVS华为鸿蒙,华为鸿蒙2.0 vs 小米MIUI 12.5

原标题&#xff1a;华为鸿蒙2.0 vs 小米MIUI 12.5不久前有媒体在视频中展示了鸿蒙2.0和苹果IOS14两个操作系统下App的启动速度&#xff0c;结果是鸿蒙2.0完胜IOS14。此后不久&#xff0c;该媒体发布了华为鸿蒙2.0和小米MIUI 12.5对比视频。同上次一样&#xff0c;这次依然是选择…

传播时延(propagation delay)与发送时延(transmission delay)

原文&#xff1a; http://wzw19191.blog.sohu.com/135110823.html 传播时延(propagation delay)这个概念&#xff0c;是指电磁信号或者光信号在传输介质中传输的时延&#xff0c;而在光纤或者铜线中&#xff0c;光信号和电磁信号的传播速度都在20万公里/秒以上&#xff0c;在传…

具有MicroProfile配置的可配置JAX-RS ExceptionMapper

当您使用JAX-RS创建REST服务时&#xff0c;通常要么不返回任何内容&#xff08;例如HTTP 201/2/4等&#xff09;&#xff0c;要么返回某些数据&#xff08;可能采用JSON格式&#xff08;因此HTTP 200&#xff09;&#xff0c;或者返回某些异常/错误&#xff08;例如HTTP 4xx或5…