注意添加权限:

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

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

代码如下:

//更新短信

private void UpdateSMS()

{

/*

update支持的协议有很多:

SMS_RAW_MESSAGE    

SMS_STATUS_PENDING    

SMS_ALL    

SMS_FAILED    

SMS_QUEUED    

SMS_INBOX    

SMS_SENT    

SMS_DRAFT    

SMS_OUTBOX    

SMS_CONVERSATIONS    

SMS_ALL_ID    

SMS_INBOX_ID    

SMS_FAILED_ID    

SMS_SENT_ID    

SMS_DRAFT_ID    

SMS_OUTBOX_ID    

SMS_CONVERSATIONS_ID    

SMS_STATUS_ID

*/

ContentValues cv = new ContentValues();    

cv.put("thread_id", "2");    

cv.put("address", "00000");    

cv.put("person", "11");    

//cv.put("date", "11111111");  

cv.put("body", "hello,modify content333333333");

getContentResolver().update(Uri.parse("content://sms/sent/3"), cv, null,null);  

//getContentResolver().update(Uri.parse("content://sms/sent/3"), cv, "id=?",new String[]{"3"});   

}

//删除短信

private void DeleteSMS()

{

/*

* 其中,delete方法中支持的协议为:

* SMS_ALL 根据参数中的条件删除sms表数据 

* SMS_ALL_ID 根据_id删除sms表数据

* SMS_CONVERSATIONS_ID 根据thread_id删除sms表数据,可以带其它条件 

* SMS_RAW_MESSAGE 根据参数中的条件删除 raw表

* SMS_STATUS_PENDING 根据参数中的条件删除 sr_pending表

* SMS_SIM 从Sim卡上删除数据

* 试一下SMS_CONVERSATIONS_ID:"content://sms/conversations/3 ",删除thread_id="3", _id="5"的数据 在eclipse中的Emulator

* Control中,以13800给模拟器发送三条数据,然后以13900发送一条

* this.getContentResolver().delete

* (Uri.parse("content://sms/conversations/3"), "_id=?", new

* String[]{"5"}); 成功删除一条数据。

* 在数据库中每个发送者的thread_id虽然一样,但不是固定的,如果把一个发送者的全部数据删除掉,

* 然后换一个新号码发送短信时,thread_id是以数据库中最大的id+1赋值的。

*/

/*

看了一下android的源代码,sms支持的协议有:

sURLMatcher.addURI("sms", null, SMS_ALL); 

sURLMatcher.addURI("sms", "#", SMS_ALL_ID); 

sURLMatcher.addURI("sms", "inbox", SMS_INBOX); 

sURLMatcher.addURI("sms", "inbox/#", SMS_INBOX_ID); 

sURLMatcher.addURI("sms", "sent", SMS_SENT); 

sURLMatcher.addURI("sms", "sent/#", SMS_SENT_ID); 

sURLMatcher.addURI("sms", "draft", SMS_DRAFT); 

sURLMatcher.addURI("sms", "draft/#", SMS_DRAFT_ID); 

sURLMatcher.addURI("sms", "outbox", SMS_OUTBOX); 

sURLMatcher.addURI("sms", "outbox/#", SMS_OUTBOX_ID); 

sURLMatcher.addURI("sms", "undelivered", SMS_UNDELIVERED); 

sURLMatcher.addURI("sms", "failed", SMS_FAILED); 

sURLMatcher.addURI("sms", "failed/#", SMS_FAILED_ID); 

sURLMatcher.addURI("sms", "queued", SMS_QUEUED); 

sURLMatcher.addURI("sms", "conversations", SMS_CONVERSATIONS); 

sURLMatcher.addURI("sms", "conversations/*", SMS_CONVERSATIONS_ID); 

sURLMatcher.addURI("sms", "raw", SMS_RAW_MESSAGE); 

sURLMatcher.addURI("sms", "attachments", SMS_ATTACHMENT); 

sURLMatcher.addURI("sms", "attachments/#", SMS_ATTACHMENT_ID); 

sURLMatcher.addURI("sms", "threadID", SMS_NEW_THREAD_ID); 

sURLMatcher.addURI("sms", "threadID/*", SMS_QUERY_THREAD_ID); 

sURLMatcher.addURI("sms", "status/#", SMS_STATUS_ID); 

sURLMatcher.addURI("sms", "sr_pending", SMS_STATUS_PENDING); 

sURLMatcher.addURI("sms", "sim", SMS_ALL_SIM); 

sURLMatcher.addURI("sms", "sim/#", SMS_SIM);*/

//getContentResolver().delete(Uri.parse("content://sms/failed/3"), "_id=?", new String[]{"99"});  

getContentResolver().delete(Uri.parse("content://sms/#"),"_id=?", new String[]{"99"});  

}

