2009-03-13 5 views
37

Ich habe den folgenden Code zum Senden von SMS-Nachrichten geschrieben.So speichern Sie SMS in den Posteingang in Android?

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

Aber das ist nicht in meinem Posteingang zu aktualisieren, muss ich die gleiche Nachricht im Posteingang speichern, Oder ist es eine Möglichkeit, eine native SMS-Anwendung aufzurufen, SMS zu senden?

+8

@ Lo'oris, @ereOn: bedeutet Programmatically, dass Sie es "durch den Code" machen wollen. Es ist ein vollkommen gültiges Wort, das in den meisten Wörterbüchern gefunden wird, die in den letzten Jahren gedruckt worden sind. Es gibt Zeiten, in denen es notwendig ist, zwischen den gelegentlichen Fragen zu unterscheiden, die wir von einem Benutzer erhalten, der * nicht * versucht, etwas durch Code zu tun. Diese Fragen gehören natürlich zu Super User statt hier. Das Problem besteht darin, dass einige Aufgaben wesentlich einfacher und viel häufiger erledigt werden können * ohne * eine einzige Codezeile zu schreiben. Die Klärung hält Menschen davon ab, diese offensichtlichen Antworten zu geben. –

Antwort

56

können Sie die SMS Content-Provider verwenden, um SMS-Nachrichten zu lesen und schreiben:

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

Ich weiß nicht, warum Sie eine Nachricht schreiben möchten Sie zum Posteingang senden aber wenn die Was du willst, ändere einfach das obige uri zu "content://sms/inbox".

Alternativ können Sie zu einer Messaging-Anwendung übergeben durch eine Tätigkeit mit der Absicht, ähnlich den folgenden Ausgang:

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

Edit: jedoch der sms:// Content-Provider ist nicht Teil des SDK so I dringend empfehlen nicht mit Code wie diesem in öffentlichen Anwendungen für several reasons.

+6

Der SMS-Inhaltsanbieter ist nicht Teil des Android SDK.Ihr Code wird auf Geräten beschädigt, die den SMS-Client durch ihren eigenen ersetzen. Ihr Code wird möglicherweise in zukünftigen Android-Versionen beschädigt. – CommonsWare

+0

@CommonsWare Guter Punkt. Ich habe es meiner Antwort hinzugefügt. –

+4

@CommonsWare: Weißt du, ob dieses spezielle Problem eine "offizielle" Lösung hat? Der Umgang mit undokumentierten APIs scheint in der Tat riskant, aber ich konnte bisher keine andere Lösung finden. – 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); 

eine native SMS-Anwendung mit

Inhalt aufrufen
+0

Was ist der Unterschied bei der Verwendung von Inhalten: // SMS /? Ich bin interessiert, weil ich festgestellt habe, dass das Erstellen einer ungelesenen SMS keine systemeigene Benachrichtigung auslöst. Wird auf diese Weise eine Benachrichtigung ausgelöst? – sports

27

Wenn Sie manuell eine SMS in Ihren Posteingang mit einem Absendernamen dann

setzen wollen
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); 

auch diese in Manifest hinzufügen.

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

Jetzt wird dieser Code sms fügt mit einem definierten Absendernamen Posteingang, so dass Sie leicht Sie Problem bei dieser Lösung umgehen können,

+0

Wird 'READ_SMS' wirklich benötigt? Ich würde erwarten, dass nur "WRITE_SMS" benötigt wird. – Flow

+0

@Flow Sehr geehrte, verwenden Sie beide, manchmal gibt es Probleme, so wird es besser sein, wenn Sie beide Berechtigungen schreiben, sonst denke ich, dass es ohne READ_SMS getan werden kann. –

+0

Bearbeiten Sie bitte my_values ​​zu Werten oder umgekehrt – user1755546

6

Dieser Code wird für alle Android-Versionen oben kitkat einschließlich (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; 
    } 

Wie Aufruf

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 0

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

Für weitere Einzelheiten oder Beispiel-App folgendem Link: http://wisdomitsol.com/blog/android/sms/how-to-programmatically-save-sms-to-inbox-or-sent-in-android

+0

Es gab keine "mehr Informationen" bei Ihrem Link. Es war eine bloße Regurgitation dieser nicht erklärten Antwort (die selbst wie eine Kopie von anderen seit langem veröffentlichten Antworten erscheint). Und wieder haben Sie einen nicht offengelegten Link zu Ihrer eigenen Website hinzugefügt. Ich habe den Link entfernt. –

-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); 
Verwandte Themen