2009-03-19 22 views
19

Ich habe ein Problem beim Lesen der SMS-Nachrichten vom Gerät. Beim Erwerb eines Inhaltsanbieters für den URI 'content://sms/inbox', ist alles in Ordnung, ich kann die "Person" -Spalte lesen, um den Fremdschlüssel in der People-Tabelle zu finden und schließlich den Kontakt und ihren Namen zu erreichen.Android SMS Content (Inhalt: // SMS/gesendet)

Allerdings möchte ich auch die gesendeten Nachrichten auch durchlaufen. Beim Lesen von von "content: // sms/sent" erscheint das Personenfeld immer 0. Ist das richtige Feld zum Lesen der Empfängerdaten für die gesendete Nachricht? Wenn ja - irgendeine Idee, warum meine immer 0 ist?

Alle meine Tests wurden im Emulator durchgeführt und ich habe 3 Kontakte erstellt. Ich habe Nachrichten an diese Kontakte vom Emulator in auf die normale Weise gesendet, die Sie eine Nachricht senden würden.

Nur um zu wiederholen, kann ich die 4 gesendeten Nachrichten sehen und lesen Sie die verbundenen Textkörper. Mein Problem ist, dass ich die "Person" ID nicht lesen kann und daher kann ich nicht herausfinden, wer der Empfänger ist.

Jede Hilfe würde sehr geschätzt werden.

Vielen Dank,

Martin.

Antwort

17

Verwenden Sie die Adressspalte. Ich denke, die Personenspalte wird ignoriert, weil Personen SMS an Telefonnummern senden können, die nicht in der Kontaktliste enthalten sind.

// address contains the phone number 
Uri phoneUri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL, address); 
if (phoneUri != null) { 
    Cursor phoneCursor = getContentResolver().query(phoneUri, new String[] {Phones._ID, Contacts.Phones.PERSON_ID}, null, null, null); 
    if (phoneCursor.moveToFirst()) { 
    long person = phonesCursor.getLong(1); // this is the person ID you need 
    } 
} 
2

im hier Code verbunden sind, die ich geschrieben habe, msg an Benutzer zu senden, die ich aus dem Telefonbuch wählen

addcontact.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View V) 
      { 
       Intent ContactPickerIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI); 
       startActivityForResult(ContactPickerIntent, CONTACT_PICKER_RESULT);    
      } 
     } 
     ); 

Dies wird Kontaktliste öffnen ........... ...................

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) 
     { 
      switch (requestCode) 
      { 
      case CONTACT_PICKER_RESULT: 
       Cursor cursor=null; 
       try 
       { 
        Uri result = data.getData(); 
        Log.v(DEBUG_TAG, "Got a contact result: " + result.toString()); 

        // get the contact id from the Uri  
        String id = result.getLastPathSegment(); 

        // query for everything contact number 
        cursor = getContentResolver().query( 
          Phone.CONTENT_URI, null, 
          Phone.CONTACT_ID + "=?", 
          new String[]{id}, null); 

        cursor.moveToFirst(); 
        int phoneIdx = cursor.getColumnIndex(Phone.DATA); 
        if (cursor.moveToFirst()) 
        { 
         phonenofromcontact = cursor.getString(phoneIdx); 
         finallistofnumberstosendmsg +=","+phonenofromcontact; 
         Log.v(DEBUG_TAG, "Got email: " + phonenofromcontact); 
        } 
        else 
        {         
         Log.w(DEBUG_TAG, "No results"); 
        } 
       } 
       catch(Exception e) 
       { 
        Log.e(DEBUG_TAG, "Failed to get contact number", e); 
       } 
       finally 
       { 
        if (cursor != null) 
        { 
         cursor.close(); 
        } 
       } 
       phonePhoneno= (EditText)findViewById(R.id.Phonenofromcontact); 
       phonePhoneno.setText(finallistofnumberstosendmsg); 
       //phonePhoneno.setText(phonenofromcontact); 
       if(phonenofromcontact.length()==0) 
       { 
        Toast.makeText(this, "No contact number found for this contact", 
          Toast.LENGTH_LONG).show(); 
       } 
       break; 
      } 
     } 
     else 
     { 
      Log.w(DEBUG_TAG, "Warning: activity result not ok"); 
     } 
    } 

Dies ist, wie u die Telefonnummer aus dem Telefonbuch behandeln und bekommen .......... .................................................. ......

Rufen Sie nun msg mit der Liste der Zahl und msg schicken .. setzen

private void sendSMS(String phoneNumber, String message) 
    { 
     String SENT = "SMS_SENT"; 
     String DELIVERED = "SMS_DELIVERED"; 

     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(SENT), 0); 

     PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(DELIVERED), 0); 

     //---when the SMS has been sent--- 
     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
         Toast.makeText(getBaseContext(), "SMS sent", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
         Toast.makeText(getBaseContext(), "Generic failure", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NO_SERVICE: 
         Toast.makeText(getBaseContext(), "No service", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NULL_PDU: 
         Toast.makeText(getBaseContext(), "Null PDU", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 
         Toast.makeText(getBaseContext(), "Radio off", 
           Toast.LENGTH_SHORT).show(); 
         break; 
       } 
      } 
     },new IntentFilter(SENT)); 

     //---when the SMS has been delivered--- 
     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context arg0, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
         Toast.makeText(getBaseContext(), "SMS delivered", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case Activity.RESULT_CANCELED: 
         Toast.makeText(getBaseContext(), "SMS not delivered", 
           Toast.LENGTH_SHORT).show(); 
         break;       
       } 
      } 
     }, new IntentFilter(DELIVERED));   

     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);  
    } 

Dies wird Nachricht senden ................... ................ U brauchen Empfänger auf die Nachricht

public class SmsReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //---get the SMS message passed in--- 
     Bundle bundle = intent.getExtras();   
     SmsMessage[] msgs = null; 
     String str = ""; 
     if (bundle != null) 
     { 
      //---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length];    
      for (int i=0; i<msgs.length; i++) 
      { 
       msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);     
       str += "SMS from " + msgs[i].getOriginatingAddress();      
       str += " :"; 
       str += msgs[i].getMessageBody().toString(); 
       str += "\n";   
      } 
      //---display the new SMS message--- 
      Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

ausgestrahlt empfangen können Sie es auch ausprobieren. Es funktioniert für mich .. Danke

+0

Wie kann ich SmsReceiver Klasse implementieren? Wo sollte es sein? –

+3

Ich habe gesehen, dass dies anderswo, in einer Reihe von Orten verwendet. Die Wahrscheinlichkeit, dass Sie die Person sind, die das geschrieben hat, ist HOCH unwahrscheinlich: http://www.google.com/search?q=%22private+void+sendSMS(String+phoneNumber%2C+String+message)+%7B+%22 +% 22PendingIntent + sendPI +% 3D + PendingIntent.getBroadcast% 22 & Ich glaube, WEIMENGLEE auf MobiForge ist der ursprüngliche Autor. – DMags