我正在为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;
}