2012-01-10 38 views
5

Tôi đang làm việc trên một ứng dụng mà tôi cần tìm nạp tất cả các số liên lạc từ sổ liên lạc và hiển thị. tôi muốn người dùng chọn một số liên hệ và thêm chúng vào một nhóm được lưu trong db.Không thể tìm nạp danh bạ với các tài khoản gmail đã đồng bộ

tôi đã tạo ra một danh sách tùy chỉnh View- contactitem.xml-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 


android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal"> 


<TextView 

    android:id="@+id/contactname" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:layout_weight="1" 
    android:layout_marginLeft="20dp" 
    android:ellipsize="end"   
    android:singleLine="true" 
    android:clickable="true"/> 

<TextView 
    android:id="@+id/contactnum" 
    android:layout_width="wrap_content" 
    android:textColor="@color/White" 
    android:clickable="true" 
    android:layout_gravity="center_vertical" 
    android:layout_height="wrap_content"/> 

    <Button 
    android:id="@+id/add" 
    android:layout_width="wrap_content" 
    android:layout_height="35dp" 
    android:text="@string/add_contacts" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:focusable="false" 
    android:focusableInTouchMode="false"/> 

</LinearLayout> 

tôi có một lớp SelectContact cho lấy danh bạ từ Liên book

public class SelectContacts extends Activity implements OnClickListener{ 

    private String groupName; 
    private Button back; 
    private Button home; 
    private List<Contact> list = new ArrayList<Contact>(); 

    private ListView contactList; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.selectcontacts); 

      Bundle bundle = getIntent().getExtras(); 
      groupName=bundle.getString("groupName"); 

      back=(Button)findViewById(R.id.back_button); 
      back.setOnClickListener(this); 

      home=(Button)findViewById(R.id.home_button); 
      home.setOnClickListener(this); 

      contactList=(ListView)findViewById(R.id.contactsListView); 

      ContentResolver cr = getContentResolver(); 



      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

      cur.moveToFirst(); 

      if (cur.getCount() > 0) { 

       do{ 

        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 

        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 

        String[] fields={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};  

        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, fields, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 

        pCur.moveToFirst(); 

        do { 

         String number=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         Contact c=new Contact(name,number); 

         list.add(c); 

         }while (pCur.moveToNext()); 

         pCur.close(); 
        }    



        }while (cur.moveToNext()); 

       ContactAdapter contactAdapter=new ContactAdapter(this, R.layout.contactitem, list, contactList,groupName); 



       contactList.setAdapter(contactAdapter); 


      } 


     } 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent intent= new Intent(); 

      if(v==back){ 

       Bundle bundle = new Bundle(); 
       bundle.putString("groupName", groupName); 
       intent.putExtras(bundle); 

       intent.setClass(SelectContacts.this, GroupDetails.class); 
       startActivity(intent); 

      } 
      if(v==home){ 
       intent.setClass(SelectContacts.this, Welcome.class); 
       startActivity(intent); 

      } 

     } 
} 

và thực hiện một tùy chỉnh adapter- ContactAdapter- `

public class ContactAdapter extends ArrayAdapter<HashMap<String, Contact>>{ 

private ArrayList<HashMap<String, Contact>> items; 

private LayoutInflater mInflater ; 

public ContactAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Contact>> items) { 

     super(context, textViewResourceId, items); 

     this.items = items; 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

      mInflater = LayoutInflater.from(getContext()); 

      ViewHolder holder; 

     if(convertView==null){ 

      convertView = mInflater.inflate(R.layout.contactitem, parent, false); 

      holder = new ViewHolder(); 

      holder.name = (TextView) convertView.findViewById(R.id.contactname); 

      holder.number = (TextView) convertView.findViewById(R.id.contactnum); 

      holder.add=(Button)convertView.findViewById(R.id.add); 

      convertView.setTag(holder); 

     } 

     else{ 

      holder=(ViewHolder)convertView.getTag(); 

     } 

     String name=items.get(position).get(""+position).getContactName(); 

     String number=items.get(position).get(""+position).getContactNum(); 

     holder.name.setText(name); 

     holder.number.setText(number); 

     return convertView; 
} 



static class ViewHolder{ 

    TextView name; 

    TextView number; 

    Button add; 

} 

}

here Contact is a simple POJO- 



public class Contact { 
    private String contactName; 
    private String contactNum; 

    public String getContactName() { 
     return contactName; 
    } 
    public void setContactName(String contactName) { 
     this.contactName = contactName; 
    } 

    public String getContactNum() { 
     return contactNum; 
    } 
    public void setContactNum(String contactNum) { 
     this.contactNum = contactName; 
    } 

} 

tôi là một newbie trong android ..

Đoạn mã trên hoạt động tốt yên tĩnh trên emulater và lấy tên liên lạc và số điện thoại để hiển thị trong danh sách. nhưng khi tôi kiểm tra mã này trên điện thoại trong đó có một tài khoản Gmail đồng bộ hoá, nó đã bị rơi với lỗi sau ..

CursorIndexOutOfBoundsException: Index 0 yêu cầu, với kích thước từ 0

tôi không có bất kỳ ý tưởng tại sao điều này đang xảy ra. Vui lòng đưa ra một số đề xuất ...

+0

Có an toàn để giả định rằng bạn đã đặt đúng quyền trong Tệp kê khai không? http://developer.android.com/reference/android/Manifest.permission.html#READ_CONTACTS – Joset

+1

umm tôi nghĩ rằng tôi đã thiết lập đúng tất cả các quyền cần thiết trong huy chương. như sau-- Tôi có cần bất kỳ sự cho phép nào khác không ? –

+0

bạn nhận được lỗi ở đâu? Tôi không thể chắc chắn nhưng tôi có ấn tượng rằng vấn đề nằm trong truy vấn thứ hai của bạn. Nó trông giống như thế này: http://stackoverflow.com/questions/3370628/retrieve-contact-phone-number-from-uri-in-android – kingston

Trả lời

1

mã trên được cấp cho bạn là dữ liệu liên hệ Android không phải là gmail hoặc bất kỳ liên hệ nào khác vì điện thoại của bạn được đồng bộ hóa với liên hệ gmail của bạn hoặc bất kỳ liên hệ nào khác chỉ liên hệ qua điện thoại. hoặc liên hệ với skype.

Các vấn đề liên quan