将收到的消息写入SMS提供商(API级别19+)

时间:2016-05-19 10:12:18

标签: android sms smsmanager

我正在为KitKat和更高版本创建一个SMS管理器。我按照官方here的指示实施了所有接收器。

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

到现在为止我能够阅读收到的短信。我已将我的应用程序设置为设备中的默认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.
        }

    }
  }
}

有没有人有任何建议?请帮助我。

更新

我已经尝试了doc by android这样的问题,但我无法绕过它。该解决方案用于写入已发送的SMS而不执行任何类似发送SMS的操作。但我想在这里写收到的短信。

2 个答案:

答案 0 :(得分:2)

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

这就是我所做的:

将sms写入android系统的sms提供程序我使用内容提供程序。并将价值传递给它。代码段是:

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

此代码会将收到的短信保存到系统短信提供程序中,即使在卸载ap后,其他短信应用也可以读取它。请记住,您需要成为执行此操作的默认短信应用程序。并且您必须在清单中提供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);
        }

    }
  }
}

答案 1 :(得分:0)

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

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