2012-06-25 1 views
0

내 프로젝트의 전화 유형과 이메일 유형에 약간의 문제가 있습니다. 2.1 플랫폼을 사용 중입니다. 전화 유형 및 이메일 유형을 추가하기 전에 프로젝트에 문제가 없었습니다. 프로젝트를 실행하면 메시지 상자가 열리고 응용 프로그램이 중지되었다가 강제 종료됩니다. 내 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(); 
} 

}

로그 캣

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; 
      }     
     } 

전자 우편 유형에 대해서도 동일한 수정을하십시오. 문제를 보이는

+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 

뜨거운 Dheeresh가 말했듯이 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

이메일 유형과 전화 유형이 올지 만 적절한 순서가 아니었다. 나는 집, 직장 이동 및 기타를 추가했지만 .... – Beginner

+0

보이는 내용은 Phone.CONTACT_ID + "="+ contactId 조건에 따라 달라집니다 ... –

0

에 따라 코드 아래 당신이 그 조건을 변경 한 시도 할 수 Phone.TYPE을 받고

+0

가 변경되었지만 차이는 없습니다. 임의의 전화 및 전자 메일 유형과 동일한 대답을 받았습니다 – Beginner

+0

코드를 확인합니다. 하지만 나는 해결책을 얻지 못했고, 당신은 실제 문제에 대해 dheeresh에게 물어보아야 만합니다. – user187831

관련 문제