`
jakielong
  • 浏览: 229312 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SMS Messaging in Android(1)

阅读更多

可以安全的说,在过去的近20年里卖的每一款移动电话都拥有SMS消息功能。事实上,SMS消息是移动手机中一个杀手级的应用程序,它为移动运营商创造了稳定的收入源。理解如何在你的应用程序中使用SMS消息能帮助你产生灵感来创建下一个杀手级程序。

 

在这篇文章里,我将一览如何在你的Android应用程序中发送和接收SMS消息。对Android开发者来说,有个好消息是你不需要一款真实的设备来测试SMS消息——免费的Android模拟器提供这一功能。

 

发送SMS消息

 

开始,先启动Eclipse并创建一个新的Android工程。命名工程如图1所示。

1 使用Eclipse创建一个新的Android工程

Android使用一种基于权限的策略,应用程序所需的所有权限需要在AndroidManifest.xml文件中指定。通过这样做,当应用程序安装后,用户就能清楚地知晓应用程序需要哪些特定的访问权限。举个例子,发送SMS消息会引起用户的额外费用,在AndroidManifest.xml文件中指明SMS权限能让用户决定应用程序是否安装。

 

AndroidManifest.xml文件中,添加两个权限——SEND_SMSRECEIVE_SMS

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     
package="net.learn2develop.SMSMessaging"
     
android:versionCode="1"
     
android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SMS"
                 
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>
    <uses-permission android:name="android.permission.SEND_SMS">
    </uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS">
    </uses-permission>
</manifest>

 

res/layout文件夹下的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="Enter the phone number of recipient"
       
/>    
    <EditText
       
android:id="@+id/txtPhoneNo" 
       
android:layout_width="fill_parent"
       
android:layout_height="wrap_content"       
       
/>
    <TextView 
       
android:layout_width="fill_parent"
       
android:layout_height="wrap_content"        
       
android:text="Message"
       
/>    
    <EditText
       
android:id="@+id/txtMessage" 
       
android:layout_width="fill_parent"
       
android:layout_height="150px"
       
android:gravity="top"        
       
/>         
    <Button
       
android:id="@+id/btnSendSMS" 
       
android:layout_width="fill_parent"
       
android:layout_height="wrap_content"
       
android:text="Send SMS"
       
/>   
</LinearLayout>

 

上面的代码创建的UI如图2所示。

 

2 创建发送SMS消息的UI

接下来,在SMS Activity中,我们连接Button View,这样当用户点击它时,我们可以检查接收者的电话号码和输入的消息,然后使用sendSMS函数来发送消息。

 

package net.learn2develop.SMSMessaging;
 
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class SMS extends Activity
{
   
Button btnSendSMS;
    EditText txtPhoneNo
;
    EditText txtMessage
;
 
    /** Called when the activity is first created. */
    @Override
   
public void onCreate(Bundle savedInstanceState)
   
{
       
super.onCreate(savedInstanceState);
        setContentView
(R.layout.main);       
 
        btnSendSMS = (Button) findViewById(R.id.btnSendSMS);
        txtPhoneNo =
(EditText) findViewById(R.id.txtPhoneNo);
        txtMessage =
(EditText) findViewById(R.id.txtMessage);
 
        btnSendSMS.setOnClickListener(new View.OnClickListener()
       
{
           
public void onClick(View v)
           
{               
               
String phoneNo = txtPhoneNo.getText().toString();
               
String message = txtMessage.getText().toString();                
               
if (phoneNo.length()>0 && message.length()>0)               
                    sendSMS
(phoneNo, message);               
               
else
                    Toast.
makeText(getBaseContext(),
                       
"Please enter both phone number and message.",
                        Toast.
LENGTH_SHORT).show();
           
}
       
});       
   
}   
}

 

sendSMS函数定义如下:

 

public class SMS extends Activity
{
   
//...
 
    /** Called when the activity is first created. */
    @Override
   
public void onCreate(Bundle savedInstanceState)
   
{
       
//...
   
}
 
    //---sends an SMS message to another device---
   
private void sendSMS(String phoneNumber, String message)
   
{       
        PendingIntent pi = PendingIntent.
getActivity(this, 0,
           
new Intent(this, SMS.class), 0);               
        SmsManager sms = SmsManager.
getDefault();
        sms.
sendTextMessage(phoneNumber, null, message, pi, null);       
   
}   
}

 

为了发送一个SMS消息,你需要使用SmsManager类。不同于其它的类,你不需要直接实例化这个类;取而代之的是调用getDefault()静态方法来获取一个SmsManager对象。sendTextMessage()方法发送SMS消息和一个PendingIntentPendingIntent对象用于在以后的时间识别触发的目标。例如,发送消息后,你可以使用PendingIntent对象来显示其它的Activity。在这里,PendingIntent对象(pi)简单指向相同的ActivitySMS.java),所以,当SMS发送后,什么事情也不会发生。

 

如果你需要监视SMS消息的发送过程状况,你可以使用两个PendingIntent对象以及两个BroadcastReceiver对象,像这样:

 

    //---sends an SMS message to another device---
   
private void sendSMS(String phoneNumber, String message)
   
{       
       
String SENT = "SMS_SENT";
       
String DELIVERED = "SMS_DELIVERED";
 
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
           
new Intent(SENT), 0);
 
        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
           
new Intent(DELIVERED), 0);
 
        //---when the SMS has been sent---
        registerReceiver
(new BroadcastReceiver(){
            @Override
           
public void onReceive(Context arg0, Intent arg1) {
               
switch (getResultCode())
               
{
                   
case Activity.RESULT_OK:
                        Toast.
makeText(getBaseContext(), "SMS sent",
                                Toast.
LENGTH_SHORT).show();
                       
break;
                   
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        Toast.
makeText(getBaseContext(), "Generic failure",
                                Toast.
LENGTH_SHORT).show();
                       
break;
                   
case SmsManager.RESULT_ERROR_NO_SERVICE:
                        Toast.
makeText(getBaseContext(), "No service",
                                Toast.
LENGTH_SHORT).show();
                       
break;
                   
case SmsManager.RESULT_ERROR_NULL_PDU:
                        Toast.
makeText(getBaseContext(), "Null PDU",
                                Toast.
LENGTH_SHORT).show();
                       
break;
                   
case SmsManager.RESULT_ERROR_RADIO_OFF:
                        Toast.
makeText(getBaseContext(), "Radio off",
                                Toast.
LENGTH_SHORT).show();
                       
break;
               
}
           
}
       
}, new IntentFilter(SENT));
 
        //---when the SMS has been delivered---
        registerReceiver
(new BroadcastReceiver(){
            @Override
           
public void onReceive(Context arg0, Intent arg1) {
               
switch (getResultCode())
               
{
                   
case Activity.RESULT_OK:
                        Toast.
makeText(getBaseContext(), "SMS delivered",
                                Toast.
LENGTH_SHORT).show();
                       
break;
                   
case Activity.RESULT_CANCELED:
                        Toast.
makeText(getBaseContext(), "SMS not delivered",
                                Toast.
LENGTH_SHORT).show();
                       
break;                       
               
}
           
}
       
}, new IntentFilter(DELIVERED));       
 
        SmsManager sms = SmsManager.getDefault();
        sms.
sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);       
   
}

 

上面的代码使用一个PendingIntent对象(sendPI)来监视发送过程。当SMS消息发送后,第一个BroadcastReceiveronReceive事件会触发。在这里你可以检查发送过程的状态。第二个PendingIntent对象(deliveredPI)监视传送过程。当SMS消息成功送达时会触发第二个BroadcastReceiveronReceive事件。

 

现在,你可以按下F11来测试应用程序了。为了从一个模拟器实例发送SMS消息到另一个实例,进入SDKTools文件夹并运行Emulator.exe来简单启动另一个Android模拟器实例。

3 发送SMS消息

3演示了如何从一个模拟器发送SMS消息到另一个模拟器;使用目标模拟器的端口号(显示在窗口的左上角)作为它的电话号码。当SMS发送成功时,它会显示一个“SMS sent”消息。当它成功送达时,它会显示一个“SMS delivered”消息。注意,使用模拟器进行测试时,当SMS成功送达时,“SMS delivered”消息不会显示;它仅在真机上工作。

 

4显示了接收模拟器中SMS消息接收后的样子。消息一开始显示在通知条上(屏幕的上方)。往下拖拽通知条,显示出接收到的消息。查看完整的消息,点击那个消息。

4 Android模拟器接收SMS消息

如果你不想触及发送SMS消息的所有麻烦,你可以使用一个Intent对象来帮助你发送SMS消息。下面的代码就演示了如何引发内建的SMS程序来帮助你发送SMS消息:

 

        Intent sendIntent = new Intent(Intent.ACTION_VIEW);
        sendIntent.putExtra("sms_body", "Content of the SMS goes here...");
        sendIntent.setType("vnd.android-dir/mms-sms");
        startActivity(sendIntent);

 

5显示了内建的SMS应用程序发送SMS消息。

5 引发内建的SMS程序

接收SMS消息

 

除了可以程序化的发送SMS消息,你还可以使用一个BroadcastReceiver对象来拦截新的SMS消息。

 

想看如何在Android应用程序中接收SMS消息的话,可以在AndroidManifest.xml文件中添加<receiver>元素,这样,新来的SMS消息就能被SmsReceiver类拦截:

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     
package="net.learn2develop.SMSMessaging"
     
android:versionCode="1"
     
android:versionName="1.0.0">
   
<application android:icon="@drawable/icon" android:label="@string/app_name">
       
<activity android:name=".SMS"
                 
android:label="@string/app_name">
           
<intent-filter>
               
<action android:name="android.intent.action.MAIN" />
               
<category android:name="android.intent.category.LAUNCHER" />
           
</intent-filter>
       
</activity>       
 
        <receiver android:name=".SmsReceiver">
           
<intent-filter>
               
<action android:name=
                   
"android.provider.Telephony.SMS_RECEIVED" />
           
</intent-filter>
       
</receiver>
 
    </application>
   
<uses-permission android:name="android.permission.SEND_SMS">
   
</uses-permission>
   
<uses-permission android:name="android.permission.RECEIVE_SMS">
   
</uses-permission>
</manifest>

 

添加一个新的类文件并命名为SmsReceiver.java(如图6)。

6 添加SmsReceiver.java文件到工程中

SmsReceiver类中,扩展BroadcastReceiver类,并重写onReceive方法:

 

package net.learn2develop.SMSMessaging;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
 
public class SmsReceiver extends BroadcastReceiver
{
        @Override
        
public void onReceive(Context context, Intent intent)
      
{        
        
}
}

 

SMS消息接收后,onReceive()方法会触发。SMS消息附着在Intent对象上(onReceive方法的第二个参数,intent)的Bundle对象里。消息以PDU格式储存在一个对象数组里。要提取每个消息,可以使用SmsMessage类的createFromPdu()静态方法。然后,使用Toast类显示SMS消息:

 

package net.learn2develop.SMSMessaging;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;
 
public class SmsReceiver extends BroadcastReceiver
{
    @Override
   
public void onReceive(Context context, Intent intent)
   
{
       
//---get the SMS message passed in---
        Bundle bundle = intent.
getExtras();       
        SmsMessage
[] msgs = null;
       
String str = "";           
       
if (bundle != null)
       
{
           
//---retrieve the SMS message received---
           
Object[] pdus = (Object[]) bundle.get("pdus");
            msgs =
new SmsMessage[pdus.length];           
           
for (int i=0; i<msgs.length; i++){
                msgs
[i] = SmsMessage.createFromPdu((byte[])pdus[i]);               
                str +=
"SMS from " + msgs[i].getOriginatingAddress();                    
                str +=
" :";
                str += msgs
[i].getMessageBody().toString();
                str +=
"\n";       
           
}
           
//---display the new SMS message---
            Toast.
makeText(context, str, Toast.LENGTH_SHORT).show();
       
}                        
   
}
}

分享到:
评论

相关推荐

    Sms.rar_MMS_android sms_android 短信_sms_sms android

    这个名为"Sms.rar"的压缩包包含了一个关于Android SMS(Short Message Service)功能的源码实现,特别提到了MMS(Multimedia Messaging Service)的支持,这允许发送和接收包含多媒体内容的消息。下面将详细解释这些...

    SMS.rar_android_android sms.zip_sms_sms android_sms java

    1. **Android SMS API**: Android提供了`SmsManager`类,它是处理短信发送、接收和查询的主要接口。开发者可以通过调用`SmsManager.getDefault()`获取默认的SmsManager实例,然后使用它的方法如`sendTextMessage()...

    英文原版-Instant Messaging in Java 1st Edition

    This book describes how to create Instant Messaging applications in Java and covers the Jabber IM protocols. If you want to create new IM systems, integrate them with your existing software, or wish ...

    Instant Messaging in Java

    "Instant Messaging in Java" 针对使用 Java 进行即时通讯系统开发进行了深入探讨,特别是针对 Jabber 协议栈的实现。 Jabber 是一个开源的即时通讯协议,基于 XML 协议栈,它允许开发者构建可扩展、安全且跨平台的...

    Instant Messaging in JAVA

    部分内容:文档提到了《Instant Messaging in Java》这本书,作者是IAIN SHIGE OKA,由MANNING出版社出版。书中的内容涵盖了Jabber协议的详细介绍,包括其技术基础、模型以及在Java环境下的具体应用。此外,还提到了...

    Instant Messaging in Java 及源代码

    Manning - Instant Messaging in Java - The Jabber Protocols及书中源代码。 介绍jabber(xmpp)协议以及用java编写即时通讯(im)软件的好书,深入浅出。

    SMS(Short Message Service)教程(英文)

    SMS (Short Message Service) has achieved huge success in the wireless world. Billions of SMS messages are sent every day. SMS is now a major revenue generator for wireless carriers. A lot of ...

    Android2.1消息应用(Messaging)源码学习笔记.pdf

    2. transaction.PrivilegedSmsReceiver:该接收器是 SmsReceiver 的子类,唯一的区别在于该 Receiver 被申明有 permission 为 android.permission.BROADCAST_SMS。 3. transaction.MmsSystemEventReceiver:Mms ...

    [MMS_051271]SMS messaging with Micrologix.rar

    《AB PLC与SMS消息传递:基于Micrologix的实践教程》 在现代工业自动化系统中,人机交互和远程监控成为不可或缺的一部分。Allen Bradley(AB)的PLC(可编程逻辑控制器)因其可靠性和灵活性而备受青睐,尤其其...

    Clone Detection in Secure Messaging- Improving Post-Compromise

    Clone Detection in Secure Messaging- Improving Post-Compromise Security in Practice

    安卓Android源码——sms1.rar

    - **Multimedia Messaging Service (MMS)**: 除了文本,还可以发送图片、音频、视频等多媒体内容,而 SMS 只能发送文本。 - MMS 需要更复杂的协议和网络支持,如 WAP 或彩信中心 (MMSC)。 7. **Android 源码中的...

    (2003 Wiley)Mobile Messaging Technologies and Services:SMS,EMS and MMS.rar

    1. 短信服务(SMS,Short Message Service): SMS是最早的移动数据服务之一,允许用户通过手机发送和接收文本消息。这项技术的核心在于其简洁和高效,能够在全球范围内广泛使用,不受网络覆盖或设备限制。SMS的...

    GSMA - Messaging in the 5G era -5G消息白皮书.pdf

    随着5G网络的部署,消息服务将不再仅限于传统的短信(SMS)形式,而是会演变为一种全新的体验,提供更高的速度、更低的延迟和更大的连接能力。5G消息(RCS - Rich Communication Services)是其中的关键技术,它允许...

    Android 短信SMS发送代码流程

    Android 短信SMS发送代码流程 Android 短信SMS发送代码流程是 Android 操作系统中的一种重要功能,允许用户发送短信给其他用户。本文将详细介绍 Android 短信SMS发送代码流程的实现机制。 Messaging 应用层 在 ...

    Beginning Android 4 Application Development

    create rich user interfaces, and manage data Helps you work with SMS and messaging APIs, the Android SDK, and using location-based services Details how to package and publish your applications to the...

    Android代码-Odoo Messaging

    Odoo Mobile Messaging Client v2.0 Odoo Mobile Client is Enterprise Social Client based on Android, enables you to access your Odoo Wall Messages from inbox and groups, encourage you to updated with ...

    RabbitMQ-in-Action-Distributed-Messaging-for-Everyone.pdf

    1 This book is a product of how much we love writing software, and our hope is that it will help you do the same in ways you never thought possible. A LVARO V IDELA D ÜBENDORF , S WITZERLAND J ASON ...

    SlyceMessaging

    A messaging library for Android A messaging library for Android A messaging library for Android 地址 :https://github.com/Slyce-Inc/SlyceMessaging

    Android代码-VoIP.ms SMS

    VoIP.ms SMS is an Android messaging app for VoIP.ms that seeks to replicate the aesthetic of Android Messages. Rationale A number of people use VoIP.ms as a cheaper alternative to subscribing to a ...

Global site tag (gtag.js) - Google Analytics