我的Android应用程序的主要目的是轻松删除短信。从kitkat开始,要求应用程序必须是"默认短信应用程序",我最终创建了一个具有所有必要接收器的应用程序。
在SMS Receiver上,当前应用程序正在接收短信并保存,并使用以下代码。
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);
}
此代码似乎保存了它,但问题是其他任何sms应用都没有显示从我的应用程序存储的这些消息。在我搜索SMS接收器的任何地方,都没有提供保存部分代码。只提供接收短信和Toast显示。这产生了以下问题。
这个难题正在阻止我推出应用程序。请帮忙。
答案 0 :(得分:0)
所有列名都应该是小写的,因为Sms ContentResolver
似乎在sql语句中构造了“引用的”列字符串。
声明:
values.Put("ADDRESS", sms.OriginatingAddress);
和
values.Put("address", sms.OriginatingAddress);
应该解析为不区分大小写的SQL语句,但不是。
因此,您应该提供从Telephony.TextBasedSmsColumns
返回的列名称(全部小写):
您的代码变为:
ContentValues values = new ContentValues();
values.Put("address", sms.OriginatingAddress);
~~~
如果您的应用定位为分钟。 API19:
ContentValues values = new ContentValues();
values.Put(Telephony.TextBasedSmsColumns.Address, sms.OriginatingAddress);
~~~
在API 19(?)之前,SMS ContentProvider未公开记录:
Telephony.TextBasedSmsColumns
:TextBasedSmsColumns