当前位置: 代码迷 >> Android >> Android的根本常用的短信操作
  详细解决方案

Android的根本常用的短信操作

热度:5   发布时间:2016-05-01 15:20:50.0
Android的基本常用的短信操作
1、调用系统发送短信界面(传入手机号码+短信内容)
2、隐藏发送短信(指定号码指定内容)(这里隐藏只是没有反写入数据库)

3、获得收件箱接收到的短信

4、Android屏蔽新短信通知提示信息:(ContentObserver)

4、删除刚接收到的短信:

      A)、带提示删除

        B)、无新短信通知=删除短信





所用到的相关数据类:

Intent、SmsManager、BroadcastReceiver、ContentObserver、Bundle

涉及动作(Action):

android.provider.Telephony.SMS_RECEIVED

涉及权限:

<!-- 短信 -->

<uses-permission android:name="android.permission.SEND_SMS" />

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>

<uses-permission android:name="android.permission.READ_SMS"></uses-permission>



1、调用系统发送短信界面(传入手机号码+短信内容)

(直接使用Intent 意图执行系统的sms即可--同理这里可以使用该方式调用手机发送邮件等)源码如下:

public void SendSMS( String aContent ){

// 新建smsto意图

Intent iIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:158********"));//传入要发送的地址

// 设置短信内容

iIntent.putExtra("sms_body", aContent);//设置传递的信息内容

// 启动短信服务内容

aContent.startActivity(iIntent);//直接打开意图即可

}

2、隐藏发送短信(指定号码指定内容)(这里隐藏只是没有反写入数据库)
创建发送自己的短信需要用到短信管理类SmsManager,使用它的sendTextMessage方法即可实现程序发送:

public void SendSMSHide(String aPhoneNUM, String aContent){

// 创建一个默认的SmsManager。

SmsManager aSmsManager = SmsManager.getDefault();

// 发送信息的intent参数。

String aSent = "SMS_SENT";

// 信息反馈的intent参数。

String aDelivered = "SMS_DELIVERED";



// 创建发送新信息的PendingIntent对象

PendingIntent aSentPI = PendingIntent.getBroadcast(this, 0, new Intent(aSent), 0);

// 信息反馈的PendingIntent。

PendingIntent aDeliveredPI = PendingIntent.getBroadcast(this, 0,

new Intent(aDelivered), 0);

aSmsManager .sendTextMessage(aPhoneNUM, null, aContent, aSentPI, aDeliveredPI);//发送短信(还可以发送彩信等)

//debuge

if(BOOL_ISDEBUGE){

Toast.makeText(aContent,"短信送出成功!!",Toast.LENGTH_SHORT ).show();

}

}


3、获得收件箱接收到的短信

A)、方法一:

通过继承BroadcastReceiver服务,处理onReceive函数,判断接收到的动作为SMS_RECEIVED

我将其封装在ReceiveSMS(aContext, aIntent);函数中只需要在onReceive()函数中调用即可!

public void ReceiveSMS(Context aContext, Intent aIntent) {

if (aIntent.getAction().equals(SSTR_SMSACTION)) { // 监听SMS_RECEIVED消息

Bundle iBundle = aIntent.getExtras(); // 获取Intent数据

if (iBundle != null) {

Object[] iObject = (Object[]) iBundle.get("pdus"); // 获取pdus对象

SmsMessage iMsg = SmsMessage.createFromPdu((byte[]) iObject[0]); // 初始化信息对象

m_strSMSAddress = iMsg.getDisplayOriginatingAddress(); // 获取信息发送人

m_strSMSText = iMsg.getDisplayMessageBody(); // 获取信息内容

//to do your things

Toast.makeText(aContext, "Address = "+m_strSMSAddress+"\nCountent = "+m_strSMSText, Toast.LENGTH_LONG).show();

}

}

}

B)、方法二:继承ContentObserver类在onChange中调用(注册监听sms即可)

      this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content); 

4、Android屏蔽新短信通知提示信息:(ContentObserver)

大致思路先从收件箱获得指定未读短信,在执行通知前更改为已读,执行SQL的updata即可

        @Override 

        public void onChange(boolean selfChange) { 

            super.onChange(selfChange); 

            //读取收件箱中指定号码的短信 

cursor = managedQuery(Uri.parse("content://sms/inbox"),

            new String[]{"_id", "address", "read"},

            "read = 0", null,

            "date desc");

      cursor.moveToFirst(); 

        for(int i =0;i<cursor.getCount();++i)

            {

            Log.i("address","address = "+cursor.getLong(1));

            if(cursor.getString(1).indexOf("136******")>=0)

            {//这里运用indexof方式查找,并没有用比较因为系统会有国际号码

                ContentValues values = new ContentValues(); 

                values.put("read", "1");        //修改短信为已读模式 

                    getContentResolver().update(Uri.parse("content://sms/inbox"), values, " _id=?", new String[]{""+cursor.getInt(0)}); 

          break;//这里如果跳出就只能更改一条(刚收到的可以这样实现而且手机上方将不再有短信提示)

            }

            cursor.moveToNext();

            }

        }

5、删除刚接收到的短信:

A)、带提示删除(这样不知到有什么用。呵呵。写出来分享)

短信能删除但是当手机接收到短信时还会在手机通知里面显示给用户

继承BroadcastReceiver类,首先获得会话id在执行数据库删除即可

