15

Android 几种发送短信的方法

 3 years ago
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.
neoserver,ios ssh client
Android 几种发送短信的方法 – Android开发中文站

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
    • www.androidchina.net 3 years ago
    • Cache

    Android 保持屏幕常亮的几种方法

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。 未经允许,不得转载。 在实际开发的过程中,会有一些需要保持屏幕常亮,避免进入锁屏状态的需求。最常见的就是视频播放的...

  • 7

    常见的告警方式有:邮件,电话,短信,微信。 短信和电话,通常是收费的(若你有不收费的,可以评论分享一下),而邮件又不是那么及时,因此最后我选择微信通知。 这里说的微信,是企业微信,而我之前用注册过个体户的执照,因此可以很轻松就可...

  • 6
    • zhuanlan.zhihu.com 3 years ago
    • Cache

    在技术上如何实现发送一条短信?

    在技术上如何实现发送一条短信?我是3y,一年CRUD经验用十年的markdown程序员 ‍ 常年被誉为优质八股文选手austin项目实现的第一个渠道::从发送短信开始01、短信介绍在项目介绍的时候,已...

  • 7
    • www.v2ex.com 3 years ago
    • Cache

    如何大量请求发送短信接口?

    V2EX  ›  Java 如何大量请求发送短信接口?   Jekins · 1 天前 · 2026 次点击

  • 11

    移动发送奇怪短信?我想起了通讯行业的核弹级漏洞-51CTO.COM 移动发送奇怪短信?我想起了通讯行业的核弹级漏洞 作者:苏苏 2022-04-29 21:37:34 这个漏洞虽然存在已久,但是却一直在被...

  • 8

    Go语言 实现发送短信验证码 并登录 goCenter · 大约1分钟之前 · 84 次点...

  • 23
    • www.v2ex.com 2 years ago
    • Cache

    Pixel6a 无法发送短信

    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