如何在android中读取特定的消息格式并存储在sqlite数据库中?

时间:2014-04-22 05:30:55

标签: android sqlite

正在开发GPS跟踪Android应用程序,我从客户端获取GPS坐标作为短信。在服务器端,我需要将传入的短信存储在数据库中。在我的应用程序中,我将所有传入的消息发送到数据库,但我只需要在数据库中存储特定的消息格式。请帮我解决这个问题。提前谢谢。

消息格式:

Lat:12.5678994
Lan:77.7847599
Accry:4.0

以上是从客户端获取的消息格式,我只需将其存储在数据库中,而不是所有传入的消息。

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:

公共类SmsReceiver扩展了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 个答案:

答案 0 :(得分:0)

您可以使用

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

     //Write your database insertion code here

}

我有一个解决方案..可能不是正确的..但仍然.. 尝试发送带有特殊标题的短信,例如&#34; #####&#34;并检查&#34; #####&#34;喜欢这个..

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

      //Write your database insertion code here

}