在android默认短信应用程序中接收和存储短信的正确方式是什么?
我的android应用程序的主要目的是轻松删除短信。由于kitkat要求应用程序必须是“默认短信应用程序”,因此我最终创建了一个具有所有必要接收器的应用程序 在SMS接收器上,应用程序当前正在接收并保存SMS,代码如下在android默认短信应用程序中接收和存储短信的正确方式是什么?,android,xamarin,xamarin.android,sms,Android,Xamarin,Xamarin.android,Sms,我的android应用程序的主要目的是轻松删除短信。由于kitkat要求应用程序必须是“默认短信应用程序”,因此我最终创建了一个具有所有必要接收器的应用程序 在SMS接收器上,应用程序当前正在接收并保存SMS,代码如下 public override void OnReceive(Context context, Intent intent) { try { if (intent.Action != IntentAction) re
public override void OnReceive(Context context, Intent intent)
{
try
{
if (intent.Action != IntentAction) return;
//context.SendOrderedBroadcast(intent, IntentAction);
var bundle = intent.Extras;
if (bundle == null) return;
var pdus = bundle.Get("pdus");
var castedPdus = JNIEnv.GetArray<Java.Lang.Object>(pdus.Handle);
var msgs = new SmsMessage[castedPdus.Length];
var sb = new StringBuilder();
String sender = null;
for (var i = 0; i < msgs.Length; i++)
{
var bytes = new byte[JNIEnv.GetArrayLength(castedPdus[i].Handle)];
JNIEnv.CopyArray(castedPdus[i].Handle, bytes);
msgs[i] = SmsMessage.CreateFromPdu(bytes);
if (sender == null)
sender = msgs[i].OriginatingAddress;
sb.Append(string.Format("SMS From: {0}{1}Body: {2}{1}", msgs[i].OriginatingAddress, System.Environment.NewLine, msgs[i].MessageBody));
putSmsToDatabase(context, msgs[i]);
Toast.MakeText(context, sb.ToString(), ToastLength.Long).Show();
}
}
catch (Exception ex)
{
Toast.MakeText(context, ex.Message, ToastLength.Long).Show();
}
}
private void putSmsToDatabase(Context cntxt, SmsMessage sms)
{
ContentValues values = new ContentValues();
values.Put("ADDRESS", sms.OriginatingAddress);
values.Put("DATE", sms.TimestampMillis);
values.Put("READ", 0);
values.Put("STATUS", sms.Status);
values.Put("TYPE", 1);
values.Put("SEEN", 0);
values.Put("BODY", sms.MessageBody);
// Push row into the SMS table
Android.Net.Uri inboxURI = Android.Net.Uri.Parse("content://sms/inbox");
var uri = cntxt.ContentResolver.Insert(inboxURI, values);
}
public override void OnReceive(上下文、意图)
{
尝试
{
if(intent.Action!=IntentAction)返回;
//SendOrderedBroadcast(intent,IntentAction);
var bundle=intent.Extras;
如果(bundle==null)返回;
var pdus=bundle.Get(“pdus”);
var castedpddus=JNIEnv.GetArray(pdus.Handle);
var msgs=新SMS消息[CastedPDDUS.Length];
var sb=新的StringBuilder();
字符串发送器=null;
对于(变量i=0;i
这段代码似乎保存了它,但问题是没有其他短信应用程序显示这些从我的应用程序存储的消息。在我搜索短信接收器的任何地方,都没有真正提供保存部分代码。只提供了接收短信和Toast显示的功能。这就产生了下面的问题
这一块拼图阻止了我推出应用程序。请提供帮助。所有列名都应小写,因为
Sms ContentResolver
似乎正在sql语句中构造“带引号”的列字符串
虽然声明:
values.Put("ADDRESS", sms.OriginatingAddress);
及
如果解析为不区分大小写的SQL语句,则不区分大小写
因此,您应该提供从Telephony.textbasedmscscolumns
返回的列名(均为小写):
您的代码变成:
ContentValues values = new ContentValues();
values.Put("address", sms.OriginatingAddress);
~~~
如果您的应用程序的目标最低值为API19:
ContentValues values = new ContentValues();
values.Put(Telephony.TextBasedSmsColumns.Address, sms.OriginatingAddress);
~~~
SMS内容提供者在API 19(?)之前未公开记录:
Telephony.textbasedmscscolumns
:我所有的值。Put
列名都是小写的,即值。Put(“address”,…
我从来没有尝试过大写列,但这将是一个开始。“这段代码似乎保存了它”-你为什么这么认为?也就是说,你有什么迹象表明它不仅仅是无声地失败?从ContentResolver.Insert()返回的uri
的值是多少
call?您是否已明确将应用程序设置为默认应用程序?您知道一次只能有一个默认应用程序,是吗?@MikeM。当我重新加载应用程序时,短信会显示在列表视图中,因为我是从content://sms/inbox。是的,我的应用程序是默认的sms应用程序。在“OnResume”上在MainReceiver上,我正在设置它,调用intent。Android显示对话框,我的应用程序成为默认应用程序。@Sushingover我不认为这些列区分大小写。它似乎在保存(请参阅我上面的评论)。无论如何,我将尝试使用小写值,然后返回URI返回值。顺便说一句,我正在调试多个真实设备,而不是模拟器。这有点奇怪。如果在保存了一些消息后将另一个应用程序设置为默认应用程序,并刷新其列表,会发生什么情况?你能看到它们吗?当应用程序运行时,你还能在应用程序中看到它们吗这不是默认值吗?
ContentValues values = new ContentValues();
values.Put(Telephony.TextBasedSmsColumns.Address, sms.OriginatingAddress);
~~~