2009-03-13 15 views
37

Ho scritto il seguente codice per l'invio di messaggi SMS.Come salvare SMS in Posta in arrivo in Android?

SmsManager smsManager = SmsManager.getDefault(); 
smsManager.sendTextMessage(destAddr, null, mMessageText, il, null); 

Ma questo non è l'aggiornamento nella mia posta in arrivo, ho bisogno di salvare lo stesso messaggio in Posta in arrivo, o c'è un modo per richiamare un'applicazione SMS nativo per inviare SMS?

+8

@ Lo'oris, @ereOn: significa livello di programmazione che si desidera farlo "attraverso il codice". È una parola perfettamente valida, trovata nella maggior parte dei dizionari che sono stati stampati negli ultimi anni. Ci sono volte che è necessario distinguere tra la domanda occasionale che otteniamo da un utente che * non * sta tentando di fare qualcosa attraverso il codice. Quelle domande, ovviamente, appartengono a Super User invece che qui. Il problema è che alcune attività sono molto più semplici da fare e molto più comunemente fatte * senza * scrivere una singola riga di codice. Il chiarificatore impedisce alle persone di fornire quelle risposte ovvie. –

risposta

56

È possibile utilizzare il fornitore di contenuti sms per leggere e scrivere i messaggi sms:

ContentValues values = new ContentValues(); 
values.put("address", "123456789"); 
values.put("body", "foo bar"); 
getContentResolver().insert(Uri.parse("content://sms/sent"), values); 

non so il motivo per cui si vuole scrivere un messaggio inviato alla casella di posta ma se questo è quello che vuoi semplicemente cambiare l'uri sopra a "content://sms/inbox".

In alternativa è possibile consegnare ad un'applicazione di messaggistica avviando un'attività con un simile intento di quanto segue:

Intent sendIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("sms://")); 
sendIntent.putExtra("address", "123456789"); 
sendIntent.putExtra("sms_body", "foo bar"); 
startActivity(sendIntent); 

Edit: Tuttavia, il provider sms:// contenuto non fa parte del SDK in modo da consigliamo vivamente non utilizzando il codice come questo nelle applicazioni pubbliche per several reasons.

+6

Il provider di contenuti SMS non fa parte di Android SDK.Il tuo codice si romperà su dispositivi che sostituiscono il client SMS con il proprio. Il tuo codice potrebbe rompersi nelle versioni future di Android. – CommonsWare

+0

@CommonsWare Buon punto. L'ho aggiunto alla mia risposta. –

+4

@CommonsWare: Sai se questo particolare problema ha una soluzione "ufficiale"? Gestire le API non documentate sembra davvero rischioso, ma non sono riuscito a trovare nessuna altra soluzione finora. – ereOn

0
Intent sendIntent = new Intent(Intent.ACTION_VIEW); 
sendIntent.putExtra("sms_body", "Content of the SMS goes here..."); 
sendIntent.setType("vnd.android-dir/mms-sms"); 
startActivity(sendIntent); 

richiamare un'applicazione SMS nativa con contenuti

+0

qual è la differenza sull'utilizzo del contenuto: // sms /? Sono interessato perché ho notato che la creazione di un SMS non letto non attiva alcuna notifica nativa. In questo modo attiverai qualche notifica? – sports

27

Se si vuole mettere manualmente alcuni SMS alla tua casella di posta con il nome del mittente, allora,

ContentValues values = new ContentValues(); 
    values.put("address", "+923359110795");//sender name 
    values.put("body", "this is my text"); 
    getContentResolver().insert(Uri.parse("content://sms/inbox"), values); 

aggiungere anche questi in manifesto.

<uses-permission android:name="android.permission.READ_SMS"/> 
<uses-permission android:name="android.permission.WRITE_SMS"/> 

Ora questo codice aggiungerà sms alla casella di posta con il nome del mittente definito, in modo da poter facilmente gestire problema con questa soluzione,

+0

'READ_SMS' è davvero necessario? Mi aspetterei che fosse necessario 'WRITE_SMS'. – Flow

+0

@Flow Caro, usa entrambi, alcune volte dà problemi, quindi sarà meglio se scriverete entrambe le autorizzazioni, altrimenti penso che possa essere fatto senza READ_SMS. –

+0

Modifica per favore my_values ​​a valori o al contrario – user1755546

6

Questo codice funzionerà per tutte le versioni di Android, tra cui sopra kitkat (19)

public boolean saveSms(String phoneNumber, String message, String readState, String time, String folderName) { 
     boolean ret = false; 
     try { 
      ContentValues values = new ContentValues(); 
      values.put("address", phoneNumber); 
      values.put("body", message); 
      values.put("read", readState); //"0" for have not read sms and "1" for have read sms 
      values.put("date", time); 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
       Uri uri = Telephony.Sms.Sent.CONTENT_URI; 
       if(folderName.equals("inbox")){ 
        uri = Telephony.Sms.Inbox.CONTENT_URI; 
       } 
       mActivity.getContentResolver().insert(uri, values); 
      } 
      else { 
       mActivity.getContentResolver().insert(Uri.parse("content://sms/" + folderName), values); 
      } 

      ret = true; 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      ret = false; 
     } 
     return ret; 
    } 

Come chiamare

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     final String myPackageName = getPackageName(); 
     if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) { 

      Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); 
      intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName); 
      startActivityForResult(intent, 1); 
     }else { 
      saveSms("111111", "mmmmssssggggg", "0", "", "inbox"); 
     } 
    }else { 
     saveSms("111111", "mmmmssssggggg", "0", "", "inbox"); 
    } 

onActivityResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == 1) { 
     if (resultCode == RESULT_OK) { 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
       final String myPackageName = getPackageName(); 
       if (Telephony.Sms.getDefaultSmsPackage(mActivity).equals(myPackageName)) { 

        //Write to the default sms app 
        saveSms("111111", "mmmmssssggggg", "0", "", "inbox"); 
       } 
      } 
     } 
    } 
} 

Per maggiori dettagli o campione collegamento app segue: http://wisdomitsol.com/blog/android/sms/how-to-programmatically-save-sms-to-inbox-or-sent-in-android

+0

Non c'era "ulteriori informazioni" al tuo link. Era un semplice rigurgito di questa risposta non spiegata (che a sua volta sembra una copia di altre risposte postate). E ancora, hai incluso un link non comunicato al tuo sito. Ho rimosso il collegamento. –

-1
ContentValues values = new ContentValues(); 
values.put("address", phoneNumber); 
values.put("body", multimessage); 
values.put("read", 1); //"0" for have not read sms and "1" for have read sms 
Uri uri = Telephony.Sms.Sent.CONTENT_URI; 
Activity ctx = this.cordova.getActivity(); 
ctx.getContentResolver().insert(uri, values); 
Problemi correlati