I、获得会话id:

(思路这样还可以简洁的-网上找的大家也可以用上面的managedQuery方法)

private long getThreadId(Context aContext) {



long threadId = 0;



String SMS_READ_COLUMN = "read";



String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";



String SORT_ORDER = "date DESC";



int count = 0;

Cursor cursor = aContext.getContentResolver().query(



Uri.parse("content://sms/inbox"),new String[] { "_id", "thread_id", "address", "person", "date",

"body" },WHERE_CONDITION,null,SORT_ORDER);





if (cursor != null) {try {count = cursor.getCount();



if (count > 0) {



cursor.moveToFirst();



threadId = cursor.getLong(1);}



} finally {cursor.close();}}

Log.i("threadId", String.valueOf(threadId));



return threadId;}

II、执行删除:

这里我们可以在BroadcastReceiver的onReceive函数里面直接调用删除方法如下:

long id = getThreadId(aContext);

Uri mUri=Uri.parse("content://sms/conversations/" + id);

//无条件删除id所有会话,第二个参数可以添加条件

aContext.getContentResolver().delete(mUri, null, null);

但是这里你会发现你删除的并不是你刚才发送的信息,而是你上一次发送的信息的所有,这里是为什么呢,原因是我们刚刚监听的收件箱的时候当前会话是还没有来得及创建的,所以删除会话也是删除的以前的,所以这里我们需要时间。可以用如下方式来实现:这样就会成功了。但是这种方式短信通知依然存在

new Thread(){

public void run(){

try {sleep(600);//等待一段时间删除

} catch (InterruptedException e) {

e.printStackTrace();}

long id = getThreadId(aContext);

Uri mUri=Uri.parse("content://sms/conversations/" + id);

aContext.getContentResolver().delete(mUri, null, null);

}}.start();


获取手机上的所有短信内容

Java代码:

public String getSmsInPhone()  
{  
    final String SMS_URI_ALL   = "content://sms/";    
    final String SMS_URI_INBOX = "content://sms/inbox";  
    final String SMS_URI_SEND  = "content://sms/sent";  
    final String SMS_URI_DRAFT = "content://sms/draft";  
      
    StringBuilder smsBuilder = new StringBuilder();  
      
    try{  
        ContentResolver cr = getContentResolver();  
        String[] projection = new String[]{"_id", "address", "person",   
                "body", "date", "type"};  
        Uri uri = Uri.parse(SMS_URI_ALL);  
        Cursor cur = cr.query(uri, projection, null, null, "date desc");  
 
        if (cur.moveToFirst()) {  
            String name;   
            String phoneNumber;         
            String smsbody;  
            String date;  
            String type;  
           
            int nameColumn = cur.getColumnIndex("person");  
            int phoneNumberColumn = cur.getColumnIndex("address");  
            int smsbodyColumn = cur.getColumnIndex("body");  
            int dateColumn = cur.getColumnIndex("date");  
            int typeColumn = cur.getColumnIndex("type");  
           
            do{  
                name = cur.getString(nameColumn);               
                phoneNumber = cur.getString(phoneNumberColumn);  
                smsbody = cur.getString(smsbodyColumn);  
                  
                SimpleDateFormat dateFormat = new SimpleDateFormat(  
                        "yyyy-MM-dd hh:mm:ss");  
                Date d = new Date(Long.parseLong(cur.getString(dateColumn)));  
                date = dateFormat.format(d);  
                  
                int typeId = cur.getInt(typeColumn);  
                if(typeId == 1){  
                    type = "接收";  
                } else if(typeId == 2){  
                    type = "发送";  
                } else {  
                    type = "";  
                }  
               
                smsBuilder.append("[");  
                smsBuilder.append(name+",");  
                smsBuilder.append(phoneNumber+",");  
                smsBuilder.append(smsbody+",");  
                smsBuilder.append(date+",");  
                smsBuilder.append(type);  
                smsBuilder.append("] ");  
               
                if(smsbody == null) smsbody = "";    
            }while(cur.moveToNext());  
        } else {  
            smsBuilder.append("no result!");  
        }  
           
        smsBuilder.append("getSmsInPhone has executed!");  
    } catch(SQLiteException ex) {  
        Log.d("SQLiteException in getSmsInPhone", ex.getMessage());  
    }  
    return smsBuilder.toString();  


  注释:
  
  1、本函数用于获取手机中所有的短信,包括收件箱、发件箱、草稿箱等。
  
  2、本函数可以运行在Service子类中,因为未使用Activity类的相关函数。
  
  3、获取的短信包括:收发短信人名、手机号码、短信内容、短信发送接收的时间、短信的类型。
  
  sms主要结构:
  
  _id:短信序号,如100
  
  thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的
  
  address:发件人地址,即手机号,如+8613811810000
  
  person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null
  
  date:日期,long型,如1256539465022,可以对日期显示格式进行设置
  
  protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信
  
  read:是否阅读0未读,1已读
  
  status:短信状态-1接收,0complete,64pending,128failed
  
  type:短信类型1是接收到的,2是已发出
  
  body:短信具体内容
  
  service_center:短信服务中心号码编号,如+8613800755500
  
  4、为了获取短信,需要在AndroidManifest.xml文件中添加权限使用说明,如下:
  
  <uses-permissionandroid:name="android.permission.READ_SMS"/>

  相关解决方案