方法读取android上返回null的所有消息



我正在为Android操作系统开发一个Message应用程序,我在这个网站上搜索了一下,发现了一个页面,非常好地描述了如何构建一个扩展本地Java语言对象的类,该对象可以在一个实例中保存单个短信的所有细节。代表SMS对象的类在下面看起来像

 public class IMessage:Java.Lang.Object
    {
        //data field to hold the message id
        private string _message_id;
        //hold the message address in a string
        private string _address;
        private string _msg;
        private string _readState;
        private string _time;
        private string _folderName;
        
        //define the getter for the id
        public string id
        {
            get => _message_id;
            set => id = value;
        }
        public string Address
        {
            get => _address;
            set => _address = value;
        }
        public string Message
        {
            get => _msg;
            set => _msg = value;
        }
        public string ReadState
        {
            get => _readState;
            set => _readState = value;
        }
        public string Time
        {
            get => _time;
            set => _time = value;
        }
        public string FolderName
        {
            get => _folderName;
            set => _folderName = value;
        }
        
    }

然后,我尝试使用此方法读取所有分类为收件箱或已发送的文本消息,但该方法返回null,因为我从logcat Attempt to invoke interface method 'int java.util.List.size()' on a null object reference中捕获了错误。这是因为Android系统试图构建我的列表视图,在此之前,它试图首先检查数组中的项目数,但随后数组为空。所以帮我弄清楚为什么下面的方法返回null而不是消息列表

List<IMessage> GetMessages()
        {
            //declare the content uri for messages
            string message_uri = "content://sms/";
            List<IMessage> lstSms = new List<IMessage>();
            IMessage sms = new IMessage();
            Uri message = Uri.Parse(message_uri);
            //get the content resolver
            ContentResolver cr = ContentResolver;
            ICursor cursor = cr.Query(message, null, null, null, null);
            int totalSmsCount = cursor.Count;
            //check to avoid null pointer exception
            if (cursor.MoveToFirst())
            {
                for (int i = 0; i < totalSmsCount; i++)
                {
                    sms = new IMessage();
                    sms.id = cursor.GetString(cursor.GetColumnIndexOrThrow("_id"));
                    sms.Address = cursor.GetString(cursor.GetColumnIndexOrThrow("address"));
                    sms.Message = cursor.GetString(cursor.GetColumnIndexOrThrow("body"));
                    sms.ReadState = cursor.GetString(cursor.GetColumnIndexOrThrow("read"));
                    sms.Time = cursor.GetString(cursor.GetColumnIndexOrThrow("date"));
                    //filter for inbox messages only
                    if (cursor.GetString(cursor.GetColumnIndexOrThrow("type")).Contains("1"))
                    {
                        sms.FolderName = "inbox";
                    }
                    else
                    {
                        sms.FolderName = "sent";
                    }
                    //add the sms object to our list 
                    lstSms.Add(sms);
                    //move to the next iteration 
                    cursor.MoveToNext();
                }
            }
            //close the cursor
            cursor.Close();
            return lstSms;
        }

我要求安卓操作系统允许我在清单中声明该权限,并在运行时向用户请求,从而读取文本消息

<uses-permission android:name="android.permission.READ_SMS"/>

问题是由类IMessage中的一个拼写错误引起的,我分配给了参数名称,而不是类内数据字段

//should use below
 public string id
        {
            get => _message_id;
            set => _message_id = value;
        }
//instead of
  public string id
        {
            get => _message_id;
            set => id = value;
        }

最新更新