【问题标题】:How to save SMS to inbox in android?如何在android中将短信保存到收件箱?
【发布时间】:2010-10-13 03:03:15
【问题描述】:

我已经编写了以下代码来发送短信。

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

但这不是在我的收件箱中更新,我需要在收件箱中保存相同的消息, 或者有什么方法可以调用原生短信应用程序来发送短信?

【问题讨论】:

  • @Lo'oris, @ereOn:以编程方式表示您希望“通过代码”执行此操作。这是一个完全有效的词,在近年来印刷的大多数词典中都可以找到。有时有必要区分我们从试图通过代码做某事的用户偶尔收到的问题。当然,这些问题属于超级用户而不是这里。问题在于,有些任务更容易完成,而且更常见的是 无需编写一行代码。澄清器使人们无法提供那些明显的答案。

标签: android sms


【解决方案1】:

您可以使用短信内容提供程序来读写短信:

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

我不知道您为什么要将您发送的消息写到收件箱,但如果这是您想要的,只需将上面的 uri 更改为 @987654323 @。

或者,您可以通过启动具有类似于以下意图的 Activity 来移交给消息传递应用程序:

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

编辑:但是,sms:// 内容提供程序不是 SDK 的一部分,因此我强烈建议不要several reasons 的公共应用程序中使用这样的代码。

【讨论】:

  • SMS 内容提供程序不是 Android SDK 的一部分。您的代码将在用自己的 SMS 客户端替换的设备上中断。您的代码可能会在未来的 Android 版本中中断。
  • @CommonsWare:你知道这个特殊问题是否有“官方”解决方案吗?处理未记录的 API 确实似乎有风险,但到目前为止我找不到任何其他解决方案。
  • 很抱歉在这么老的问题上发帖,但是有没有使用 sms:// cp 的替代方法?我正在寻找这个,但它似乎是唯一的方法。
  • 我已经实现了上述代码,它将消息存储到收件箱中。但不知何故我无法找到存储的短信。我什至没有收到任何类型的错误/异常。有人可以帮忙吗?提前致谢
【解决方案2】:

如果您想手动将一些带有发件人姓名的短信发送到您的收件箱,那么,

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

也将这些添加到清单中。

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

现在此代码将使用定义的发件人名称将短信添加到收件箱,因此您可以轻松处理此解决方案的问题,

【讨论】:

  • 真的需要READ_SMS 吗?我希望只需要WRITE_SMS
  • @Flow 亲爱的,两个都用,有时候会出问题,所以两个权限都写会更好,不然我觉得不用READ_SMS也可以。
  • 请将 my_values 编辑为值或相反
  • READ_SMS 也是需要的,我也认为 WRITE_SMS 可以做到但它崩溃了。
  • @sports 是的,你是对的,如果没有 WRITE_SMS,它可能会产生错误。
【解决方案3】:

此代码适用于所有 Android 版本,包括上述 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;
    }

如何拨打电话

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

有关更多详细信息或示例应用程序,请点击链接: http://wisdomitsol.com/blog/android/sms/how-to-programmatically-save-sms-to-inbox-or-sent-in-android

【讨论】:

  • 您的链接中没有“更多信息”。这只是对这个无法解释的答案的反刍(它本身似乎是其他很久以来发布的答案的副本)。再一次,您已经包含了指向您自己网站的未公开链接。我已经删除了链接。
【解决方案4】:
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);

使用内容调用本机 SMS 应用程序

【讨论】:

  • 使用 content://sms/ 有什么区别?我很感兴趣,因为我注意到创建未读短信不会触发任何本机通知。这种方式会触发一些通知吗?
【解决方案5】:
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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多