2012-03-29 115 views
0

我想显示SMS收件箱和发件箱中的联系人名称列表(如在本机通讯应用程序中)。我想出了下面的代码:NullPointerException在手机上运行时(但不在模拟器上)

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

检查是否'cs'本身是有效的? – Mahesh 2012-03-29 20:32:32

+0

我该怎么做? – user1301428 2012-03-30 06:26:31

回答

1

从文档ContentResolver.query(...)

游标对象,其定位在第一项之前,或

你必须始终检查null当使用ContentResolver查询数据时。

也来自同一文件。

使用问号参数标记,如'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); 
+0

检查指针是否解决了问题,非常感谢:)关于现在的缓存,如果我没有明确地将它写入查询中,我该如何传递查询参数?对不起,这个愚蠢的问题,但我刚刚开始与Android开发:) – user1301428 2012-03-30 06:24:19

+0

奇怪的是,现在它工作,即使我不检查指针是不是空^^ – user1301428 2012-03-30 16:41:24

0

我的第一个猜测是cs为空。至于为什么它是空的,我想运营商/制造商可能已经改变了你的设备上实现的方式。在不太了解这些系统如何工作的情况下,看起来您正在查询某种数据库,然后使用游标来遍历数据。如果表示已更改,则光标将中断。我的建议是查看是否有其他解决方案是更多Google/API驱动的(而不是读取原始数据)。

+0

使用ContentResolver访问提供程序,正如OP所做的那样,是访问作为另一个应用程序的一部分发布的数据的正确方法。它始终表示为一个Cursor,即使它背后的实现决定做其他事情。 – cistearns 2012-03-30 21:08:48

相关问题