2017-05-04 17 views
1

Ich habe einen Hintergrunddienst, der Änderungen an Android SMS-Inhaltsanbieter abhört. Ich speichere die zuletzt aufgezeichnete ID der Nachricht, die mein Dienst aufgezeichnet hat, und benutze sie. Ich möchte die Anzahl der Nachrichten finden, die gesendet wurden, als der Dienst gestoppt/erledigt war.Abrufen von SMS nach einer bestimmten Zeit gesendet

Wenn also der Dienst erneut gestartet wird und eine andere Nachricht gesendet wird, möchte ich den Zeitstempel der letzten aufgezeichneten Nachricht verwenden. Ich verwende den folgenden Code, um dies zu tun. Mein Problem ist, dass der Cursor immer 1 Datensatz zurückgibt, unabhängig davon, wie viele Nachrichten gesendet wurden, als der Dienst vor dem Neustart beendet wurde.

String COLUMN_NAME_DATE = "date" 
String[] projection = new String[]{COLUMN_NAME_ID, COLUMN_NAME_DATE}; 

Cursor newMessagesCursor = mContext.getContentResolver().query(
       Uri.parse(SMSManager.SMS_URI_SENT), 
       projection, 
       COLUMN_NAME_DATE + "> ? ", 
       new String[]{String.valueOf(lastMessageTimeStamp)}, null); 

int newMessagesCount = (null != newMessagesCursor) ? newMessagesCursor.getCount() : 0; 

Alle Zeiger wären hilfreich. Lassen Sie mich wissen, ob es auch einen alternativen Ansatz gibt.

Bearbeiten: Hinzufügen von Code zum Abrufen der LastMessageTimeStamp.

Cursor messageCursor = mContext.getContentResolver().query(
     Uri.parse(SMSManager.SMS_URI_SENT), 
     projection, 
     COLUMN_NAME_ID + "= ? ", 
     new String[]{ lastMessageId}, null); 

if(null != messageCursor && messageCursor.moveToFirst()) {  
    Long lastMessageTimeStamp = Long.parseLong(messageCursor.getString(messageCursor.getColumnIndex(COLUMN_NAME_DATE))); 
} 

kompletten Source-Code für diese Klasse befindet sich unter: https://github.com/midhunhk/message-counter/blob/unicorn/messageCounter/src/main/java/com/ae/apps/messagecounter/observers/SMSObserver.java

+0

Sind Sie sicher, dass Sie den richtigen Zeitstempel haben? Wie und wann erhalten Sie 'lastMessageTimeStamp'? Haben Sie diesen Wert überprüft, wenn der obige Code ausgeführt wird? Welches ist die einzige Nachricht, die Sie von dieser Abfrage erhalten? Wird immer die neueste gesendet? –

+0

Ich frage die SMS-Tabelle mit der 'lastMessageId' ab und lese den Zeitstempel. Wird den Code damit auch aktualisieren. Ich denke, dass die eine Nachricht die jüngste ist, wird das bestätigen. – midhunhk

Antwort

0

konnte ich dieses Problem lösen, indem Sie einen anderen Ansatz.

Es scheint wie wenn wir die Tabelle SMSManager.SMS_URI_SENT wie in der Frage abfragen, es gibt nur 1 Zeile zurück, die die letzte Nachricht ist, die gesendet wurde.

Cursor newMessagesCursor = context.getContentResolver().query(
     Uri.parse(SMSManager.SMS_URI_ALL), 
     MessagesTableConstants.SMS_TABLE_PROJECTION, 
       "person is null and " + MessagesTableConstants.COLUMN_NAME_DATE + "> ? ", 
     new String[]{String.valueOf(lastMessageTimeStamp)}, null); 

I Abfrage für SMSManager.SMS_URI_ALL und prüfen, ob person Spalte als null, die Nachrichten, die gesendet werden, darstellt.

Verwandte Themen