Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android默认短信应用程序中接收和存储短信的正确方式是什么?_Android_Xamarin_Xamarin.android_Sms - Fatal编程技术网

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

在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

我的android应用程序的主要目的是轻松删除短信。由于kitkat要求应用程序必须是“默认短信应用程序”,因此我最终创建了一个具有所有必要接收器的应用程序

在SMS接收器上,应用程序当前正在接收并保存SMS,代码如下

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显示的功能。这就产生了下面的问题

  • 作为默认短信应用程序,我的应用程序是否真的需要将短信保存到“content://sms/inbox“
  • 如果是,上面示例中显示的保存有什么问题。我有一个模糊的理解,我可能与对话/线程有关。但是,由于我刚开始使用原始的android开发,可能我完全错了。尝试使用线程ID创建线程,这似乎也不起作用

  • 这一块拼图阻止了我推出应用程序。请提供帮助。

    所有列名都应小写,因为
    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);
    ~~~