在手机上运行时出现NullPointerException(但不在模拟器上)

时间:2012-03-29 20:27:42

标签: android

我想显示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)

这里有什么问题?

2 个答案:

答案 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驱动(而不是阅读原始数据)。