tags:

views:

2437

answers:

3
+4  Q: 

Android SMS API

I know that the SMS content provider is not part of the public API (at least not documented), but if I understand correctly it's still possible to use many of the SMS features as long as you know how to use the API(?).

E.g it's pretty straightforward to insert an SMS into your inbox:

 ContentValues values = new ContentValues();
 values.put("address", "+457014921911"); 
 contentResolver.insert(Uri.parse("content://sms"), values);

Unfortunately this does not trigger the standard "new-SMS-in-your-inbox" notification. Is it possible to trigger this manually?

Edit: AFAIK the "standard mail application (Messaging)" in Android is listening for incoming SMSes using the android.permission.RECEIVE_SMS permission. And then, when a new SMS has arrived, a status bar notification is inserted with a "special" notification id. So one solution to my problem (stated above) could be to find, and send the correct broadcast intent; something like "NEW SMS HAS ARRIVED"-intent.

Edit: Downloaded a third party messaging application (chompsms) from Android market. This application satisfies my needs better. When i execute the code above the chompsms notice the new sms and shows the "standard status bar notification". So I would say that the standard Android Messaging application is not detecting sms properly? Or am I wrong?

A: 

Maybe you should replace

content://sms

with

content://sms/inbox
jitter
No difference; SMS appears in the inbox. But still no nice sms notification :) –
Schildmeijer
+1  A: 

Could you trigger a PUSH notification after the SMS?

Thread: http://stackoverflow.com/questions/1243066/does-android-support-near-real-time-push-notification

Phill Pafford
+3  A: 

Unfortunately the code responsible for these notifications is hidden in the messaging application. The class MessagingNotification has a static method updateAllNotifications that you could call using a PathClassLoader and reflection:

PathClassLoader c = new PathClassLoader("/system/app/Mms.apk", getClassLoader());
Class.forName("com.android.mms.util.ContactInfoCache", true, c)
    .getMethod("init", Context.class).invoke(null, context);
Class.forName("com.android.mms.transaction.MessagingNotification", true, c)
    .getMethod("updateAllNotifications", Context.class).invoke(null, context);

This is obviously a very bad idea for several reasons but I can't think of another way to do what you described.

Josef