

Android 几种发送短信的方法
source link: http://www.androidchina.net/3316.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

android中发送短信很简单,
首先要在Mainfest.xml中加入所需要的权限:
<
uses-permission
android:name
=
"android.permission.SEND_SMS"
></
uses-permission
>
<
uses-permission
android:name
=
"android.permission.READ_SMS"
></
uses-permission
>
<
uses-permission
android:name
=
"android.permission.RECEIVE_SMS"
></
uses-permission
>
为了后面测试方便,干脆把SMS的所有权限加上。
public
class
testSms
extends
Activity {
...
private
void
send1(String phone, String message){
PendingIntent pi = PendingIntent.getActivity(
this
,
0
,
new
Intent(
this
, testSms.
class
),
0
);
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phone,
null
, message, pi,
null
);
}
}
如果想知道短信发送后的状态,需要两个Receiver来实现
private
void
send2(String number, String message){
String SENT =
"sms_sent"
;
String DELIVERED =
"sms_delivered"
;
PendingIntent sentPI = PendingIntent.getActivity(
this
,
0
,
new
Intent(SENT),
0
);
PendingIntent deliveredPI = PendingIntent.getActivity(
this
,
0
,
new
Intent(DELIVERED),
0
);
registerReceiver(
new
BroadcastReceiver(){
@Override
public
void
onReceive(Context context, Intent intent) {
switch
(getResultCode())
{
case
Activity.RESULT_OK:
Log.i(
"====>"
,
"Activity.RESULT_OK"
);
break
;
case
SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Log.i(
"====>"
,
"RESULT_ERROR_GENERIC_FAILURE"
);
break
;
case
SmsManager.RESULT_ERROR_NO_SERVICE:
Log.i(
"====>"
,
"RESULT_ERROR_NO_SERVICE"
);
break
;
case
SmsManager.RESULT_ERROR_NULL_PDU:
Log.i(
"====>"
,
"RESULT_ERROR_NULL_PDU"
);
break
;
case
SmsManager.RESULT_ERROR_RADIO_OFF:
Log.i(
"====>"
,
"RESULT_ERROR_RADIO_OFF"
);
break
;
}
}
},
new
IntentFilter(SENT));
registerReceiver(
new
BroadcastReceiver(){
@Override
public
void
onReceive(Context context, Intent intent){
switch
(getResultCode())
{
case
Activity.RESULT_OK:
Log.i(
"====>"
,
"RESULT_OK"
);
break
;
case
Activity.RESULT_CANCELED:
Log.i(
"=====>"
,
"RESULT_CANCELED"
);
break
;
}
}
},
new
IntentFilter(DELIVERED));
SmsManager smsm = SmsManager.getDefault();
smsm.sendTextMessage(number,
null
, message, sentPI, deliveredPI);
}
在模拟器上是看不到Receiver中的log信息的,据网上说在手机上是可以实现的,只可惜手中无机,也只能纸上谈兵了。
上面都是发送文本文件,如果想发送一些非文本,比如加密数据,可以用以下方法:
</div>
<div>
private
void
send2(String number, String message){
SmsManager smsm = SmsManager.getDefault();
short
port =
1000
;
PendingIntent pi = PendingIntent.getBroadcast(test.
this
,
0
,
new
Intent(),
0
);
smsm.sendDataMessage(number,
null
, port, message.getBytes(), pi,
null
);
}
</div>
<div>
调用系统的短信界面,这个方法需要用户自己输入接收方的电话号码
private
void
send(String message){
Intent sendIntent =
new
Intent(Intent.ACTION_VIEW);
sendIntent.putExtra(
"sms_body"
, message);
sendIntent.setType(
"vnd.android-dir/mms-sms"
);
}
这个方法自动设置接收方的号码
private
void
send1(String number, String message){
Uri uri = Uri.parse(
"smsto:"
+ number);
Intent sendIntent =
new
Intent(Intent.ACTION_VIEW, uri);
sendIntent.putExtra(
"sms_body"
, message);
startActivity(sendIntent);
}
短信的接受,需要实现BroadcastReceiver类,监听系统消息
首先在Mainfest.xml中加入申明,SmsReceiver为实现类
<
receiver
android:name
=
".SmsReceiver"
>
<
intent-filter
>
<
action
android:name
=
"android.provider.Telephony.SMS_RECEIVED"
/>
</
intent-filter
>
</
receiver
>
如果是方法3,使用sendDataMessage时需要加入
<
receiver
android:name
=
".SmsReceiver"
>
<
intent-filter
>
<
action
android:name
=
"android.intent.action.DATA_SMS_RECEIVED"
/>
<
data
android:scheme
=
"sms"
/>
<
data
android:host
=
"localhost"
/>
<
data
android:port
=
"1000"
/>
</
intent-filter
>
</
receiver
>
将其中的dat数据注释掉,模拟器上也可以接收到短信; port跟sendDataMessage中的端口值不一致时,也没有问题,太神奇了
public
class
SmsReceiver
extends
BroadcastReceiver {
@Override
public
void
onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs =
null
;
String phone;
String message;
if
(bundle !=
null
){
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]);
phone = msgs[i].getOriginatingAddress();
message = msgs[i].getMessageBody();
}
}
}
}
如果是sendDataMessage发送:
public
class
SmsReceiver
extends
BroadcastReceiver {
@Override
public
void
onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs =
null
;
String phone;
String message;
if
(bundle !=
null
){
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]);
phone = msgs[i].getOriginatingAddress();
byte
data[] = SmsMessage.createFromPdu((
byte
[])pdus[i]).getUserData();
message =
new
String(data);
}
}
}
}
不一样的地方是message的获取时使用getUserData()方法。
原文转自:http://blog.csdn.net/rangq1/article/details/5793953
转载请注明:Android开发中文站 » Android 几种发送短信的方法
Recommend
-
12
Android手机通过电脑上网的几种方法 本文定位:没有wifi,想让手机通过电脑的有线连接上网。 android手机可以通过wifi上...
-
9
版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。 未经允许,不得转载。 在实际开发的过程中,会有一些需要保持屏幕常亮,避免进入锁屏状态的需求。最常见的就是视频播放的...
-
7
常见的告警方式有:邮件,电话,短信,微信。 短信和电话,通常是收费的(若你有不收费的,可以评论分享一下),而邮件又不是那么及时,因此最后我选择微信通知。 这里说的微信,是企业微信,而我之前用注册过个体户的执照,因此可以很轻松就可...
-
6
在技术上如何实现发送一条短信?我是3y,一年CRUD经验用十年的markdown程序员 常年被誉为优质八股文选手austin项目实现的第一个渠道::从发送短信开始01、短信介绍在项目介绍的时候,已...
-
7
V2EX › Java 如何大量请求发送短信接口? Jekins · 1 天前 · 2026 次点击
-
11
移动发送奇怪短信?我想起了通讯行业的核弹级漏洞-51CTO.COM 移动发送奇怪短信?我想起了通讯行业的核弹级漏洞 作者:苏苏 2022-04-29 21:37:34 这个漏洞虽然存在已久,但是却一直在被...
-
8
Go语言 实现发送短信验证码 并登录 goCenter · 大约1分钟之前 · 84 次点...
-
23
V2EX › Android Pixel6a 无法发送短信 Tokyo101
-
10
几种使用Go发送IP包的方法 我们使用Go标准库中的net包,很容易发送UDP和TCP的packet,以及在它们基础上开发应用层的程序,比如HTTP、...
-
18
🔍 想知道YouTube验证码是否收费?快来看这个详细解析!💡 https://www.chenweiliang.com/cwl-30928.html 点击上方链接了解更多!👆
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK