当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发中实现发送短信的小程序示例

Android开发中实现发送短信的小程序示例

2019年07月24日  | 移动技术网IT编程  | 我要评论

江门自力村,贷款治病,黄鳝21分钟种子

2016412151249217.gif (248×371)

上图为代码结构图。

现在我们看下具体的代码。

send.java

package cn.com.sms.send; 
 
import java.util.arraylist; 
import java.util.iterator; 
 
import android.app.activity; 
import android.app.pendingintent; 
import android.content.intent; 
import android.os.bundle; 
import android.telephony.smsmanager; 
import android.util.log; 
import android.view.view; 
import android.widget.button; 
import android.widget.edittext; 
import android.widget.toast; 
 
public class send extends activity { 
  private string message; 
  private string number ; 
  private edittext edittext; 
  private edittext edittext2; 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
     edittext = (edittext) this.findviewbyid(r.id.number); 
     edittext2 = (edittext)this.findviewbyid(r.id.message); 
     
    button button = (button)this.findviewbyid(r.id.button); 
    button.setonclicklistener(new view.onclicklistener() { 
       
      public void onclick(view v) { 
         number = edittext.gettext().tostring(); 
         message = edittext2.gettext().tostring(); 
         // 在logcat中可以查看到number和message的相关信息 
         log.i("number", number); 
         log.i("message", message); 
         /*获取系统默认的信息管理器,一定要注意的是smsmanager是android.telephony.smsmanager;这和 
         *我们使用的版本有关,在 android 2.0 以前 应该使用 android.telephony.gsm.smsmanager 
         *android 2.0 之后的版本应该用 android.telephony.smsmanager。 
         */ 
        smsmanager smsmanager = smsmanager.getdefault(); 
        /*pendingintent.getbroadcast返回一个用于广播的pendingintent对象,类似于调用content.sendbroadcast(); 
         */ 
        pendingintent paintent = pendingintent.getbroadcast(send.this, 0, new intent("sms_sent"), 0); 
        pendingintent deliveryintent = pendingintent.getbroadcast(send.this, 0, new intent("sms_delivered"), 0); 
        // smsmanager.dividemessage有些时候短信如果超过了字数,我们就需要这个方法来帮我们拆分短信内容。 
        arraylist<string> smses = smsmanager.dividemessage(message); 
        iterator<string> iterator = smses.iterator(); 
        while(iterator.hasnext()){ 
          string temp = iterator.next(); 
          //发送短信 
          smsmanager.sendtextmessage(number, null, temp, paintent, deliveryintent); 
        } 
        // 弹出一个浮动框显示提示内容,toast.length_long代表浮动框显示时间的长短 
        toast.maketext(send.this, "短信发送完成", toast.length_long).show(); 
 
         
      } 
    }); 
     
  } 
} 

 

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="欢迎使用短信发送器,请输入电话号码" 
  /> 
 <edittext 
  android:id="@+id/number" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:hint="这里输入电话号码" 
 /> 
 <textview 
 android:layout_width="fill_parent"  
  android:layout_height="wrap_content"  
  android:text="欢迎使用短信发送器,请输入短信内容" 
 /> 
 <edittext 
  android:id="@+id/message" 
  android:layout_width="fill_parent" 
  android:layout_height="wrap_content" 
  android:minlines="3" 
  android:hint="这里输入短信内容" 
 /> 
 <button 
  android:id="@+id/button" 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content" 
  android:text="send" 
 /> 
</linearlayout> 

androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
   package="cn.com.sms.send" 
   android:versioncode="1" 
   android:versionname="1.0"> 
  <uses-sdk android:minsdkversion="8" /> 
  <uses-permission android:name="android.permission.send_sms"></uses-permission> 
 
  <application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".send" 
         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> 
</manifest> 

最终效果图为:

2016412151344499.gif (369×405)

和打电话小程序一样,这里也需要开启两个avd才能进行功能测试。


碎碎念:

发短信应用的主要的类就是smsmanager。 在 android 2.0 以前 应该使用 android.telephony.gsm.smsmanager

之后应该用 android.telephony.smsmanager;

smsmanager smsmanager = smsmanager.getdefault();

意思为获取系统默认的信息管理器


smsmanager.sendtextmessage(destinationaddress, scaddress, text, sentintent, deliveryintent)

             -- destinationaddress:目标电话号码
             -- scaddress:服务商的短信中心号码(例如中国移动的短信中心号码),测试可以不填。
             -- text: 短信内容
             -- sentintent:发送 -->中国移动 --> 中国移动发送失败 --> 返回发送成功或失败信号 --> 后续处理   即,这个意图包装了短信发送状态的信息

             -- deliveryintent: 发送 -->中国移动 --> 中国移动发送成功 --> 返回对方是否收到这个信息 --> 后续处理  即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。


public static pendingintent getbroadcast (context context, int requestcode, intent intent, int flags)
返回一个用于广播的pendingintent,类似于调用context.sendbroadcast()函数
requestcode 暂时不用
intent 是用于广播的intent
flag 有:flag_one_shot, flag_no_create, flag_cancel_current, flag_update_current 用于设置新建的pendingintent是使用一次、如无则不创建、取消当前、更新当前等属性。

此外,我们还要在androidmanifest.xml中声明短信发送权限。

 <uses-permission android:name="android.permission.send_sms"/>

