就是一直存储联系人到SIM卡,一旦SIM卡已经存满,就提示说SIM卡已满。
现在不知道如何取到SIM卡漫的状态值!

解决方案 »

  1.   

    有API可以那到块大小,还可以那到块数量,还可以那到可用块数量,然后就可以那到剩余空间了
      

  2.   

    能透露下具体哪个文件,哪个API吗?
    时间太紧迫了,如果能告知,就太感谢了!
      

  3.   

    就算找不到也没事儿吧?
    可以这样绕道解决,先insert一个空的,然后看看是否成功,不成功就说明满了....这样也行吧,要是能插进去,就是没满,然后把插入的这个空的再删了...
      

  4.   

    不成功的情况有很多,不一定是满了导致的插入不成功,如果能100%保证唯一性,插入不成功就是因为SIM卡满了,这倒也行!
    但是处理逻辑就变得很复杂,插入每笔联系人之前都要事先插入一个空联系人去试探一下!
    感觉谷歌不会做的这么弱的!
      

  5.   

    android只提供sms存储在SIM卡容量满的api
    Telephony.Sms.Intents.SIM_FULL_ACTION联系人满不满竟然没api!
      

  6.   

    嗯,之前我要判断sim卡联系人是不是已满是用如果失败就再写5次
    如果5次都失败就认定sim卡已满
      

  7.   

    这个也不能100%保证是SIM已经满了导致的吧!
    只能说SIM卡已满的可能性比较大而已!
      

  8.   

    跟你这么说吧,因为insert函数只能返回true或者 false,不会返回错误的原因,所有你没法判断具体什么情况导致失败。
    在android的framework中是可以取得sim卡中所有联系人的数目也能获得已用的数目,但是在应用层通过provider暴露出来的接口只有query,update,insert,delete四个。
    你要获得sim卡是不是已经满了有两个办法
    1是修改insert函数,让它返回失败原因(比如说sim卡已满)。
    2是再加一个查询sim卡联系人容量的函数。
    这两个办法都会折腾死你。。所以还不如弄个多插入几次都失败的话就算已满,虽然这不是百分百的正确,但是我觉得可靠性还可以的了。
      

  9.   

    我看了下在iccprovider中:
    boolean success = addIccRecordToEf(efType, tag, number, null, pin2);
    只要不成功
            if (!success) {
                return null;
            }
    所以只要在上层Uri adnUrl = getContentResolver().insert(Uri.parse("content://icc/adn"), values); 
    然后判断adnUrl是不是为null即可!
      

  10.   

    这个是provider的insert 函数的具体实现。
    是在这可以判断,问题是你没法把这个结果再返回到上一层。
      

  11.   

    我想说的是你在这里是可以判断出sim卡已满
    但是没法用messagebox之类的玩意来告诉用户sim卡已满
      

  12.   

    可以的啊,那个insert返回的就是一个uri,所以只要在上层Uri adnUrl = getContentResolver().insert(Uri.parse("content://icc/adn"), values);  
    判断adnUrl是不是为null就行了!
      

  13.   

    不是啊,这个是可以唯一确定的!
    在adnrecordloader里面:
                        int[] recordSize = (int[])ar.result;
                        // recordSize is int[3] array
                        // int[0]  is the record length
                        // int[1]  is the total length of the EF file
                        // int[2]  is the number of records in the EF file
                        // So int[0] * int[2] = int[1]
                       if (recordSize.length != 3 || recordNumber > recordSize[2]) {
                            throw new RuntimeException("get wrong EF record size format",
                                    ar.exception);
                        }
    这个就是判断已满的异常,然后上面iccprovider在insert的时候会捕获这个异常赋值给success!