//添加短信

private void AddSMS()

{

/*

* insert支持的协议:

* 

* SMS_ALL 

* SMS_INBOX 

* SMS_FAILED 

* SMS_QUEUED 

* SMS_SENT 

* SMS_DRAFT

* SMS_OUTBOX 

* SMS_RAW_MESSAGE 

* SMS_STATUS_PENDING 

* SMS_ATTACHMENT

* SMS_NEW_THREAD_ID

* 

* 向sms表插入数据时,type是根据协议来自动设置,

* 如果传入的数据中没有设置date时,自动设置为当前系统时间;非SMS_INBOX协议时,read标志设置为1

* SMS_INBOX协议时,系统会自动查询并设置PERSON threadId为null或者0时,系统也会自动设置

* 

* 一直为造不了"发送失败"的邮件而发愁,现在来做一个: content://sms/failed

*/

String id=null;

ContentValues cv = new ContentValues();   

for(int i = 0;i<5;i++)

{

id.valueOf(i);

cv.put("_id", id);    

cv.put("thread_id", "0");    

cv.put("address", "9999");    

cv.put("person", "888");    

//cv.put("date", "9999"); 

cv.put("protocol", "0"); 

cv.put("read", "1"); 

cv.put("status", "-1"); 

cv.put("body", "@@@@@@@@@"); 

getContentResolver().insert(Uri.parse("content://sms/sent"), cv);

cv.clear();

}

}

//查询短信内容

private void GetSMS()

{

/*

* content://sms/inbox 收件箱 content://sms/sent 已发送

* content://sms/draft 草稿 content://sms/outbox 发件箱

* content://sms/failed 发送失败 content://sms/queued 待发送列表

* 数据库中sms相关的字段如下: 

*  _id 一个自增字段,从1开始 thread_id 序号,同一发信人的id相同

*            同一个联系人的thread_id是一样的,通过遍历thread id和对比就能知道一个联系人有几条短信;

*            当然了,Threads表里面有个message_out的字段也是显示有条联系人的,但是Threads表还没有找到可以读取的办法;

*            

*  address 发件人手机号码 

*  person 联系人列表里的序号,陌生人为null ;即rawcontact表的contact_id,或者contact表的_id;

*            可通过此id关联联系人;但是person对应结果不稳定,应该使用PhoneLookup.CONTENT_FILTER_URI

*  date 发件日期

*  protocol 协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO 

*  read 是否阅读 0未读, 1已读

*  status 状态 -1接收,0 complete, 64 pending, 128 failed 

*  type ALL = 0; INBOX = 1; SENT =2; DRAFT = 3; OUTBOX = 4; FAILED = 5; QUEUED = 6; 

*  body 短信内容

*  service_center 短信服务中心号码编号 

*  subject 短信的主题 

*  reply_path_present  TP-Reply-Path locked

*/

Log.i("SMS","开始获取短信");

String[] projection = new String[] {

          "_id",

          "address",

          "person",

          "date",

          "protocol",

          "read",

          "status",

          "body",

          "service_center",

          "subject"

         };

Cursor cur = getContentResolver().query(Uri.parse("content://sms"), projection, null,null, "date desc");

StringBuilder str=new StringBuilder();

        if (cur.moveToFirst()) {

        String name; 

            String phoneNumber;       

            String sms;

            long date;

            String id;

            int idColumn = cur.getColumnIndex("_id");

            int nameColumn = cur.getColumnIndex("person");

            int phoneColumn = cur.getColumnIndex("address");

            int smsColumn = cur.getColumnIndex("body");

            int dateColumn=cur.getColumnIndex("date");

            do {

                // Get the field values

                name = cur.getString(nameColumn);             

                phoneNumber = cur.getString(phoneColumn);

                sms = cur.getString(smsColumn);

                date = cur.getLong(dateColumn);

                String temp = long2String(date);

                id = cur.getString(idColumn);

                //date = String2Long(date);

                str.append("{");

                str.append(name+",");

                str.append(phoneNumber+",");

                str.append(sms+",");

                str.append(temp+",");

                str.append(id);

                str.append("}");

                if (null==sms)

                sms="";

            } while (cur.moveToNext());

        }

        else

        {

            str.append("no result!");

        }

        Log.i("SMS",str.toString());

        Toast.makeText(context, str.toString(), Toast.LENGTH_SHORT).show();

        System.out.print("短信结果:"+str.toString());

        cur.close();

}

private String long2String(long time) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss:SSSS");

