欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之SendSMS短信管理器实现教程

程序员文章站 2022-08-11 09:53:45
smsmanager 简介 smsmanager(短信管理器)是android提供的另一个非常常见的服务,用于管理手机短信,一般用于实现在app中发送短信的功能smsmanag...

smsmanager

简介

smsmanager(短信管理器)是android提供的另一个非常常见的服务,用于管理手机短信,一般用于实现在app中发送短信的功能smsmanager提供了系列sendxxxmessage()方法用于发送短信。

使用方法

调用smsmanager提供的短信接口sendtextmessage函数即可。

public  void  sendtextmessage (string destinationaddress, string scaddress, string text, pendingintent sentintent, pendingintent deliveryintent)

用到的参数:

string destinationaddress 收信人电话号码 string scaddress 短信中心的号码,一般用null表示默认 string text 短信的内容 pendingintent sentintent 短信发送状态的信息,一般用null pendingintent deliveryintent 对方接收状态的信息,一般用null

源代码

mainactivity.java

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.pidemessage(context);

                //因为一条短信有字数限制,因此要将长短信拆分
                for(string text:list)
                {
                    smananger.sendtextmessage(phone,null,text,null,null);
                }

                toast.maketext(getapplicationcontext(),"发送完毕",toast.length_short).show();
            }
        });
    }
}

activity_main.xml




    

    

    

    

androidmanifest.xml




    
        
            
                

                
            
        
    

    //获取系统权限,若没有添加下面这句代码,发送短信时会闪退
    

strings.xml(res/values/strings.xml)


    04-sendsms
    hello world, sendsms!

    收件人号码:
    短信内容:
    发送


注意事项

关于smsmanager

首先要通过getdefault方法获取smsmanager:

// 获取smsmanager
smananger = smsmanager.getdefault();

获取了smsmanager之后,调用了pidemessage方法分割长短信:

arraylist list = smananger.pidemessage(context);

之后调用sendtextmessage方法发送短信:

smananger.sendtextmessage(phone,null,text,null,null);

关于string.xml

此例中string.xml的代码如下:


    04-sendsms
    hello world, sendsms!

    收件人号码:
    短信内容:
    发送


从xml语法的角度分析,resources拥有元素内容,因为它包含了其他元素(若干个string),而这若干个string元素除了拥有属性app_name、hello等等,又包含了文本内容。

我们再看activity_main.xml中关于某个textview的代码:

    

这个textview的android:text属性是@string/number,意思是属性为number的一个string。也就是说,在执行activity_main.xml文件时,它会自动去资源库string.xml里寻找需要的内容。这意味着,如果按照这种方式写,当我们修改string.xml里的内容时,就可以很快改掉activity_main.xml中的内容。

关于pidemessage

一条短信只可容纳70个中文,所以当短信长度超过70个中文字符时程序就要特殊处理了。pidemessage主要用于处理这种情况。

有两种方式可以处理,一种是本例中用到的,用sendtextmessage方法:

if (message.length() > 70) 
{  
    arraylist msgs = sms.pidemessage(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 msgs = sms.pidemessage(message);  

    arraylist sentintents =  new arraylist();  
    for(int i = 0;i