Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Send SMS in android with adding sms data to SMS phone db

Tags:

android

sms

I try to send SMS programmatically follow to this topic.

SMS is sending fine, but sms content, actually my sms text do not save into phone messages db and when i open SMS app on my phone, i do not see my sended message.

So the question : is there any way to saving message in phone SMS db after send him programmatically?

like image 769
Sergey Shustikov Avatar asked Mar 15 '14 12:03

Sergey Shustikov


People also ask

What is SMS database?

The database holds data about the current and historical operations of the SMS server as well as the devices it manages. The configuration files contain data such as SMTP server information, NAT configuration information, and user information.

How do I send SMS from SMS Manager?

Android Send SMS using SMSManager APISmsManager smgr = SmsManager. getDefault(); smgr. sendTextMessage(MobileNumber,null,Message,null,null);


1 Answers

I found a good example where you can read the messages that was sent/ received by the user.

Here's how the code goes :

This is for security stuff :

public class StringCryptor 
{
    private static final String CIPHER_ALGORITHM = "AES";
    private static final String RANDOM_GENERATOR_ALGORITHM = "SHA1PRNG";
    private static final int RANDOM_KEY_SIZE = 128;

    // Encrypts string and encode in Base64
    public static String encrypt( String password, String data ) throws Exception 
    {
        byte[] secretKey = generateKey( password.getBytes() );
        byte[] clear = data.getBytes();

        SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
        Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
        cipher.init( Cipher.ENCRYPT_MODE, secretKeySpec );

        byte[] encrypted = cipher.doFinal( clear );
        String encryptedString = Base64.encodeToString( encrypted, Base64.DEFAULT );

        return encryptedString;
    }

    // Decrypts string encoded in Base64
    public static String decrypt( String password, String encryptedData ) throws Exception 
    {
        byte[] secretKey = generateKey( password.getBytes() );

        SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
        Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
        cipher.init( Cipher.DECRYPT_MODE, secretKeySpec );

        byte[] encrypted = Base64.decode( encryptedData, Base64.DEFAULT );
        byte[] decrypted = cipher.doFinal( encrypted );

        return new String( decrypted );
    }

    public static byte[] generateKey( byte[] seed ) throws Exception
    {
        KeyGenerator keyGenerator = KeyGenerator.getInstance( CIPHER_ALGORITHM );
        SecureRandom secureRandom = SecureRandom.getInstance( RANDOM_GENERATOR_ALGORITHM );
        secureRandom.setSeed( seed );
        keyGenerator.init( RANDOM_KEY_SIZE, secureRandom );
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }
}

And then,

When you receive any message, here how it goes :

public class SmsReceiver extends BroadcastReceiver 
{

    public static final String SMS_EXTRA_NAME = "pdus";
    public static final String SMS_URI = "content://sms";

    public static final String ADDRESS = "address";
    public static final String PERSON = "person";
    public static final String DATE = "date";
    public static final String READ = "read";
    public static final String STATUS = "status";
    public static final String TYPE = "type";
    public static final String BODY = "body";
    public static final String SEEN = "seen";

    public static final int MESSAGE_TYPE_INBOX = 1;
    public static final int MESSAGE_TYPE_SENT = 2;

    public static final int MESSAGE_IS_NOT_READ = 0;
    public static final int MESSAGE_IS_READ = 1;

    public static final int MESSAGE_IS_NOT_SEEN = 0;
    public static final int MESSAGE_IS_SEEN = 1;

    // Change the password here or give a user possibility to change it
    public static final byte[] PASSWORD = new byte[]{ 0x20, 0x32, 0x34, 0x47, (byte) 0x84, 0x33, 0x58 };

    public void onReceive( Context context, Intent intent ) 
    {
        // Get SMS map from Intent
        Bundle extras = intent.getExtras();

        String messages = "";

        if ( extras != null )
        {
            // Get received SMS array
            Object[] smsExtra = (Object[]) extras.get( SMS_EXTRA_NAME );

            // Get ContentResolver object for pushing encrypted SMS to incoming folder
            ContentResolver contentResolver = context.getContentResolver();

            for ( int i = 0; i < smsExtra.length; ++i )
            {
                SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]);

                String body = sms.getMessageBody().toString();
                String address = sms.getOriginatingAddress();

                messages += "SMS from " + address + " :\n";                    
                messages += body + "\n";

                // Here you can add any your code to work with incoming SMS
                // I added encrypting of all received SMS 

                putSmsToDatabase( contentResolver, sms );
            }

            // Display SMS message
            Toast.makeText( context, messages, Toast.LENGTH_SHORT ).show();
        }

    }

For saving the data :

private void putSmsToDatabase( ContentResolver contentResolver, SmsMessage sms )
    {
        // Create SMS row
        ContentValues values = new ContentValues();
        values.put( ADDRESS, sms.getOriginatingAddress() );
        values.put( DATE, sms.getTimestampMillis() );
        values.put( READ, MESSAGE_IS_NOT_READ );
        values.put( STATUS, sms.getStatus() );
        values.put( TYPE, MESSAGE_TYPE_INBOX );
        values.put( SEEN, MESSAGE_IS_NOT_SEEN );
        try
        {
            String encryptedPassword = StringCryptor.encrypt( new String(PASSWORD), sms.getMessageBody().toString() ); 
            values.put( BODY, encryptedPassword );
        }
        catch ( Exception e ) 
        { 
            e.printStackTrace(); 
        }

        // Push row into the SMS table
        contentResolver.insert( Uri.parse( SMS_URI ), values );
    }

Now, to read the values that were stored in the db,

public void onClick( View v ) 
{
    ContentResolver contentResolver = getContentResolver();
    Cursor cursor = contentResolver.query( Uri.parse( "content://sms/inbox" ), null, null, null, null);

    int indexBody = cursor.getColumnIndex( SmsReceiver.BODY );
    int indexAddr = cursor.getColumnIndex( SmsReceiver.ADDRESS );

    if ( indexBody < 0 || !cursor.moveToFirst() ) return;

    smsList.clear();

    do
    {
        String str = "Sender: " + cursor.getString( indexAddr ) + "\n" + cursor.getString( indexBody );
        smsList.add( str );
    }
    while( cursor.moveToNext() );


    ListView smsListView = (ListView) findViewById( R.id.SMSList );
    smsListView.setAdapter( new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, smsList) );
    smsListView.setOnItemClickListener( this );
}

Basically, in this case, then you click refresh, the listview will update with the latest values.

I hope this answers the question.

like image 187
mike20132013 Avatar answered Nov 03 '22 23:11

mike20132013