Android 将收到的消息写入SMS提供程序(API级别19+;)

Android 将收到的消息写入SMS提供程序(API级别19+;),android,sms,smsmanager,Android,Sms,Smsmanager,我正在为KitKat和更高版本创建SMS管理器。我已按照官方指示实施了所有接收器 我必须接收SMSSMS\u发送广播接收器并读取它,然后必须向SMS提供商写入 到现在为止,我能够阅读收到的短信。我已将我的应用程序设置为设备中的默认短信应用程序。我还在解析短信,可以在日志中看到 问题 我无法将短信写入短信提供商 这是广播接收器: 公共类SmsReceiver扩展了BroadcastReceiver{ @凌驾 公共void onReceive(上下文、意图){ Bundle=intent.getEx

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

我必须接收SMS
SMS\u发送
广播接收器并读取它,然后必须向SMS提供商写入

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

问题

我无法将短信写入短信提供商

这是广播接收器:

公共类SmsReceiver扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
Bundle=intent.getExtras();
if(bundle!=null){
Object[]pdusObj=(Object[])bundle.get(“pdus”);
SmsMessage[]messages=新SmsMessage[pdusObj.length];
for(int i=0;i=Build.VERSION\u code.M){
messages[i]=SmsMessage.createFromPdu((字节[])pdusObj[i],格式);
}否则{
messages[i]=SmsMessage.createFromPdu((字节[])pdusObj[i]);
}
}
用于(SmsMessage msg:messages){
Log.i(“日志”,“显示消息正文:”+msg.getDisplayMessageBody()+“原始地址:”+msg.getDisplayOriginatingAddress()+“获取消息正文:”+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);
此代码将把收到的短信保存到系统短信提供商中,即使在您的ap卸载后,其他短信应用程序也可以读取它。请记住,要执行此操作,您需要成为默认的sms应用程序。您必须在清单中提供
WRITE\u 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);
        }

    }
  }
}
公共类SmsReceiver扩展了BroadcastReceiver{
@凌驾
公共void onReceive(上下文、意图){
Bundle=intent.getExtras();
if(bundle!=null){
Object[]pdusObj=(Object[])bundle.get(“pdus”);
SmsMessage[]messages=新SmsMessage[pdusObj.length];
for(int i=0;i=Build.VERSION\u code.M){
messages[i]=SmsMessage.createFromPdu((字节[])pdusObj[i],格式);
}否则{
messages[i]=SmsMessage.createFromPdu((字节[])pdusObj[i]);
}
}
用于(SmsMessage msg:messages){
Log.i(“日志”,“显示消息正文:”+msg.getDisplayMessageBody()+“原始地址:”+msg.getDisplayOriginatingAddress()+“获取消息正文:”+msg.getMessageBody());
ContentValues=新的ContentValues();
value.put(Telephony.Sms.ADDRESS,msg.getDisplayOriginatingAddress());
value.put(Telephony.Sms.BODY,msg.getMessageBody());
context.getApplicationContext().getContentResolver().insert(Telephony.Sms.Sent.CONTENT\u URI,值);
}
}
}
}

我也有同样的问题。您必须注册SMSBroadcaseReceiver、MMSBroadcaseReceiver和QuickreplyService,才能将其设置为默认SMS接收器

这帮助了我:

也许它会帮助你复制@ahmadaghazadeh。请查看我的更新。是的,我的答案只适用于KitKat。他们修补了之后版本的漏洞。从棒棒糖开始,你的应用绝对必须是默认短信,才能对提供商进行写访问。您之前ping过我是您的应用程序中显示在符合默认条件的应用程序列表中的最小值。在写入提供程序之前,还必须将其实际设置为默认值。也就是说,如果您在KitKat上测试,我的
SmsWriteOpUtil
类应该work@MikeM. 我什么都做了。我已经将其设置为默认短信应用程序和所有这些东西。我现在需要写信给短信提供商。我的目标api是棒棒糖和M。请建议记住,如果你要从应用程序发送消息,你也需要编写这些消息,在这种情况下,你肯定希望在
ContentValues
中包含适当的消息。这对棒棒糖不起作用。如果未将消息设置为默认值,则消息未写入默认android 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());
            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);
        }

    }
  }
}