将收到的消息写入 SMS 提供商(API 级别 19+)
Write received message to SMS provider ( API level 19+ )
我正在为 KitKat 和更高版本创建一个 SMS 管理器。我已经按照官方 doc by android.
中的指示实现了所有接收器
我必须接收 SMS 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.
}
}
}
}
有人有什么建议吗?请帮助我。
更新
我已经尝试 android-kitkat-api-19-how-to-write-messages-in-sms-content-provider-without 所以问题,但我无法绕过它。该解决方案用于写入已发送的 SMS,而无需执行发送 SMS 之类的任何操作。但我想在这里写下收到的短信。
感谢Mike M. for the help. i got help from this answer - from SO and this post - kitkat-sms-mms-supports。
这是我所做的:
为了将短信写入 android 系统的短信提供商,我使用了内容提供商。并将值传递给它。代码片段是:
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 class完成后是:
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);
}
}
}
}
我遇到了同样的问题。您必须注册 SMSBroadcaseReceiver、MMSBroadcastReceiver、QuickreplyService 才能设置为默认 SMS 接收器。
这对我有帮助:
https://www.androidauthority.com/how-to-create-an-sms-app-part-2-724264/
我正在为 KitKat 和更高版本创建一个 SMS 管理器。我已经按照官方 doc by android.
中的指示实现了所有接收器我必须接收 SMS 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.
}
}
}
}
有人有什么建议吗?请帮助我。
更新
我已经尝试 android-kitkat-api-19-how-to-write-messages-in-sms-content-provider-without 所以问题,但我无法绕过它。该解决方案用于写入已发送的 SMS,而无需执行发送 SMS 之类的任何操作。但我想在这里写下收到的短信。
感谢Mike M. for the help. i got help from this answer -
这是我所做的:
为了将短信写入 android 系统的短信提供商,我使用了内容提供商。并将值传递给它。代码片段是:
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 class完成后是:
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);
}
}
}
}
我遇到了同样的问题。您必须注册 SMSBroadcaseReceiver、MMSBroadcastReceiver、QuickreplyService 才能设置为默认 SMS 接收器。
这对我有帮助: https://www.androidauthority.com/how-to-create-an-sms-app-part-2-724264/