2009-03-19 3 views
19

У меня проблема с чтением SMS-сообщений с устройства. При приобретении поставщика контента для URI «content://sms/inbox», все в порядке, я могу прочитать столбец «человек», чтобы найти внешний ключ в таблице людей и в конечном итоге достигнуть контакта и их имя .Содержание SMS-контента Android (контент: // sms/sent)

Однако, я также хочу, чтобы пересылать отправленные сообщения. При чтении из «content: // sms/sent» поле пользователя всегда выглядит равным 0. Is это поле, которое нужно прочитать, чтобы найти данные получателя для отправленное сообщение? Если да - любая идея, почему мой всегда 0?

Все мои испытания были выполнены в эмуляторе, и я создал 3 контактов. Я отправил сообщения этим контактам из эмулятора в обычным способом отправки сообщения.

Чтобы повторить, я могу видеть 4 отправленные сообщения и прочитать связанный текст тела . Моя проблема заключается в том, что я не могу читать код «человек», и поэтому я не могу решить, кто такой получатель.

Любая помощь была бы принята с благодарностью.

Большое спасибо,

Martin.

ответ

17

Используйте адресную колонку. Я думаю, что столбец человека игнорируется, потому что люди могут отправлять SMS-сообщения на номера телефонов, отсутствующие в списке контактов.

// 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

Здесь им прикрепление код, который я написал для отправки Сообщи пользователям, которые я выбрать из телефонной книги

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);    
      } 
     } 
     ); 

Откроется список контактов ........... ...................

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"); 
     } 
    } 

Это, как и может обрабатывать и получить номер телефона из телефонной книги .......... .................................................. ......

Позовите сбщ со списком номера и сообщ установить ..

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);  
    } 

Это пошлет сообщение ................... ................ U необходимо, чтобы приемник Получать сообщения транслировались

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(); 
     } 
    } 
} 

Вы также можете попробовать его. Это работает для меня .. Спасибо

+0

Как я могу реализовать класс SmsReceiver? Где это должно быть? –

+3

Я видел, как это использовалось в других местах, в ряде мест. Вероятность того, что вы являетесь человеком, написавшим это, ВЫСОКО маловероятна: http://www.google.com/search?q=%22private+void+sendSMS(String+phoneNumber%2C+String+message)+%7B+%22 +% 22PendingIntent + sentPI +% 3D + PendingIntent.getBroadcast% 22 И я считаю, что WEIMENGLEE на MobiForge является оригинальным автором. – DMags

Смежные вопросы