- 浏览: 506301 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
lin_kk:
最近正在学,请问LZ有源码事例吗,如果有能发一下我邮箱吗,万分 ...
使用libgdx及其中的box2d 2.1的注意事项 -
ahong520:
编译都通不过
ffmpeg对音频解码的一般步骤 -
辽东小小:
yajun_soft 写道XXX@XXX:~$ adb she ...
adb push的Permission denied -
cdtdx:
好文, 相当不错啊. 收了.
什么是app2sd,app2ext,data2ext?app移动到SD卡哪里去了? /mnt/asec /mnt/secure -
dickycat:
学习了,最近正在学这一块,年纪大了,学起来有点吃亏!
使用libgdx及其中的box2d 2.1的注意事项
转自:http://hi.baidu.com/coolnote/blog/item/a62d26fc66cee1ebfc037f32.html 看不到的图请到原文看.
1、温故知新
广播接收者:一个广播接收者是这样一个组件,它不做什么事,仅是接受广播公告并作出相应的反应。许多广播源自于系统代码,例如公告时区的改变、电池电量低、已采取图片、用户改变了语言偏好。应用程序也可以发起广播,例如为了他其他程序知道某些数据已经下载到设备且他们可以使用这些数据
BroadcastReceiver类:是接受sendBroadcast()发送的意图(intents)的基类。可以用Context.registerReceiver()动态地注册这个类的实例,或者通过AndroidManifest.xml中<receiver>标签静态发布。
广播接收者不显示一个用户界面。然而,它们启动一个活动去响应收到的信息,或者他们可能使用NotificationManager
去通知用户。通知可以使用多种方式获得用户的注意——闪烁的背光、振动设备、播放声音等等。典型的是放在一个持久的图标在状态栏,用户可以打开获取信息。
2、准备工作:SMS涉及的主要类SmsManager
实现SMS主要用到SmsManager类,该类继承自java.lang.Object类,下面我们介绍一下该类的主要成员。
公有方法:
-
ArrayList<String> divideMessage(String
text)
当短信超过SMS消息的最大长度时,将短信分割为几块。
参数:text——初始的消息,不能为空
返回值:有序的ArrayList<String>,可以重新组合为初始的消息 -
static SmsManager getDefault()
获取SmsManager的默认实例。
返回值:SmsManager的默认实例 -
void SendDataMessage(String destinationAddress, String scAddress, short destinationPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent)
发送一个基于SMS的数据到指定的应用程序端口。
参数:
1)、destinationAddress——消息的目标地址
2)、scAddress——服务中心的地址or为空使用当前默认的SMSC 3)destinationPort——消息的目标端口号
4)、data——消息的主体,即消息要发送的数据
5)、sentIntent——如果不为空,当消息成功发送或失败这个PendingIntent就广播。结果代码是Activity.RESULT_OK表示成功,或RESULT_ERROR_GENERIC_FAILURE、RESULT_ERROR_RADIO_OFF、RESULT_ERROR_NULL_PDU之一表示错误。对应RESULT_ERROR_GENERIC_FAILURE,sentIntent可能包括额外的“错误代码”包含一个无线电广播技术特定的值,通常只在修复故障时有用。
每一个基于SMS的应用程序控制检测sentIntent。如果sentIntent是空,调用者将检测所有未知的应用程序,这将导致在检测的时候发送较小数量的SMS。
6)、deliveryIntent——如果不为空,当消息成功传送到接收者这个PendingIntent就广播。
异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。 -
void sendMultipartTextMessage(String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliverIntents)
发送一个基于SMS的多部分文本,调用者应用已经通过调用divideMessage(String text)将消息分割成正确的大小。
参数:
1)、destinationAddress——消息的目标地址
2)、scAddress——服务中心的地址or为空使用当前默认的SMSC
3)、parts——有序的ArrayList<String>,可以重新组合为初始的消息
4)、sentIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
5)、deliverIntents——跟SendDataMessage方法中一样,只不过这里的是一组PendingIntent
异常:如果destinationAddress或data是空时,抛出IllegalArgumentException异常。 -
void sendTextMessage(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)
发送一个基于SMS的文本。参数的意义和异常前面的已存在的一样,不再累述。
常量:
- public
static final int RESULT_ERROR_GENERIC_FAILURE
表示普通错误,值为1(0x00000001) - public
static final int RESULT_ERROR_NO_SERVICE
表示服务当前不可用,值为4 (0x00000004) - public
static final int RESULT_ERROR_NULL_PDU
表示没有提供pdu,值为3 (0x00000003) - public
static final int RESULT_ERROR_RADIO_OFF
表示无线广播被明确地关闭,值为2 (0x00000002) - public
static final int STATUS_ON_ICC_FREE
表示自由空间,值为0 (0x00000000) - public
static final int STATUS_ON_ICC_READ
表示接收且已读,值为1 (0x00000001) - public
static final int STATUS_ON_ICC_SENT
表示存储且已发送,值为5 (0x00000005) - public
static final int STATUS_ON_ICC_UNREAD
表示接收但未读,值为3 (0x00000003) - public
static final int STATUS_ON_ICC_UNSENT
表示存储但为发送,值为7 (0x00000007)
3、简单的SMS发送程序
1)、首先,编辑布局文件res/layout/main.xml,达到我们想要的结果,界面如下:
图1、程序运行界面
对应的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="@string/txtPhoneNo"/>
<!-- text's value define in res/values/strings.xml --> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/edtPhoneNo"/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/txtContent"/> <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" android:minLines="3" android:id="@+id/edtContent"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btnText" android:id="@+id/btnSend"/> </LinearLayout>
相应的要在res/values/strings.xm中添加上面定义的视图的text的值,如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="txtPhoneNo">Please input phone NO:</string> <string name="txtContent">Please input SMS\'s content:</string> <string name="btnText">send!</string> <string name="app_name">SMS</string> </resources>
2)、做完这些准备工作之后,我么要开始编写代码实现简单的短信发送了。
通过第一步我们构建好界面之后,现在要在上面的基础上编写业务逻辑了。大致过程为:在java源文件中,获取用户在edtPhoneNo中输入的电话号码,edtContent中输入要发送的内容;然后点击btnSend按钮发送短信,要达到这个目的我们要设置btnSend的OnClickListener以达到当点击它触发发送短信的功能,而且要发送短信就要用到我们前面介绍的SmsManager类提供的方法接口。
设置btnSend的OnClickListener的代码如下:
btnSend.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String phoneNo = edtPhoneNo.getText().toString(); String message = edtContent.getText().toString(); if (phoneNo.length() > 0 && message.length() > 0){ //call sendSMS to send message to phoneNo sendSMS(phoneNo, message); } else Toast.makeText(getBaseContext(), "Please enter both phone number and message.", Toast.LENGTH_SHORT).show(); } });
发送短信的功能的代码如下:
private void sendSMS(String phoneNumber, String message) { // ---sends an SMS message to another device--- SmsManager sms = SmsManager.getDefault(); PendingIntent pi = PendingIntent.getActivity(this, 0,
new Intent(this,TextMessage.class), 0); //if message's length more than 70 , //then call divideMessage to dive message into several part
//and call sendTextMessage() //else direct call sendTextMessage() if (message.length() > 70) { ArrayList<String> msgs = sms.divideMessage(message); for (String msg : msgs) { sms.sendTextMessage(phoneNumber, null, msg, pi, null); } } else { sms.sendTextMessage(phoneNumber, null, message, pi, null); } Toast.makeText(TextMessage.this, "短信发送完成", Toast.LENGTH_LONG).show(); }
如果你已经看了第2节介绍的SmsManager类的介绍,代码应该很好理解。在这里要说明的是,sendTextMessage方法中的第4个和第5个参数PendingIntent设为null,这样的话不能根据短信发出之后的状态做相应的事情,如短信发送失败后的提醒、接收者成功接收后的回执……完整的流程源码如下:
package skynet.com.cnblogs.www;
import java.util.ArrayList;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.*;
public class TextMessage extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSend = (Button) findViewById(R.id.btnSend);
edtPhoneNo = (EditText) findViewById(R.id.edtPhoneNo);
edtContent = (EditText) findViewById(R.id.edtContent);
btnSend.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String phoneNo = edtPhoneNo.getText().toString();
String message = edtContent.getText().toString();
if (phoneNo.length() > 0 && message.length() > 0) {
// call sendSMS to send message to phoneNo
sendSMS(phoneNo, message);
} else
Toast.makeText(getBaseContext(),
"Please enter both phone number and message.",
Toast.LENGTH_SHORT).show();
}
});
}
private Button btnSend;
private EditText edtPhoneNo;
private EditText edtContent;
private void sendSMS(String phoneNumber, String message) {
// ---sends an SMS message to another device---
SmsManager sms = SmsManager.getDefault();
PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this,
TextMessage.class), 0);
// if message's length more than 70 ,
// then call divideMessage to dive message into several part ,and call
// sendTextMessage()
// else direct call sendTextMessage()
if (message.length() > 70) {
ArrayList<String> msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage(phoneNumber, null, msg, pi, null);
}
} else {
sms.sendTextMessage(phoneNumber, null, message, pi, null);
}
Toast.makeText(TextMessage.this, "短信发送完成", Toast.LENGTH_LONG).show();
}
}
3)运行前,还要在清单文件AndroidManifest.xml中加入允许发送短信的权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="skynet.com.cnblogs.www"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TextMessage"
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"/>
</manifest>
发表评论
-
编译XT720 gingerbread
2013-05-04 11:18 821在android根目录下执行". build/env ... -
编译mx 内核成功
2013-03-18 17:48 818转 : http://hi.baidu.com/_xi ... -
ubuntu下面找不到ZTE V880设备
2012-12-06 16:22 773两种方法:第一种方法是你连上你的手机,重启电脑,再adb de ... -
Android中解决图像解码导致的OOM问题
2012-10-01 18:41 790http://7dot9.com/2011/08/androi ... -
编译Android下纯C的静态程序,undefined reference to raise
2012-07-08 23:28 2330尝试在Android下编译纯C的静态程序,执行gcc -v - ... -
开发Android下纯C程序时,打开时提示not found
2012-07-08 20:09 1337这个问题烦了我一天了..郁闷.本人想试验一下使用ndk里面的t ... -
NDK报错:make: *** 没有规则可以创建“obj/local/armeabi/objs/a/a.o”需要的目标“/a.c”。 停止。
2012-07-05 21:02 2138android开发用ndk编译so库时,有时直接从别的地 ... -
adb push的Permission denied
2012-05-30 17:19 3565遇到的问题是 zhanglanyun@zhanglan ... -
adb pull失败问题解决方法
2012-05-30 17:03 2106问题:使用adb pull命令从android系统中读取文件失 ... -
关于app2sd、a2sd、data2sd、a2sd+的区别的解释
2012-05-17 11:47 1024因为看到很多机友对这个概念不理解。首先解释一下这些缩写,全部的 ... -
什么是app2sd,app2ext,data2ext?app移动到SD卡哪里去了? /mnt/asec /mnt/secure
2012-05-17 10:56 3319Google Android手机的软件为了安全性和稳定性 ... -
android 如何自定义ProgressBar
2012-04-22 15:39 1890原文:http://blog.sina.com.cn/s/bl ... -
修改MAC,没有nvs_map.bin时该怎么做
2012-04-10 16:53 1779Basically: nvs_map.bin is what ... -
Android Activity LaunchMode 验证
2012-03-31 11:23 868在Android中,每个Activity有4种LaunchMo ... -
Android改变MAC地址
2012-03-30 13:42 21411.Find out your original MAC ad ... -
C通过JNI 层调用Java的静态和非静态方法
2012-03-26 09:47 39091、主要流程 1、 新建一个测试类TestProv ... -
使用ndk或linux下独立交叉编译(ffmpeg)
2012-03-18 21:48 22661、ndk 编译程序 在NDK的apps目录下创建he ... -
android-ndk-r7 编译 ffmpeg-0.10
2012-03-18 21:46 4555看了这篇文章 http://blog.sina.com ... -
android2.3 MODIFY_PHONE_STATE
2012-02-27 22:14 3030一直被一些莫名其妙的电话骚扰,而且只响两声就断了,一直 ... -
Androidmanifest.xml里的<uses-feature>
2011-12-27 17:10 1314如果你是一个Android用户,而且你有一个老旧的安装有and ...
相关推荐
Android 开发之旅:短信的收发及在android模拟器之间实践(一) 14 Android 开发之旅:短信的收发及在android模拟器之间实践(二) 15 Android开发之旅 Intents和Intent Filters(理论部分) 16 Android开发之旅 ...
• Android 开发之旅:短信的收发及在android模拟器之间实践(一) • Android 开发之旅:短信的收发及在android模拟器之间实践(二) • Android开发之旅: Intents和Intent Filters(理论部分)
• Android 开发之旅:短信的收发及在android模拟器之间实践(一) • Android 开发之旅:短信的收发及在android模拟器之间实践(二) • Android开发之旅: Intents和Intent Filters(理论部分)
Android系统源码短信模块,短信收发流程分析,从app层到framework层。
本项目是Android的短信收发项目实战,主要功能是短信的发送和接受,主要练习的是Android的四大组件之Broadcast广播i的使用和学习
如何实现短信的接收和发送,了解短信的收发机制
android手机短信的收发 android手机短信的收发
本代码可以实现两个模拟器之间的短信接发,并附有设计文档,希望能帮到各位。
本工具包包含中国移动、中国联通、中国电信、中国网通及短信中心短信网关模拟器及用于测试用途的手机终端模拟器. 二、功能介绍 中国移动CMPP模拟器 概述:基于CMPP v3.0 v2.0协议开发的,具有方便易用图形化的...
Android多媒体应用——短信收发源码
Android SMS短消息服务系统,自己开发的Android短信收发系统,可以用于办公等专项业务。
一个运行在android上的短信收发程序
AT命令操作GSM短信猫收发短信,支持长短信收发,收长短信自动合并成一条短信。
收发短信。 private String getSimpleDateFormat(long long_date) { /*时锟斤拷锟绞阶拷锟轿�yyyy-MM-dd HH:mm:ss"*/ SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date d ...
一个很好的短信收发测试工具,也可以用于企业短信收发。
android短信收发流流程
基于Android手机系统的java短信收发程序,本程序提供发送短信功能,并提醒短信接收。
短信收发包 SMSLib
在Android Studio实现MQTT对主题的订阅和数据的收发,以及将数据封装成对象传回MainActivity,方便进行数据处理,其操作信息在TextView中展示相关的数据。对相关的数据一目了然,同时,在页面中为物联网的开发提供了...
android开发实例,可以接收和发送短信,有一个还可以的界面设计,适用于初级android开发者学习