2009-03-13 36 views
37

Tôi đã viết mã dưới đây để gửi tin nhắn SMS.Cách lưu SMS vào hộp thư đến trong Android?

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

Nhưng điều này không được cập nhật trong Inbox của tôi, tôi cần phải lưu cùng một thông điệp trong Inbox, Hoặc là có cách nào để gọi một ứng dụng tin nhắn SMS gốc để gửi tin nhắn SMS?

+8

@ Lo'oris, @ereOn: Lập trình có nghĩa là bạn muốn làm điều đó "thông qua mã". Đó là một từ hoàn toàn hợp lệ, được tìm thấy trong hầu hết các từ điển đã được in trong những năm gần đây. Có những lúc cần phân biệt giữa câu hỏi thường xuyên mà chúng tôi nhận được từ người dùng * không * cố gắng làm điều gì đó thông qua mã. Những câu hỏi đó, tất nhiên, thuộc về Super User thay vì ở đây. Vấn đề là một số nhiệm vụ đơn giản hơn nhiều và thường được thực hiện nhiều hơn * mà không cần * viết một dòng mã. Người làm sáng tỏ giúp mọi người không cung cấp những câu trả lời rõ ràng đó. –

Trả lời

56

Bạn có thể sử dụng các nhà cung cấp nội dung sms để đọc và viết tin nhắn sms:

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

Tôi không biết lý do tại sao bạn sẽ muốn viết một tin nhắn bạn gửi đến inbox nhưng nếu điều đó là những gì bạn muốn thay đổi uri ở trên thành "content://sms/inbox".

Hoặc bạn có thể bàn giao cho một ứng dụng nhắn tin bằng cách bắt đầu một hoạt động với một tương tự ý những điều sau đây:

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

Edit: Tuy nhiên, nhà cung cấp sms:// nội dung không phải là một phần của SDK vì vậy tôi khuyên bạn nên không phải sử dụng mã như thế này trong các ứng dụng công khai cho several reasons.

+6

Nhà cung cấp nội dung SMS không thuộc SDK Android.Mã của bạn sẽ tự động phá vỡ trên các thiết bị thay thế ứng dụng SMS. Mã của bạn có thể bị hỏng trong các phiên bản Android trong tương lai. – CommonsWare

+0

@CommonsWare Điểm tốt. Tôi đã thêm nó vào câu trả lời của tôi. –

+4

@CommonsWare: Bạn có biết vấn đề cụ thể này có giải pháp "chính thức" không? Xử lý các API không có giấy tờ thực sự có vẻ nguy hiểm, nhưng tôi không thể tìm thấy bất kỳ giải pháp nào khác cho đến nay. – 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); 

gọi một ứng dụng tin nhắn SMS với nội dung bản địa

+0

sự khác biệt về cách sử dụng nội dung: // sms /? Tôi quan tâm vì tôi nhận thấy rằng việc tạo một SMS chưa đọc không kích hoạt bất kỳ thông báo gốc nào. Bằng cách này sẽ kích hoạt một số thông báo? – sports

27

Nếu bạn muốn tự đặt một số tin nhắn SMS đến hộp thư của bạn với một tên người gửi rồi,

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

cũng thêm những trong manifest.

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

Bây giờ mã này sẽ bổ sung thêm sms đến hộp thư đến với một tên người gửi được xác định, vì vậy bạn có thể dễ dàng xử lý các bạn vấn đề với giải pháp này,

+0

Có phải 'READ_SMS' thực sự cần thiết? Tôi chỉ mong đợi 'WRITE_SMS' cần thiết. – Flow

+0

@Flow Kính gửi, Sử dụng cả hai, một số lần nó cho vấn đề, vì vậy nó sẽ tốt hơn nếu bạn sẽ viết cả hai quyền, nếu không tôi nghĩ rằng nó có thể được thực hiện mà không có READ_SMS. –

+0

Chỉnh sửa giá trị my_values ​​hoặc ngược lại – user1755546

6

Mã này sẽ làm việc cho tất cả các phiên bản Android trong đó có trên 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; 
    } 

Làm thế nào để gọi

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

Để cụ thể hơn hoặc liên kết ứng dụng theo mẫu: http://wisdomitsol.com/blog/android/sms/how-to-programmatically-save-sms-to-inbox-or-sent-in-android

+0

Không có "thông tin thêm" tại liên kết của bạn. Nó chỉ là một sự hồi sinh của câu trả lời không giải thích này (mà bản thân nó có vẻ giống như một bản sao các câu trả lời từ lâu khác). Và một lần nữa, bạn đã bao gồm một liên kết không tiết lộ cho trang web của riêng bạn. Tôi đã xóa liên kết. –

-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); 
Các vấn đề liên quan