Monday, September 7, 2009

SMS Blocking in Android

Recently, I tried to develop an app that would block sms from certain numbers that you can choose. It seems that you cannot completely block the incoming sms. These were the problems that I faced while working with this app.

1. There are no APIs supplied, that handles the SMS inbox (I mean, no content providersm which can be directly queried to fetch records from the sms table). However, you have a workaround of finding the tables where the sms is stored, and then querying and updating that table. Well, there is actually a content provider, that exposes this table to other applications, but it is not documented anywhere. So, I have to hardcode the column values. This is potentially dangerous, if in the next Donut release, Google changes the column names, my application would fall apart.

2. On receiving of an SMS, I have 2 things to do. Remove the SMS from the sms table, and disable the notification. Deleting the sms from the table was pretty easy, but I couldn't find a way to remove the Notification. Perhaps, there is no way that we can disable this notification. One workaround might be, to temporarily change the Notification settings, the moment you sense an incoming message from a blocked number. And, after you delete the message from the sms table, you just turn on the notification. I haven't worked on this, but this might just work.

3. If the Messaging application is already open, and an sms arrives, weird things start to happen. I can see the blocked sms being deleted, and the list of sms gets updated. But the next message in the list is marked as "Unread". Probably, this is done by the Notification, I don't know.

4. SMS broadcast, is definitely, an un-ordered one. So, the easiest way, that could have worked, would have been just to abort the broadcast. But in this case, you don't have this option. so, once you recieve this broadcast, you have to manually go and delete the message, by matching the incoming number, timestamp etc. Timestamp method isn't foolproof. Because, the timestamp you receive, is the timestamp of the broadcast, and not the time when the sms is written into the DB. So they wont match. You should pick up the incoming number, and check for the timestamp within a range of about 1 seconds. This should give you the sms that you need to delete.

5. There's another problem. When you recieve the broadcast, the system wont write the sms into the table, before it is sure that all the broadcast receivers have done their work. So, it waits for some time, and then writes the sms into the table. Before this, if you try to delete the sms, obviously, you would not find it in the table. So, make your code sleep for about a second, and then go and delete the SMS. That should do it. But, the most important problem still persists. THE NOTIFICATION. I guess, it can't be removed.

17 comments:

  1. Interesting blog post. Im also doing some "messaging development" and I recognize the problems stated above. What are your current status on the issues? // (schildmeijer) using gmail

    ReplyDelete
  2. Well, I have not been able to solve any of these problems yet. :(

    ReplyDelete
  3. Hi,
    I'm also try to access SMS table but no luck.
    Can you please share code with me?

    Thanks,
    Anand

    ReplyDelete
  4. I don't have a working code right now. But if you follow the docs on android.com, you will be able to figure out.

    ReplyDelete
  5. Kumar Bibek, hello!

    do you resolve notification problem?

    did you look at ndk for some solutions?

    ReplyDelete
  6. Hello,
    I am trying to block the inbound and outbound SMS. If you could help me with pointers or part of code it will be great. Thank you.

    ReplyDelete
  7. I haven't looked into this any more. But if you can tell you problems, may be I will be able to help you.

    ReplyDelete
    Replies
    1. is it possible to activate a function in the android phone by using pc?how?

      Delete
  8. @ap - No, I just left it. I think we should wait for the sms api to go public.

    ReplyDelete
  9. I am also looking to do this. I want to only allow certain numbers during certain times. Has any one got some thoughts on how to achieve this? paulc@orionhealth.com

    ReplyDelete
  10. Hey bro kumar bibek, I found an app which will block the unwanted text message automatically , its works awesomely . here is the tutorial .
    http://softwarebuzzer.com/2011/07/block-spam-text-messages-android-phone/

    By this you can get an better an idea for your upcoming app :)

    ReplyDelete
  11. can u share a code for deleting sms inandroid..i m new 4 this

    ReplyDelete
  12. how to spam messages in android....plz sharea a code

    ReplyDelete
  13. What exactly do you mean by spam messages?

    ReplyDelete
    Replies
    1. is it possible to delete messages in one android phone using another android phone? i would like to use this code in my project work.

      Delete
    2. Theoretically you could. But, there is not documented way of doing this. So, you would probably have to do a little research on your own.

      Delete