Android Manager之 SmsManager(短信管理器)

SmsManager(短信管理器)是Android提供的另一个非常常见的服务。



1.调起系统发送短信页面功能


1.1.设置权限



注意1:此处只为了演示调起发送短信功能 所以没有考虑Android 6.0及以上敏感权限问题

资料1:Android 6.0以上 需要运行时申请的权限(一)

资料2:Android 6.0以上 需要运行时申请的权限(二)


1.2.调起

Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:"+"17710029800"));

intent.putExtra("sms_body", "我要给你发送短信了。");

startActivity(intent);


注意2:要判断手机号是否合法以及短信长度问题。


1.3.结果:





2.使用SmsManager提供的系列sendXxxMessage()方法直接发送短信


2.1. sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliverIntent)方法。

作用:直接发送短信

参数1:destinationAddress:收信人的电话号码。

参数2:scAddress:短信中心的号码,null的话使用当前默认的短信服务中心。一般为null。

参数3:text:短信内容。

参数4:sentIntent:短信发送状态的信息:(发送状态的Intent) 如果不为null,当消息成功发送或失败这个PendingIntent就广播。

              结果代码

              Activity.RESULT_OK:表示成功

              RESULT_ERROR_GENERIC_FAILURE:普通错误

              RESULT_ERROR_RADIO_OFF:无线广播被明确地关闭

              RESULT_ERROR_NULL_PDU :没有提供pdu

              之一表示错误。

              对应RESULT_ERROR_GENERIC_FAILURE

             sentIntent可能包括额外的"错误代码"包含一 个无线电广播技术特定的值,通常只在修复故障时有用。每              一个基于SMS的应用程序控制检测sentIntent。 如果sentIntent是空,调用者将检测所有未知的应用程                序,这将导致在检测的时候发送较小数量的SMS。

参数5:deliverIntent:短信是否被对方收到的状态信息:(接收状态的Intent) 如果不为null,当这个短信发送到接收者那里,这个PendtingIntent会被广播, 状态报告生成的pdu(指对等层次之间传递的数据单位)会拓展到数据("pdu")。


2.2.divideMessage (String text)方法。

作用:当短信内容太长时,分割短信。

返回值:ArrayList<String>。



2.3.Demo演示


String msg="这是一条短信!!!";


/**
  * 1.获取SmsManager对象
* */


SmsManager smsManager=SmsManager.getDefault();


/**
 * 2.处理返回的发送状态
 * */


String SENT_SMS_ACTION = "SENT_SMS_ACTION";

Intent sentIntent = new Intent(SENT_SMS_ACTION);

PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent,  0);

//注册发送信息的广播接收者

registerReceiver(new BroadcastReceiver() {

     @Override

      public void onReceive(Context _context, Intent _intent) {

         switch (getResultCode()) {

            case Activity.RESULT_OK:

                  Toast.makeText(SmsActivity.this, "短信发送成功!", Toast.LENGTH_SHORT).show();

                  break;

            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:    //普通错误

                   break;

            case SmsManager.RESULT_ERROR_RADIO_OFF:         //无线广播被明确地关闭

                   break;

            case SmsManager.RESULT_ERROR_NULL_PDU:          //没有提供pdu

                   break;

            case SmsManager.RESULT_ERROR_NO_SERVICE:         //服务当前不可用

                  break;

          }

   }

}, new IntentFilter(SENT_SMS_ACTION));


/**
  * 3.处理返回的接收状态
* */


String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";

//创建接收返回的接收状态的Intent

 Intent deliverIntent = new Intent(DELIVERED_SMS_ACTION);

 PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0,deliverIntent, 0);

 registerReceiver(new BroadcastReceiver() {

    @Override

      public void onReceive(Context _context, Intent _intent) {

          Toast.makeText(SmsActivity.this,"收信人已经成功接收!", Toast.LENGTH_SHORT).show();

       }

 }, new IntentFilter(DELIVERED_SMS_ACTION));


/**
 * 发送短信
* */


//发送短信1 内容长度较短sendTextMessage方法
smsManager.sendTextMessage("11111111",null,msg,sentPI,deliverPI);

//发送短信2 内容较长先切割短信再发送

List<String> divideContents = smsManager.divideMessage(msg);

for (String text : divideContents) {

      smsManager.sendTextMessage("11111111", null, text, sentPI, deliverPI);

}




3.获取当前设备收到短信内容


3.1.代码


public void getSmsFromPhone() {

        ContentResolver cr = getContentResolver();

        String[] projection = new String[] {"_id", "address", "person","body", "date", "type" };

        Cursor cur = cr.query(SMS_INBOX, projection, null, null, "date desc");

        if (null == cur) {

            return;

        }


        StringBuilder stringBuilder=new StringBuilder();

        while(cur.moveToNext()) {

            String _id = cur.getString(cur.getColumnIndex("_id"));//_id

            String number = cur.getString(cur.getColumnIndex("address"));//手机号

            String name = cur.getString(cur.getColumnIndex("person"));//联系人姓名列表

            String body = cur.getString(cur.getColumnIndex("body"));//短信内容

            String date = cur.getString(cur.getColumnIndex("date"));//日期

            String type = cur.getString(cur.getColumnIndex("type"));//类型

            stringBuilder.append("_id:"+_id+"\n"+"手机号:"+number+"\n"+"姓名:"+name+"\n"+"内容:"+body+"\n"+"日期:"+date+"\n"+"类型:"+type+"\n");

        }

        Log.d("TAG","结果:"+stringBuilder.toString());


}



3.2.结果




String number = cur.getString(cur.getColumnIndex("想获得的属性")); //获取方法





附1:

SmsManager官方文档:

Android 官方网址:http://androiddoc.qiniudn.com/reference/android/telephony/SmsManager.html


附2:

Android Manager之汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值