有的时候,我们两个avd进行模拟发短信时,会发现有时候该程序无法正常使用。系统会提示我们no dns servers found,找不到dns服务。这种情况一般是由于你的电脑没有联入网络的原因造成的。

发送短信:   

smsmanager smsmgr = smsmanager.getdefault();  
smsmgr.sendtextmessage(address, null, message, null, null);  

 
显示写短信界面:   

uri smstouri = uri.parse("smsto://10086");  
intent mintent = new intent( android.content.intent.action_sendto, smstouri );  
startactivity( mintent );  

 
发送电子邮件:  

intent i = new intent(intent.action_send);  
i.putextra(intent.extra_email, address);  
i.putextra(intent.extra_subject, filename);  
i.putextra(intent.extra_stream, uri.parse("file://" + filename)); ;  
i.settype("text/csv");  
startactivity(intent.createchooser(i, "email file"));  

升级版:
该代码为其添加了广播接收者的监听。详细代码如下

package cn.com.sms.send; 
 
import java.util.arraylist; 
import java.util.iterator; 
 
import android.app.activity; 
import android.app.pendingintent; 
import android.content.broadcastreceiver; 
import android.content.context; 
import android.content.intent; 
import android.content.intentfilter; 
import android.os.bundle; 
import android.telephony.smsmanager; 
import android.util.log; 
import android.view.view; 
import android.widget.button; 
import android.widget.edittext; 
import android.widget.toast; 
 
public class send extends activity { 
  private string message; 
  private string number ; 
  private edittext edittext; 
  private edittext edittext2; 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
     edittext = (edittext) this.findviewbyid(r.id.number); 
     edittext2 = (edittext)this.findviewbyid(r.id.message); 
     
    button button = (button)this.findviewbyid(r.id.button); 
    button.setonclicklistener(new view.onclicklistener() { 
       
      public void onclick(view v) { 
         number = edittext.gettext().tostring(); 
         message = edittext2.gettext().tostring(); 
         // 在logcat中可以查看到number和message的相关信息 
         log.i("number", number); 
         log.i("message", message); 
         /*获取系统默认的信息管理器,一定要注意的是smsmanager是android.telephony.smsmanager;这和 
         *我们使用的版本有关,在 android 2.0 以前 应该使用 android.telephony.gsm.smsmanager 
         *android 2.0 之后的版本应该用 android.telephony.smsmanager。 
         */ 
        smsmanager smsmanager = smsmanager.getdefault(); 
        /*pendingintent.getbroadcast返回一个用于广播的pendingintent对象,类似于调用content.sendbroadcast(); 
         */ 
        pendingintent paintent = pendingintent.getbroadcast(send.this, 0, new intent("sms_sent2"), 0); 
        pendingintent deliveryintent = pendingintent.getbroadcast(send.this, 0, new intent("sms_delivered2"), 0); 
         
        // 注册一个broadcastreceiver,当有匹配它的intentfilter的intent出现时,该方法会被触发 
        registerreceiver(new broadcastreceiver(){ 
 
          @override 
          public void onreceive(context context, intent intent) { 
            int resultcode = getresultcode(); 
            switch(resultcode){ 
            case activity.result_ok: 
              toast.maketext(getbasecontext(), "信息发送成功了哦、", toast.length_long).show(); 
              break; 
            default: 
              toast.maketext(getbasecontext(), "信息发送失败了哦、", toast.length_long).show(); 
               
            } 
          } 
           
           
        }, new intentfilter("sms_sent2")); 
         
         
        registerreceiver(new broadcastreceiver() { 
           
          @override 
          public void onreceive(context context, intent intent) { 
            toast.maketext(getbasecontext(), "deliveryintent", toast.length_long).show(); 
            log.i("短信接收人是否查看信息", "看了"); 
          } 
        }, new intentfilter("sms_delivered2")); 
         
         
         
        // smsmanager.dividemessage有些时候短信如果超过了字数,我们就需要这个方法来帮我们拆分短信内容。 
        arraylist<string> smses = smsmanager.dividemessage(message); 
        iterator<string> iterator = smses.iterator(); 
        while(iterator.hasnext()){ 
          string temp = iterator.next(); 
          //发送短信 
          smsmanager.sendtextmessage(number, null, temp, paintent, deliveryintent); 
        } 
        // 弹出一个浮动框显示提示内容,toast.length_long代表浮动框显示时间的长短 
        toast.maketext(send.this, "短信发送完成", toast.length_long).show(); 
 
         
      } 
    }); 
     
  } 
} 

main.xml与androidmanifest.xml和前面的代码一样。

registerreceiver()用于注册广播接受者。该方法在content中这样定义的。

public abstract intent registerreceiver(broadcastreceiver receiver,intentfilter filter);系统如果查询到满足filter的广播,便会教给receiver,让其处理。一般都是在其onreceive()方法中处理。

如果不是在代码中主动通过registerreceiver()进行注册,那么就要从androidmanifest.xml进行配置,代码如下

<receiver android:name="类名"> 
<intent-filter> 
<action android:name="接收者中intent参数的action属性" /> 
</intent-filter> 
</receiver>

这里需要注意,在配置文件中activity标签和receiver标签是平级的。

在模拟器中发送中文会接收方出现乱码的问题,但是在真机中,就不会出现乱码的情况了。所以开发者只需要正常开发短信功能,不需要编码转换。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网