return sdf.format(new Date(time));

}

android 添加手机短信,获取手机短信,删除手机短信和修改手机短信的更多相关文章

  1. 腾讯云短信 nodejs 接入, 通过验证码修改手机示例

    腾讯云短信 nodejs 接入, 通过验证码修改手机示例 参考:腾讯云短信文档国内短信快速入门qcloudsms Node.js SDK文档中心>短信>错误码 nodejs sdk 使用示 ...

  2. Android黑科技,读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...

  3. Android添加快捷方式(Shortcut)到手机桌面

    Android添加快捷方式(Short)到手机桌面 权限 要在手机桌面上添加快捷方式,首先需要在manifest中添加权限. <!-- 添加快捷方式 --> <uses-permis ...

  4. 调用手机在线API获取手机号码归属地信息

    手机在线(www.showji.com)始创于2001年,发展至今已拥有国内最准确.号段容量最大的手机号码归属地数据库系统, 目前号段容量将近33万条,每月保持两次以上规模数据更新,合作伙伴包括:百度 ...

  5. android利用adb修改手机的分辨率和dpi

    在android开发过程中,适配更多的适配是必不可少的一步,而每次测试适配时,要么购买设配,要么模拟器,买设配太花钱,模拟器太占内存,不过幸好还可以通过修改手机的size(分辨率)和density来进 ...

  6. Android设备唯一码的获取

    Android设备唯一码的获取 UTDID是集团无线设备统一ID方案,目的是给每一台设备一个ID,作为唯一标识.UTDID由客户端生成,并在设备中各个客户端之间共享.UTDID的生成中包含时间戳和随机 ...

  7. android ------ 实现高德定位并获取相应信息 ( 最新版高德SDK 和 Android SDK版本)

    Android开发项目时常常会遇到定位这个功能, 很久以前写过一篇了,官方也更新了一些东西,我也更新下 以前使用的是jar包 导入来实现高德定位 老版本 链接:https://www.cnblogs. ...

  8. 【Android Demo】通过WebService获取今日天气情况

    因为本身是在搞.NET方面的东东,现在在学习Android,所以想实现Android通过WebService接口来获取数据,网上很多例子还有有问题的.参考:Android 通过WebService进行 ...

  9. 【Android Demo】通过WebService获取今日天气情况--转

    因为本身是在搞.NET方面的东东,现在在学习Android,所以想实现Android通过WebService接口来获取数据,网上很多例子还有有问题的.参考:Android 通过WebService进行 ...

  10. Android必知必会-获取视频文件的截图、缩略图

    背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取 ...

随机推荐

  1. MySQL 快速入门教程

    转:MySQL快速 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数据 ...

  2. 树莓派 -- 输入设备驱动 (key) 续2: 转载 Setting up a GPIO-Button “keyboard” on a Raspberry Pi

    使用device-tree (DT) overlay应该是更方便的方法: http://blog.gegg.us/2017/01/setting-up-a-gpio-button-keyboard-o ...

  3. 杭电 2035 (快速幂) 求A^B的最后三位数表示的整数

    Description 求A^B的最后三位数表示的整数. 说明:A^B的含义是“A的B次方”    Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B&l ...

  4. Eclipse Myeclipse 设定文件的默认打开方式

    Eclipse Myeclipse 设定文件的默认打开方式   菜单:Window -> Preferences -> General -> Editors -> File A ...

  5. 数位dp 3943 二分法

    转载:http://blog.csdn.net/wdcjdtc/article/details/39177905 #include"cstdlib" #include"c ...

  6. 莫(meng)比(bi)乌斯反演--BZOJ2301: [HAOI2011]Problem b

    n<=50000个询问,每次问a<=x<=b,c<=y<=d中有多少gcd(x,y)=K的(x,y).a,b,c,d,K<=50000. 这大概是入门题辣..这里记 ...

  7. SQL SERVER代理作业删除失败问题

    在SQL Server 2005上遇到了先删除已运行维护计划后,再删除代理中由其产生的作业时,提示删除失败.   DELETE 语句与 REFERENCE 约束"FK_subplan_job ...

  8. codevs——1080 线段树练习

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  9. MySQL主主复制搭建教程收集(待实践)

    先收集,后续再实践. http://www.cnblogs.com/ahaii/p/6307648.html http://blog.csdn.net/jenminzhang/article/deta ...

  10. python性能优化、内存优化、内存泄露;与其他语音比较效率如何?

    1.内存泄露:http://www.cnblogs.com/xybaby/p/7491656.html 2.内存优化:http://www.cnblogs.com/xybaby/p/7488216.h ...