77 votes

Comment lire les SMS de la boîte de réception de manière programmatique dans Android ?

Je veux récupérer les messages SMS de la boîte de réception et les afficher ?

46voto

Suryavel TR Points 668

Utiliser le résolveur de contenu ( "content://sms/inbox" ) pour lire les SMS qui sont dans la boîte de réception.

Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
cursor.moveToFirst();

do{
   String msgData = "";
   for(int idx=0;idx<cursor.getColumnCount();idx++)
   {
       msgData += " " + cursor.getColumnName(idx) + ":" + cursor.getString(idx);
   }
}while(cursor.moveToNext());

Veuillez ajouter READ_SMS permission.

J'espère que cela vous aidera :)

42voto

Ömer Points 988

Il s'agit d'un processus trivial. Vous pouvez voir un bon exemple dans le code source SMSPopup

Examinez les méthodes suivantes :

public static SmsMmsMessage getSmsDetails(Context context,
                        long ignoreThreadId, boolean unreadOnly)
public static long findMessageId(Context context, long threadId, long _timestamp, int messageType
public static void setMessageRead(Context context, long messageId, int messageType)
public static void deleteMessage(Context context, long messageId, long threadId, int messageType)

c'est la méthode de lecture :

        public static SmsMmsMessage getSmsDetails(Context context,
                        long ignoreThreadId, boolean unreadOnly) {

                String SMS_READ_COLUMN = "read";
                String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null;
                String SORT_ORDER = "date DESC";
                int count = 0;

                //Log.v(WHERE_CONDITION);

                if (ignoreThreadId > 0) {
//                      Log.v("Ignoring sms threadId = " + ignoreThreadId);
                        WHERE_CONDITION += " AND thread_id != " + ignoreThreadId;
                }

                Cursor cursor = context.getContentResolver().query(
                                SMS_INBOX_CONTENT_URI,
                      new String[] { "_id", "thread_id", "address", "person", "date", "body" },
                                WHERE_CONDITION,
                                null,
                                SORT_ORDER);

                if (cursor != null) {
                        try {
                                count = cursor.getCount();
                                if (count > 0) {
                                        cursor.moveToFirst();

//                                      String[] columns = cursor.getColumnNames();
//                                      for (int i=0; i<columns.length; i++) {
//                                              Log.v("columns " + i + ": " + columns[i] + ": "
//                                                              + cursor.getString(i));
//                                      }

                                        long messageId = cursor.getLong(0);
                                        long threadId = cursor.getLong(1);
                                        String address = cursor.getString(2);
                                        long contactId = cursor.getLong(3);
                                        String contactId_string = String.valueOf(contactId);
                                        long timestamp = cursor.getLong(4);

                                        String body = cursor.getString(5);

                                        if (!unreadOnly) {
                                                count = 0;
                                        }

                                        SmsMmsMessage smsMessage = new SmsMmsMessage(
                                                        context, address, contactId_string, body, timestamp,
                                                        threadId, count, messageId, SmsMmsMessage.MESSAGE_TYPE_SMS);

                                        return smsMessage;

                                }
                        } finally {
                                cursor.close();
                        }
                }               
                return null;
        }

23voto

Atif Mahmood Points 1059
public List<Sms> getAllSms() {
    List<Sms> lstSms = new ArrayList<Sms>();
    Sms objSms = new Sms();
    Uri message = Uri.parse("content://sms/");
    ContentResolver cr = mActivity.getContentResolver();

    Cursor c = cr.query(message, null, null, null, null);
    mActivity.startManagingCursor(c);
    int totalSMS = c.getCount();

    if (c.moveToFirst()) {
        for (int i = 0; i < totalSMS; i++) {

            objSms = new Sms();
            objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
            objSms.setAddress(c.getString(c
                    .getColumnIndexOrThrow("address")));
            objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
            objSms.setReadState(c.getString(c.getColumnIndex("read")));
            objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));
            if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
                objSms.setFolderName("inbox");
            } else {
                objSms.setFolderName("sent");
            }

            lstSms.add(objSms);
            c.moveToNext();
        }
    }
    // else {
    // throw new RuntimeException("You have no SMS");
    // }
    c.close();

    return lstSms;
}

Sms classe est ci-dessous :

public class Sms{
private String _id;
private String _address;
private String _msg;
private String _readState; //"0" for have not read sms and "1" for have read sms
private String _time;
private String _folderName;

public String getId(){
return _id;
}
public String getAddress(){
return _address;
}
public String getMsg(){
return _msg;
}
public String getReadState(){
return _readState;
}
public String getTime(){
return _time;
}
public String getFolderName(){
return _folderName;
}

public void setId(String id){
_id = id;
}
public void setAddress(String address){
_address = address;
}
public void setMsg(String msg){
_msg = msg;
}
public void setReadState(String readState){
_readState = readState;
}
public void setTime(String time){
_time = time;
}
public void setFolderName(String folderName){
_folderName = folderName;
}

}

0voto

Van Hau Hoang Points 1
String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null;

changé par :

String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0 " : SMS_READ_COLUMN + " = 1 ";

0voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X