【问题标题】:Write received message to SMS provider ( API level 19+ )将收到的消息写入 SMS 提供商(API 级别 19+)
【发布时间】:2016-09-16 03:41:25
【问题描述】:

我正在为 KitKat 和更高版本创建 SMS 管理器。我已经按照官方doc by android的指示实现了所有接收器。

我必须接收短信SMS_DELIVER 广播接收器并阅读它,然后必须写入短信提供商。

到目前为止,我可以阅读收到的短信。我已将我的应用程序设置为设备中的默认短信应用程序。我也在解析短信,可以在日志中看到。

问题

我无法将 SMS 写入 SMS 提供商。

这是广播接收器:

public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    if (bundle != null) {

        Object[] pdusObj = (Object[]) bundle.get("pdus");

        SmsMessage[] messages = new SmsMessage[pdusObj.length];

        for (int i = 0; i < messages.length; i++) {
            String format = bundle.getString("format");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i], format);
            } else {
                messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
            }
        }
        for (SmsMessage msg : messages) {
            Log.i("log", "display msg body  : " + msg.getDisplayMessageBody() + "originating address : " + msg.getDisplayOriginatingAddress() + " get message body : " + msg.getMessageBody());

            //here I have to write the message to the sms provider.
        }

    }
  }
}

有人有什么建议吗?请帮帮我。

更新

我已经尝试过android-kitkat-api-19-how-to-write-messages-in-sms-content-provider-without 所以问题,但我无法绕过它。该解决方案用于写入已发送的 SMS,而无需执行任何发送 SMS 之类的操作。但我想把收到的短信写在这里。

【问题讨论】:

  • @ahmadaghazadeh 请看我的更新。
  • 是的,我对 that post 的回答仅适用于 KitKat。他们为之后的版本修补了漏洞。从 Lollipop 开始,您的应用程序绝对必须成为默认 SMS 以拥有对 Provider 的写入权限。 The post 你之前 ping 我是你必须在你的应用程序中拥有的最低限度,它才能显示在有资格成为默认应用程序的列表中。您还必须将其实际设置为默认值,然后才能写入 Provider。也就是说,如果你在 KitKat 上进行测试,我的 SmsWriteOpUtil 类应该可以工作
  • @MikeM。我已经做了一切。我已将其设置为默认短信应用程序和所有这些东西。我现在需要写信给短信提供商。我的目标 api 是 lollipop 和 M 。请建议

标签: android sms smsmanager


【解决方案1】:

我遇到了同样的问题。您必须注册 SMSBroadcaseReceiver、MMSBroadcastReceiver、QuickreplyService 才能设置为默认 SMS 接收器。

这对我有帮助: https://www.androidauthority.com/how-to-create-an-sms-app-part-2-724264/

【讨论】:

    【解决方案2】:

    感谢Mike M. 的帮助。我从这个答案中得到了帮助——来自 SO 的 sms-doesnt-save-on-kitkat-4-4-already-set-as-default-messaging-app 和这篇文章——kitkat-sms-mms-supports

    这是我所做的:

    为了将短信写入安卓系统的短信提供商,我使用了内容提供商。并将值传递给它。代码 sn-p 是:

    ContentValues values = new ContentValues();
    values.put(Telephony.Sms.ADDRESS, msg.getDisplayOriginatingAddress());
    values.put(Telephony.Sms.BODY, msg.getMessageBody());
    context.getApplicationContext().getContentResolver().insert(Telephony.Sms.Sent.CONTENT_URI, values);
    

    此代码会将收到的短信保存到系统短信提供商中,即使在您的应用程序被卸载后,其他短信应用程序也可以读取它。请记住,您需要成为默认的短信应用程序才能执行此操作。并且您必须在清单中提供WRITE_SMS 权限。我的目标是 kitkat 和它之后的版本。对于以前的版本,您必须对某些部分的代码有所不同。

    完成后的整个 SmsReceiver 类是:

    public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
    
            Object[] pdusObj = (Object[]) bundle.get("pdus");
    
            SmsMessage[] messages = new SmsMessage[pdusObj.length];
    
            for (int i = 0; i < messages.length; i++) {
                String format = bundle.getString("format");
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i], format);
                } else {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
                }
            }
            for (SmsMessage msg : messages) {
                Log.i("log", "display msg body  : " + msg.getDisplayMessageBody() + "originating address : " + msg.getDisplayOriginatingAddress() + " get message body : " + msg.getMessageBody());
                ContentValues values = new ContentValues();
                values.put(Telephony.Sms.ADDRESS, msg.getDisplayOriginatingAddress());
                values.put(Telephony.Sms.BODY, msg.getMessageBody());
                context.getApplicationContext().getContentResolver().insert(Telephony.Sms.Sent.CONTENT_URI, values);
            }
    
        }
      }
    }
    

    【讨论】:

    • 请记住,如果您要从应用程序发送消息,您也需要编写这些消息,在这种情况下,您肯定希望在ContentValues.
    • 它不适用于棒棒糖。如果您不将其设置为默认值,则消息不会写入默认的 android SMS 数据库中..
    • 是的。只有一个默认的短信应用程序。它必须手动将收到的所有短信写入数据库。如果它不想写那些短信,那么数据库中就没有短信。
    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多