貌似谷歌把threads类给屏蔽起来了!
他们系统的软件可以用,我们自己写的就看不到这个类,不知道为什么,
另外 读短信数据库的时候 threads表也没办法读到Threads.CONTENT_URI 这个URI的字符串是啥?
找了很久也找不到!哪位告诉给指点一下!

解决方案 »

  1.   

    我之前在做读取彩信发送者号码的时候也想过读取threads表,但查了很多资料没找着
    不过读取彩信发送者号码的我倒是找到了一种方法。。有同样需求的话可以看下该帖:
    http://topic.csdn.net/u/20100611/12/aaf9f499-61de-45dd-8a47-4b5623369253.html
      

  2.   

    不就是要读取指定联系人有多少短信么?      Cursor cursorInbox = getContentResolver().query(Uri.parse("content://sms/inbox"),
                        null, null, null, null);
         Cursor cursorSendbox = getContentResolver().query(Uri.parse("content://sms/sent"),
                        null, null, null, null);
         if(cursorSendbox != null){  
         //发件箱信息
                for(cursorSendbox.moveToFirst();!cursorSendbox.isAfterLast();cursorSendbox.moveToNext()){
    //                 String bodySend = cursorSendbox.getString(cursorSendbox.getColumnIndexOrThrow("body"));
                    String numberSend = cursorSendbox.getString(cursorSendbox.getColumnIndexOrThrow("address"));
    }
    收发是一样的方法,如果要获取更多的东西,使用getColumnName获取,有body,address等可以获得
      

  3.   

    这个已经是从数据库中搜索了,慢的话也没办法,数量过多的话你可以指定query的参数,只查询指定联系人的短信信息,这样可以快很多。
    如果担心阻塞UI,那数据搜索扔到一个子线程中去处理,处理完后发个handler消息来通知更新UI
      

  4.   

    系统短信箱不是这么检索的,是读了 threads这个表,所以他能知道某个人有多少条短信,按你说的方法要自己计算某个人有多少条短信的,这样速度就大大降低了!
      

  5.   

    有和办法读短信的 threads这个视图呢?
      

  6.   

    /**
     * 删除某条短信,条件是短信的id
     * 注意:该操作会删除手机数据库中的相应数据。
     */
    public boolean deleteASMSBy(SMS sms)
    {
    System.out.println(" deleteASMSBy "+sms.getId());
        try
        {
            m_context.getContentResolver().delete(Uri.parse("content://sms/"+ sms.getId()), null, null);
        }
        catch (Exception e)
        {
         Toast.makeText(m_context, "删除失败"+sms.getId()+"\n"+e.toString(), Toast.LENGTH_LONG).show();
         e.printStackTrace();
         return false;
        }
        return true;
    }
      

  7.   


    Threads.CONTENT_URI为content://mms-sms/conversations数据量大时候可以用SQL的统计函数:
    getContentResolver().query(Uri.parse("content://sms/"), new String[]{"count(*) as count"}, null, null, null);
      

  8.   

    new String[]{"count(*) as count"}, 这句啥意思?
    count(*) 是对某个字段求和?比如对会话求和 就知道这个人有多少个会话啦?
    count(thread_id) 这么写?
      

  9.   

    getContentResolver().query()在内部处理时,会把参数组织成为一个标准的SQL语句,发送给SQLite。第一个参数表示要查询的字段,一般是一个数组,比如new String[]{"item1", "item2","item3"}之类的,andriod会遍历整个数组拼成SQL语句中的select item1, item2, item3。所以这个参数也可以写为:new String[]{"item1,item2,item3"},同样也可以复杂一点,比如new String[]{"item1 + item2 as item"}, new String[]{"count(*)"},反正android只是拼一个SQL语句而已。
      

  10.   

    content://mms-sms/conversations 这个URI里为何没有 message_count呢?
      

  11.   

    举几个例子:
    要知道某个人发了多少封信,比如thread_id=3:
    getContentResolver().query(Uri.parse("content://sms/"), new String[]{"count(*) as count"}, "thread_id=?", new String[]{"3"}, null);多少个人发过信:
    getContentResolver().query(Uri.parse("content://sms/"), new String[]{"count(distinct(thread_id)) as count"}, "type='1'", null, null)
      

  12.   

    确实没有message_count,这个URI是从源代码中找出来的,至于为什不灵,我也不知道了。
    如果单纯想统计数据的话,在sms表中也可以查询。
      

  13.   

    那样就需要查2次表了!
    我想统计 目前有多少个不同的thread_id,每个thread_id有多少个meassage,
    做个类似短信箱列表的页面,能只查一个表搞定吗?
      

  14.   

    query方法不支持group by,但是可以放在条件参数中来实现:getContentResolver().query(Uri.parse("content://sms/"), new String[]{"thread_id, count(*) as count"}, "1=1) group by (thread_id", null, null);其中的1=1是因为这个查询没有条件,放到里面只是为了加入一个group by,如果有其它条件可以把它替换掉。通过Cursor.getCount()可以知道有多少个不同的thread_id,遍历Cursor可以知道每个thread_id有多少个meassage
      

  15.   

    content://mms-sms/conversations
    这个取出来的会话比较少,有很多没有取出来,不知道为何?
      

  16.   

    看打出来的LOG,这个URI对应的是PDU表
      

  17.   

    如果一定要读threads表的话也可以实现:
    getContentResolver().query(Uri.parse("content://sms/"), new String[]{"* from threads --"}, null, null, null);
      

  18.   

    这个表确实读出来了!但表上没联系人号码之类的信息!
    我看系统短信箱的源码是读的一个Threads.CONTENT_URI 这个URI
    但 咱们程序导入不了
    import android.provider.Telephony.Threads;
    这个类啊!
    难道非要读多次URI才能搞定?
      

  19.   

    那你试试多表联查吧:
    getContentResolver().query(Uri.parse("content://sms/"), new String[]{" a.message_count, b.address from threads a, sms b where a.recipient_ids = b.thread_id  group by b.address--"}, null, null, null);上面的SQL语句只是测试用的,具体你修改一下吧,按照这种方法应该能查出来。
      

  20.   

    嗯!这个到可以,
    还有个 address 的名字问题,
    当前查询SMS库,没有联系人的名字,需要查联系人库才能得到做在一起查询能否实现?谢谢!
      

  21.   

    联系人的信息是在contacts.db中,android中不能跨数据库查询。
      

  22.   

    问个问题不知道楼主遇到过没。 Threads表不能直接插入信息,当插入一条彩信的时候,Threads表没有自动生成彩信相关的信息,在手机上就不能显示这条彩信。怎样才能让这条彩信显示出来呢,或者说怎样在Threads表里生成这条彩信呢
      

  23.   

    我按照这个方法查询threads表里面的数据怎么没反应捏
    提示信息貌似是Failed to find provider for threads
    大家帮帮忙啊!!急!
      

  24.   

    其想问一下,我通过SmsManager.sendTextMessage后,怎么把短信记录到threads表中喃?
      

  25.   

    如何查询 指定内容的 短信啊?比如 短信内容以 admin://开头,查询出所有以admin://开头的短信,理解为信息里包含admin://也可以。ContentResolver cr = getContentResolver();

    Cursor cursor = cr.query(Uri.parse("content://sms/inbox"), null, null, null, null);

    while(cursor.moveToNext()) {
    String body = cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();往下不知道怎么写了,设置查询条件不知道怎么设.......请帮帮忙啊....谢谢......
      

  26.   

    我现在想读所有的彩信信息。怎么读啊?统计数量什么的都在threads里面。
      

  27.   

    有没有mms模块方面的资料,发给我学习下,感谢!  邮箱: [email protected]
      

  28.   

    短信群发: 怎么合到一个会话中..(而不是每个号码变成一个会话)
    即 threads 表 的字段 recipient_ids 是74 190 191 194 196 202 203 204
    源码貌似说要更新
    RecipientIdCache.updateNumbers(conv.getThreadId(), conv.getRecipients());
    -------------------------------
    但 RecipientIdCache 不知道怎么更新
      

  29.   

    兄弟们啊~ 楼主啊~~ 在不在啊  Cursor cursor = cr.query(
    Uri.parse("content://sms/"),
    new String[] { "* from threads group by date--" }, null, null, null);  我在后面 date 后面加 desc 就报错了。。  我想降序 咋整?
      

  30.   

    group by date 貌似不能排序
    那就读到内存 然后再写程序排序吧!
      

  31.   

    彩信 "pdu group by thread_id"