2012-06-25 66 views
0

在我的項目中的手機類型和電子郵件類型有一些問題。我使用2.1平臺,在添加Phone類型和電子郵件類型之前,我的項目中沒有問題,使用這些Phone類型和電子郵件類型後,當我嘗試運行該項目它會打開一個消息框並顯示應用程序已停止並強制關閉。我的xml文件有一個Button和ListView。我正在使用此代碼。電話類型和電子郵件類型不工作?

代碼

public class GetAllDatas extends Activity { 

ListView lvItem; 
private Button btnAdd; 
String Ptype, Etype; 
int contactPhoneType; 

String displayName="", emailAddress="", phoneNumber=""; 
ArrayList<String> contactlist=new ArrayList<String>(); 
ArrayAdapter<String> itemAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    lvItem = (ListView)this.findViewById(R.id.lvitems); 
    btnAdd = (Button)this.findViewById(R.id.btnAddItem); 

    itemAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactlist); 
    lvItem.setAdapter(itemAdapter); 

    btnAdd.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      readContacts(); 
     } 
    }); 

} 

private void readContacts() 
{ 
    ContentResolver cr =getContentResolver(); 
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 


    while (cursor.moveToNext()) 
    { 
     displayName = "" ; 
     ArrayList<String> phoneNumber = new ArrayList<String>(); 
     ArrayList<String> emailAddress = new ArrayList<String>(); 

     displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));  
     String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 

     /*     Email     */ 

     Cursor emails = cr.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + id, null, null); 
     while (emails.moveToNext()) 
     { 
      emailAddress.add(emails.getString(emails.getColumnIndex(Email.DATA))); 

     } 

     contactPhoneType = emails.getInt(emails.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 

     switch(contactPhoneType){ 
     case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
     Etype = "Home"; 
     break; 

     } 


     emails.close(); 


     /*   Phone Number and Type */ 

     if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
     { 
      Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null); 
      while (pCur.moveToNext()) 
      { 
       phoneNumber.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));        
      } 

      contactPhoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 


      switch(contactPhoneType){ 
      case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
      Ptype = "Home"; 
      break; 

      } 


      pCur.close(); 
     } 

int phoneNumberCount = phoneNumber.size(); 
int emailCount = emailAddress.size(); 

// Add arraylist data to contactlist.. 

if(phoneNumberCount > emailCount) { 

    for (int i=0; i<phoneNumberCount; i++) 
     { 
     if(emailCount>i) 
      { 
      contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " + Etype + " , " + emailAddress.get(i) + "\n");  
      } 
     else 
     { 
      contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " + " , " + "\n"); 
     } 
     } 
    } 
    else 
     { 
     for (int i=0; i<emailCount; i++) 
     { 
     if(phoneNumberCount>i) 
      { 
      contactlist.add(displayName + " , " + Ptype + " , " + phoneNumber.get(i) + " , " + Etype + " , " + emailAddress.get(i) + "\n"); 
      } 
     else 
     { 
      contactlist.add(displayName + " , " + " , " + " , " + Etype + " , " + emailAddress.get(i) + "\n"); 
     } 
     } 
    }  
    } 
    Collections.sort(contactlist); 
    itemAdapter.notifyDataSetChanged(); 
    cursor.close(); 
} 

}

logcat的

06-26 13:31:16.213: E/AndroidRuntime(449): Uncaught handler: thread main exiting due to uncaught exception 
06-26 13:31:16.224: E/AndroidRuntime(449): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1 
06-26 13:31:16.224: E/AndroidRuntime(449): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
06-26 13:31:16.224: E/AndroidRuntime(449): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
06-26 13:31:16.224: E/AndroidRuntime(449): at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84) 
06-26 13:31:16.224: E/AndroidRuntime(449): at android.database.CursorWrapper.getInt(CursorWrapper.java:123) 
06-26 13:31:16.224: E/AndroidRuntime(449): at com.abhi.GetAllDatas.readContacts(GetAllDatas.java:71) 
06-26 13:31:16.224: E/AndroidRuntime(449): at com.abhi.GetAllDatas.access$0(GetAllDatas.java:47) 
06-26 13:31:16.224: E/AndroidRuntime(449): at com.abhi.GetAllDatas$1.onClick(GetAllDatas.java:41) 

回答

0

我在你的代碼中得到了錯誤。將光標移到最後一條記錄(while循環超出最後一條記錄之後的最後一條記錄(pCur.moveToNext())後,您將檢查phoneType和emailtype。您需要在while循環內檢查它,而不是在if之後。更改以下內容:

while (pCur.moveToNext()) 
     { 
      phoneNumber.add(pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 

      int contactPhoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 

      switch(contactPhoneType){ 
       case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
        Ptype = "Home"; 
        break; 
      }     
     } 

對emailType也做同樣的更正。

+0

我得到了答案。您的代碼是正確的,首先非常感謝您,但一個聯繫人有2個數字和2個電子郵件因爲兩者都顯示相同的類型。我會盡力糾正它。不要忘了我... – Beginner

0

也許它是這一行:

while (cursor.moveToNext()) 

對我來說,看起來你甚至在你讀完第一個光標位置之前就移動了光標,並且你得到了一個CursorIndexOOB的豁免。

嘗試使用do-while循環,看看是否有幫助。

此外,請檢查您的應用程序是否有權讀取聯繫人數據。

uses-permission android:name="android.permission.READ_CONTACTS" 
+0

我得到了答案,非常感謝您的回覆Adborn – Beginner

0

如看起來的問題是與指數

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

GOR獲得Phone.TYPE可以試試下面的代碼按本http://www.vtgroup.com/#ContactsContract

// Get all phone numbers. 
    // 
    Cursor phones = cr.query(Phone.CONTENT_URI, null, 
     Phone.CONTACT_ID + " = " + contactId, null, null); 
    while (phones.moveToNext()) { 
     String number = phones.getString(phones.getColumnIndex(Phone.NUMBER)); 
     int type = phones.getInt(phones.getColumnIndex(Phone.TYPE)); 
     switch (type) { 
      case Phone.TYPE_HOME: 
       // do something with the Home number here... 
       break; 
      case Phone.TYPE_MOBILE: 
       // do something with the Mobile number here... 
       break; 
      case Phone.TYPE_WORK: 
       // do something with the Work number here... 
       break; 
      } 
    } 
    phones.close(); 
+0

我得到了答案,謝謝Dheeresh singh – Beginner

+0

電子郵件類型和電話類型來了,但沒有按正確的順序我添加了HOME,WORK MOBILE和OTHERS ....但是隨機地爲一些聯繫人\ – Beginner

+0

看起來取決於Phone.CONTACT_ID +「=」+ contactId條件... –

0

至於說通過Dheeresh你必須改變這種狀態

+0

改變,但沒有區別,我得到了相同的答案隨機手機和電子郵件類型 – Beginner

+0

我檢查你的代碼但我沒有得到解決方案,我不得不提出你問實際問題。 – user187831

相關問題