How to read the particular message format in android and store in sqlite database?

781 views Asked by At

Am developing an GPS tracking android application, I get the GPS coordinates from the client side as sms. In server side i need to store the incoming sms in database. In my application i'm getting all the incoming messages to database, but i need to store only the particular message format in database. Please help me to solve this problem. Thanks in advance.

message format:

Lat:12.5678994
Lan:77.7847599
Accry:4.0

The above is the message format which am getting from client, i need to store only this in database, not all the incoming messages.

MainActivity.java:

public class SecureMessagesActivity extends Activity implements OnClickListener, OnItemClickListener
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        setTheme( android.R.style.Theme_Light );
        setContentView(R.layout.main);
        this.findViewById( R.id.UpdateList ).setOnClickListener( this );
    }

    ArrayList<String> smsList = new ArrayList<String>();

    public void onItemClick( AdapterView<?> parent, View view, int pos, long id ) 
    {
        try 
        {
            //Retriving Lat Lan from msg body
                String[] splitted = smsList.get( pos ).split("\n"); 
            String sender = splitted[0];

            String data= splitted[2];
            String[] latval=data.split(":");
            String lat=latval[1];//Lat Value 

            String data1 = splitted[3];
            String[] lanval=data1.split(":");
            String lan=lanval[1];//Lan Value

            Toast.makeText( this, lat, Toast.LENGTH_SHORT ).show();
            Toast.makeText( this, lan, Toast.LENGTH_SHORT ).show();
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

    public void onClick( View v ) 
    {
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query( Uri.parse( "content://sms/inbox" ), null, null, null, null);
        //Cursor cursor = contentResolver.query(Uri.parse("content://sms/inbox"),new String[]{phoneLookUp.DISPLAY_NAME}, condition, null, null, null);

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

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

        smsList.clear();

        do
        {
            String str = getContactName(getApplicationContext(),cursor.getString(cursor.getColumnIndex(SmsReceiver.ADDRESS)))+":"
                    + 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 );
    }

    public String getContactName(Context context, String phoneNumber) {
        ContentResolver cr = context.getContentResolver();
        Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
                Uri.encode(phoneNumber));
        Cursor cursor = cr.query(uri,
                new String[] { PhoneLookup.DISPLAY_NAME }, null, null, null);
        if (cursor == null) {
            return null;
        }
        String contactName = null;
        if (cursor.moveToFirst()) {
            contactName = cursor.getString(cursor
                    .getColumnIndex(PhoneLookup.DISPLAY_NAME));
        }
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }
        return contactName;
    }

}

SMSReceiver.java:

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[0]);

            String body = sms.getMessageBody().toString();
            if(sms.getMessageBody().contains("Lat:"))
            {
            String address = sms.getOriginatingAddress();
            messages += "SMS from " + address + " :\n";                    
            messages += sms.getMessageBody().toString() + "\n";
            putSmsToDatabase( contentResolver, sms );
            Toast.makeText( context, messages, Toast.LENGTH_SHORT ).show();
            this.abortBroadcast();              }
        //}

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

    // WARNING!!! 
    // If you uncomment next line then received SMS will not be put to incoming.
    // Be careful!

}

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= sms.getMessageBody().toString();


        //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 );
}

}

1

There are 1 answers

9
Lal On BEST ANSWER

You can use

if(messages.getMessageBody().contains("Lat:")) {

     //Write your database insertion code here

}

or

I have one solution for that..May not be the correct one..But still.. Try sending the sms with a special header ie for eg "#####" and check for the "#####" like this..

if(messages.getMessageBody().contains("#####")) {

      //Write your database insertion code here

}