在Android默认短信应用程序中接收和存储短信的正确方法是什么?

时间:2017-04-10 18:39:27

标签: android xamarin xamarin.android sms

我的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显示。这产生了以下问题。

  1. 作为默认的短信应用,我的应用是否真的有必要将短信保存到内容://短信/收件箱&#34;?
  2. 如果是,上面示例中显示的保存有什么问题。我有一个模糊的理解,我可能与对话/线程有关。但是,由于我开始使用原始android开发,可能我完全理解它是完全错误的。尝试使用thread_ids创建线程,这似乎也不起作用。
  3. 这个难题正在阻止我推出应用程序。请帮忙。

1 个答案:

答案 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.TextBasedSmsColumnsTextBasedSmsColumns