2013-11-04 9 views
10

W mojej aplikacji chcę odzyskać nadawcę wiadomości SMS Nazwa używając poniższego kodu, ale zawsze zwraca wartość null. Proszę zasugerować mi, w jaki sposób można uzyskać nazwę nadawcy.Jak mogę otrzymać nazwę osoby zapisanej przez SMS (Osoba) używając "content: // sms/inbox"

Uri SMS_INBOX = Uri.parse("content://sms/inbox"); 
     Cursor c = getContentResolver().query(SMS_INBOX, null, null, null, null); 
     android.util.Log.i("COLUMNS", Arrays.toString(c.getColumnNames())); 

      try { 
       if(c.getCount()>0) 
       { 
        while (c.moveToNext()){ 
        Log.d("SMSss", "Contact : "+c.getString(2)+"\n" 
         +"msg : "+c.getString(11)+"\n" 
         +"ID : "+c.getString(0)+"\n" 
         +"Person : "+c.getString(3)); 
        } 
       } 
      } catch (Exception e) { 

      Log.d("mmmmmmmmm"," "+ e.getStackTrace()); 
      } 

używam następujące uprawnienia w menifest

<uses-permission android:name="android.permission.READ_SMS"/> 
<uses-permission android:name="android.permission.READ_CALL_LOG"/> 
<uses-permission android:name="android.permission.READ_CONTACTS"/> 
<uses-permission android:name="android.permission.WRITE_CONTACTS"/> 

Proszę zasugerować mi, jak się dostać. Z góry dziękuję.

+0

nazwa mens saved contact name lub jej numer? –

+0

Zapisana nazwa kontaktu – IPL10

+0

, jeśli numer jest nowym numerem, który nie został zapisany w telefonie, a następnie? –

Odpowiedz

23

W ten sposób można uzyskać zapisaną nazwę kontaktu ze skrzynki odbiorczej .. wywołać metodę getAllSms() aby uzyskać szczegółowe informacje ..

public void getAllSms() { 
    Uri message = Uri.parse("content://sms/"); 
    ContentResolver cr = getContentResolver(); 
    Cursor c = cr.query(message, null, null, null, null); 
    startManagingCursor(c); 
    int totalSMS = c.getCount(); 
    if (c.moveToFirst()) { 
     for (int i = 0; i < totalSMS; i++) { 

      Log.d("SMSss", 
        "Contact number : " 
          + c.getString(c 
            .getColumnIndexOrThrow("address")) 
          + "\n" 
          + "msg : " 
          + c.getColumnIndexOrThrow("body") 
          + "\n" 
          + "ID : " 
          + c.getString(c.getColumnIndexOrThrow("_id")) 
          + "\n" 
          + "Person : " 
          + getContactName(
           getApplicationContext(), 
            c.getString(c 
              .getColumnIndexOrThrow("address")))); 

      c.moveToNext(); 
     } 
    } 
    c.close(); 

} 

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; 
} 
+0

Dzięki @kalyan jego pracy – IPL10

+0

Ten proces jest zbyt wolno, zabierając czas O (n^2), jeśli chcesz odzyskać wszystkie nazwy kontaktów w ten sposób. Zastanawiam się, czego używają w domyślnej aplikacji do obsługi SMS-i - domyślam się, że pobierają ją w adapterze. Nie musisz więc otrzymywać wszystkich nazw kontaktów, zanim pokażemy je na liście - zamiast tego pobierz tylko te nazwy, które będą wyświetlane na ekranie. – Khobaib

+0

@Khobaib zbyt późno na imprezę, ale myślę, że powinienem opublikować link do takiej aplikacji. Nadal nad tym pracuję. Link do GitHub aplikacji o nazwie [SMSdroid] (https://github.com/felixb/smsdroid) – Sufian

3
Uri uriInbox = Uri.parse("content://sms/inbox"); 

      Cursor c = getContentResolver().query(uriInbox, null, null, null, null); 


      if (c.moveToFirst()) { 
       for (int i = 0; i < c.getCount(); i++) { 
        String name = null; 
        String phone = ""; 
        String _id = c.getString(c.getColumnIndexOrThrow("_id")); 
        String thread_id = c.getString(c.getColumnIndexOrThrow("thread_id")); 
        String msg = c.getString(c.getColumnIndexOrThrow("body")); 
        String type = c.getString(c.getColumnIndexOrThrow("type")); 
        String timestamp = c.getString(c.getColumnIndexOrThrow("date")); 
        phone = c.getString(c.getColumnIndexOrThrow("address")); 
        name = Function.getContactbyPhoneNumber(getApplicationContext(), c.getString(c.getColumnIndexOrThrow("address"))); 


        c.moveToNext(); 
       } 
      } 
      c.close(); 

Wreszcie Twój getContactbyPhoneNumber metoda:

public String getContactbyPhoneNumber(Context c, String phoneNumber) { 

    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    String[] projection = {ContactsContract.PhoneLookup.DISPLAY_NAME}; 
    Cursor cursor = c.getContentResolver().query(uri, projection, null, null, null); 

    if (cursor == null) { 
     return phoneNumber; 
    }else { 
     String name = phoneNumber; 
     try { 

      if (cursor.moveToFirst()) { 
       name = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
      } 

     } finally { 
      cursor.close(); 
     } 

     return name; 
    } 
} 

Dzięki uprzejmości: http://www.androstock.com/tutorials/create-sms-app-android-android-studio-part-2.html