我想显示SMS收件箱和发件箱中的联系人姓名列表(例如在本机消息传递应用程序中)。我想出了以下代码:
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Uri messagesUri = Uri.parse("content://sms/");
Cursor cursor = getContentResolver().query(messagesUri,new String[] { "_id", "thread_id", "address", "person", "date", "body", "type" }, null, null, null);
startManagingCursor(cursor);
String[] columns = new String[] { "address", "person", "date", "body", "type" };
String sms = "";
if (cursor.getCount() > 0) {
while (cursor.moveToNext()){
String address = cursor.getString(cursor.getColumnIndex(columns[0]));
sms += address + " ";
String contact=address;
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address));
Cursor cs= getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},PhoneLookup.NUMBER+"='"+address+"'",null,null);
startManagingCursor(cs);
if(cs.getCount()>0)
{
cs.moveToFirst();
contact=cs.getString(cs.getColumnIndex(PhoneLookup.DISPLAY_NAME));
}
listItems.add(contact);
}
}
adapter=new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
listItems);
setListAdapter(adapter);
}
这在我在模拟器中运行应用程序时有效,但是当我尝试在手机上运行它时,我得到一个NullPointerException。如果我双击LogCat中的错误消息,则会突出显示以下行:
if(cs.getCount()>0)
这里有什么问题?
答案 0 :(得分:1)
来自ContentResolver.query(...)的文档
Cursor对象,位于第一个条目之前,或 null
使用ContentResolver查询数据时,必须始终检查null。
同样来自同一文档。
使用问号参数标记,例如'phone =?'而不是选择参数中的显式值,因此只有这些值不同的查询才会被识别为缓存目的。
所以而不是:
Cursor cs= getContentResolver().query(uri, new String[ {PhoneLookup.DISPLAY_NAME},PhoneLookup.NUMBER+"='"+address+"'",null,null);
执行:
Cursor cs= getContentResolver().query(uri, new String[]{PhoneLookup.DISPLAY_NAME},PhoneLookup.NUMBER+"=?",new String[]{address},null);
答案 1 :(得分:0)
我的第一个猜测是cs为null。至于为什么它是null,我想载体/制造商可能已经改变了在你的设备上实现它的方式。在不太了解这些系统如何工作的情况下,看起来您正在查询某种数据库,然后使用游标迭代数据。如果表示已更改,则光标将中断。我的建议是看看是否有其他解决方案更多是谷歌/ API驱动(而不是阅读原始数据)。