Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can not fetch contacts with synchronized gmail accounts

I am working on an application in which i need to fetch all the contacts from the contact book and display. i want the user to select some contacts and add them in a group which is saved in db.

i have created a custom list 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>

i have a SelectContact class for fetching contacts from Contact 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);

            }

        }
}

and implemented a custom 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;
    }

}

i am a newbie in android..

The above code works quiet fine on emulater and fetch contact name and numbers to display in list. but when i test this code on phone which have a Gmail account syncronized, it got crashed with following error..

CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

I don't have any idea why this is happening. Please give some suggestions...

like image 760
Ashish Kumar Avatar asked Nov 13 '22 12:11

Ashish Kumar


1 Answers

above code is given to you is android contact data not the gmail or any other contact because your phone is sync with your gmail contact or any other contact only phone contact is allow not all the gmail or skype contact.

like image 191
miten joshi Avatar answered Nov 16 '22 03:11

miten joshi