2012-02-24 6 views
0

連絡先の電話番号を表示します。私は何も起こりませんエミュレータで自分のコードを実行されますが、私は自分のスマートフォンでそれを実行したとき、私は連絡先contentProviderが空のカーソルを返しています

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

コードイムで作業logcat ---->でこのエラーを発見した場合は

Cursor peopleCursor = 
    getContentResolver().query(ContactsContract.Contacts.CONTENT_URI 
    ,null, null,null, null); 
    String [] nb = new String[peopleCursor.getCount()]; 
    String [] Tname = new String[peopleCursor.getCount()]; 
     if(peopleCursor.getCount()>0){ 
     peopleCursor.moveToFirst(); 
     Cursor numberCursor; 
      for(int i=0;i<peopleCursor.getCount();i++) 
     { 
     //get number 
    numberCursor= 
    getContentResolver().query(ContactsContract. 
     CommonDataKinds.Phone.CONTENT_URI, new String[] 
     {ContactsContract.CommonDataKinds.Phone.NUMBER} 
    ,ContactsContract.CommonDataKinds.Phone._ID+"="+peopleCursor 
    .getString(peopleCursor.getColumnIndex(ContactsContract.Contacts._ID))  
     , null,null); 
    numberCursor.moveToFirst(); 
    String number=numberCursor.getString(numberCursor 
     .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
    nb[i]=number; 

    //get name 
    String name=peopleCursor.getString(numberCursor 
      .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     Tname[i]=name; 
     peopleCursor.moveToNext(); 
     } 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     R.layout.contact_entry, peopleCursor,nb 
         , new int[] {R.id.checkBox}); 
     lv.setAdapter(adapter); 
     } 
    } 
です

どのような解決策をしてください?

+0

あなたのクエリには結果がないため、空のカーソルがあなたに返されています。 例外が発生するのは、そこにないカーソルから情報を取り出そうとしているためです。 なぜ空のカーソルが戻ってくるのかを知るためには、連絡先APIにはなじみがありません。 – FoamyGuy

答えて

0

ほとんどの場合、電話番号のない連絡先データベースにはいくつかのエントリがあります。あなたのコードはそれを考慮に入れていないようです。 numberCursor.moveToFirst()の戻り値を確認してからnumberCursorにアクセスしてください。

0

SimpleCursorAdapterで作業したい場合は、私もこれまでに新しくなって以来多くのことをお手伝いできませんが、次のコードで正しい電話番号をお知らせください。

Porbably

ないあなたが探している正確な答えが、接触は1を持っている場合、それは、各連絡先のためにあなたの電話番号を与える:

//Initialize Adapter 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_list_item_1); 

    //Get List of all COntacts 
    Uri uri = ContactsContract.Data.CONTENT_URI; 

    String columns[] = { 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER, 
      ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
    }; 

    Cursor contactCursor = mContext.getContentResolver().query(
      uri, 
      columns, 
      null, 
      null, 
      null 
    ); 

    //For every Rsult do this 
    while (contactCursor.moveToNext()) { 
     String phoneNO = ""; 
     String name = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     String id = contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 

     //Check if COntact has a phone number 
     if (Integer.parseInt(contactCursor.getString(contactCursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0){ 

      //Create Cursor to get Phone Number (You need the Phone.Contact_ID here) 
      Cursor numberCursor = mContext.getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER}, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
        new String[]{id}, 
        null, 
        null 
      ); 
      if (numberCursor.moveToFirst()){ 
       phoneNO = numberCursor.getString(numberCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));  
      } 

     } 
     //Create String you want to show in List 
     String contactList = "name: " + name + " Phonenumber: " + phoneNO; 
     adapter.add(contactList); 
    } 
    listView.setAdapter(adapter); 

たぶん、この答えはあなたを助けることができる: How to get contacts' phone number in Android

注意:コードでは連絡先の最初の電話番号のみが返されます

関連する問題