从Android的指定组获取联系人联系人、Android

2023-09-06 11:36:02 作者:夏有森光若流苏

我试图从已知的id.i'm的一组特定抽到组ID和联系人姓名的group.but我无法取得联系numbers.tried从谷歌搜索了一些解决方案的联系人,但每次我得到的电话号码同组ID,如果我查询组使用Phone.number电话号码和联系人姓名,Phone.DISPLAY_NAME.if我用下面的方法,我得到错误 请帮我弄清楚什么是错在我的code。

code:

 保护无效的onCreate(包savedInstanceState){
        // TODO自动生成方法存根
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.group_contacts);
        addGroups =(按钮)findViewById(R.id.selectGroup);

        groupAdapter =新SimpleCursorAdapter(getApplicationContext()
                android.R.layout.select_dialog_singlechoice,GroupCursor(),
                新的String [] {} ContactsContract.Groups.TITLE,
                新的INT [] {android.R.id.text1});
        setListAdapter(groupAdapter);
        。getListView()setChoiceMode(ListView.CHOICE_MODE_SINGLE);

        addGroups.setOnClickListener(新OnClickListener(){

            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                意向意图=新的意图(myGroups.this,Main.class);
                捆绑进位=新包();
                carry.putStringArrayList(数字,cNumbers);
                carry.putStringArrayList(名,CNAMES);
                intent.putExtras(进);
                的setResult(RESULT_OK,意图);
                完();
            }
        });

    }

    私人光标GroupCursor(){
        // TODO自动生成方法存根
        的String []投影= {ContactsContract.Groups.TITLE,
                ContactsContract.Groups._ID};
        光标gCursor = getContentResolver()查询(
                ContactsContract.Groups.CONTENT_URI,投影,NULL,NULL,
                ContactsContract.Groups.TITLE);

        // INT idcolumn = gCursor.getColumnIndex(ContactsContract.Groups._ID);
        //字符串ID = gCursor.getString(idcolumn);

        // Log.d(E,组ID:+ ID);
        返回gCursor;

    }

    @覆盖
    保护无效onListItemClick(ListView的L,视图V,INT位置,长的id){
        // TODO自动生成方法存根
        super.onListItemClick(L,V,位置ID);
        Log.d(E,ID:+ ID);
        串的groupId = Long.toString(ID);

        的String [] cProjection = {Phone.NUMBER,Phone.DISPLAY_NAME,Contacts.DISPLAY_NAME,Contacts._ID};

        光标groupCursor = getContentResolver()查询(Data.CONTENT_URI,
                cProjection,
                CommonDataKinds.GroupMembership.GROUP_ROW_ID +=?,
                新的String [] {}的groupId,NULL);
        如果(groupCursor!= NULL){
            groupCursor.moveToFirst();
            做 {

                INT nameCoumnIndex = groupCursor
                        .getColumnIndex(Phone.DISPLAY_NAME);

                字符串名称= groupCursor.getString(nameCoumnIndex);

                串CID = groupCursor.getString(groupCursor.getColumnIndex(Contacts._ID));

                光标numberCursor = getContentResolver()查询(Phone.CONTENT_URI,新的String [] {} Phone.NUMBER,Phone._ID +=+ CID,NULL,NULL);
                numberCursor.moveToFirst();
                INT numberColumnIndex = numberCursor
                        .getColumnIndex(Phone.NUMBER);
                Log.d(E,numberindex:+ numberColumnIndex);

                串号= numberCursor.getString(numberColumnIndex);

                cNumbers.add(数);

                Log.d(E,联系人+名字+:+号);

                cNames.add(名称);
            }而(groupCursor.moveToNext());
        }
    }
}
 

日志:

  09-04 17:59:24.943:D / dalvikvm(18084):GC_EXTERNAL_ALLOC释放23K,48%免费2844K / 5379K,外部1032K / 1039K,暂停24ms
09-04 17:59:26.054:D /(18084):ID:14
09-04 17:59:26.074:D /(18084):numberindex:0
09-04 17:59:26.074:D / AndroidRuntime(18084):关闭虚拟机
09-04 17:59:26.074:W / dalvikvm(18084):主题ID = 1:螺纹退出与未捕获的异常(组= 0x40015568)
09-04 17:59:26.084:E / AndroidRuntime(18084):致命异常:主要
09-04 17:59:26.084:E / AndroidRuntime(18084):android.database.CursorIndexOutOfBoundsException:指数0要求,为0的大小
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.database.CursorWrapper.getString(CursorWrapper.java:135)
09-04 17:59:26.084:E / AndroidRuntime(18084):在hm.swarna.groupsms.myGroups.onListItemClick(myGroups.java:117)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.app.ListActivity $ 2.onItemClick(ListActivity.java:319)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.widget.AdapterView.performItemClick(AdapterView.java:284)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.widget.ListView.performItemClick(ListView.java:3535)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.widget.AbsListView $ PerformClick.run(AbsListView.java:1827)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.os.Handler.handleCallback(Handler.java:587)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.os.Handler.dispatchMessage(Handler.java:92)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.os.Looper.loop(Looper.java:130)
09-04 17:59:26.084:E / AndroidRuntime(18084):在android.app.ActivityThread.main(ActivityThread.java:3703)
09-04 17:59:26.084:E / AndroidRuntime(18084):在java.lang.reflect.Method.invokeNative(本机方法)
09-04 17:59:26.084:E / AndroidRuntime(18084):在java.lang.reflect.Method.invoke(Method.java:507)
09-04 17:59:26.084:E / AndroidRuntime(18084):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:841)
09-04 17:59:26.084:E / AndroidRuntime(18084):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
09-04 17:59:26.084:E / AndroidRuntime(18084):在dalvik.system.NativeStart.main(本机方法)
09-04 17:59:27.556:I /流程(18084):发送信号。 PID:18084 SIG:9
 

解决方案

尝试使用以下code在onListItemClick方式:

 长的groupId = ID;
    的String [] cProjection = {Contacts.DISPLAY_NAME,GroupMembership.CONTACT_ID};

    光标groupCursor = getContentResolver()查询(
            Data.CONTENT_URI,
            cProjection,
            CommonDataKinds.GroupMembership.GROUP_ROW_ID +=? +和
                    + ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE +=
                    + ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE +',
            新的String [] {将String.valueOf(的groupId)},NULL);
    如果(groupCursor = NULL和放大器;!&安培; groupCursor.moveToFirst())
    {
        做
        {

            INT nameCoumnIndex = groupCursor.getColumnIndex(Phone.DISPLAY_NAME);

            字符串名称= groupCursor.getString(nameCoumnIndex);

            长的ContactID = groupCursor.getLong(groupCursor.getColumnIndex(GroupMembership.CONTACT_ID));

            光标numberCursor = getContentResolver()查询(Phone.CONTENT_URI,
                    新的String [] {} Phone.NUMBER,Phone.CONTACT_ID +=+的ContactID,NULL,NULL);

            如果(numberCursor.moveToFirst())
            {
                INT numberColumnIndex = numberCursor.getColumnIndex(Phone.NUMBER);
                做
                {
                    字符串phoneNumber的= numberCursor.getString(numberColumnIndex);
                    Log.d(您的标记,联系人+名字+:+ phoneNumber的);
                }而(numberCursor.moveToNext());
                numberCursor.close();
            }
        }而(groupCursor.moveToNext());
        groupCursor.close();
    }
 
android 获取电话簿中的联系人列表

您查询联系人,属于指定组时,需要指定媒体类型。而且,由于单个联系人可以有多个电话号码,您可能需要它们来查询所有。

编辑: 为了让所有组与电话号码中的至少一个联系你可以用下面的查询:

  ContentResolver的CR = getContentResolver();
乌里groupsUri = ContactsContract.Groups.CONTENT_SUMMARY_URI;
字符串,其中=((+ ContactsContract.Groups.GROUP_VISIBLE += 1)和(
                + ContactsContract.Groups.SUMMARY_WITH_PHONES += 0))!;
光标光标= cr.query(groupsUri,空,其中,NULL,NULL);
 

对于从特定的一组获得联系人与手机号码 - 我不知道简单的解决方案。

I'm trying to get contacts from a specific group of known id.i'm able to get group id and contact names in that group.but i'm unable to get contact numbers.tried some solutions from google search, but every time i'm getting phone number same as group id , if i query group for phone numbers and contact names using Phone.number , Phone.DISPLAY_NAME.if i use below method i'm getting error please help me to figure out whats wrong in my code.

Code :

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.group_contacts);
        addGroups = (Button) findViewById(R.id.selectGroup);

        groupAdapter = new SimpleCursorAdapter(getApplicationContext(),
                android.R.layout.select_dialog_singlechoice, GroupCursor(),
                new String[] { ContactsContract.Groups.TITLE },
                new int[] { android.R.id.text1 });
        setListAdapter(groupAdapter);
        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

        addGroups.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(myGroups.this, Main.class);
                Bundle carry = new Bundle();
                carry.putStringArrayList("numbers", cNumbers);
                carry.putStringArrayList("name", cNames);
                intent.putExtras(carry);
                setResult(RESULT_OK, intent);
                finish();
            }
        });

    }

    private Cursor GroupCursor() {
        // TODO Auto-generated method stub
        String[] projection = { ContactsContract.Groups.TITLE,
                ContactsContract.Groups._ID };
        Cursor gCursor = getContentResolver().query(
                ContactsContract.Groups.CONTENT_URI, projection, null,                   null,
                ContactsContract.Groups.TITLE);

        // int idcolumn = gCursor.getColumnIndex(ContactsContract.Groups._ID);
        // String id = gCursor.getString(idcolumn);

        // Log.d(E, "group id : " + id );
        return gCursor;

    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        Log.d(E, "id : " + id);
        String groupId = Long.toString(id);

        String[] cProjection = { Phone.NUMBER, Phone.DISPLAY_NAME ,Contacts.DISPLAY_NAME, Contacts._ID};

        Cursor groupCursor = getContentResolver().query(Data.CONTENT_URI,
                cProjection,
                CommonDataKinds.GroupMembership.GROUP_ROW_ID + "= ?",
                new String[]{groupId}, null);
        if (groupCursor != null) {
            groupCursor.moveToFirst();
            do {

                int nameCoumnIndex = groupCursor
                        .getColumnIndex(Phone.DISPLAY_NAME);

                String name = groupCursor.getString(nameCoumnIndex);

                String cId = groupCursor.getString(groupCursor.getColumnIndex(Contacts._ID));

                Cursor numberCursor = getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.NUMBER}, Phone._ID +"="+cId, null, null);
                numberCursor.moveToFirst();
                int numberColumnIndex = numberCursor
                        .getColumnIndex(Phone.NUMBER);
                Log.d(E, "numberindex : " + numberColumnIndex);

                String number = numberCursor.getString(numberColumnIndex);

                cNumbers.add(number);

                Log.d(E, "contact " + name + ":" + number);

                cNames.add(name);
            } while (groupCursor.moveToNext());
        }
    }
}

Log :

 09-04 17:59:24.943: D/dalvikvm(18084): GC_EXTERNAL_ALLOC freed 23K, 48% free 2844K/5379K, external 1032K/1039K, paused 24ms
09-04 17:59:26.054: D/(18084): id : 14
09-04 17:59:26.074: D/(18084): numberindex : 0
09-04 17:59:26.074: D/AndroidRuntime(18084): Shutting down VM
09-04 17:59:26.074: W/dalvikvm(18084): threadid=1: thread exiting with uncaught exception (group=0x40015568)
09-04 17:59:26.084: E/AndroidRuntime(18084): FATAL EXCEPTION: main
09-04 17:59:26.084: E/AndroidRuntime(18084): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.database.CursorWrapper.getString(CursorWrapper.java:135)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at hm.swarna.groupsms.myGroups.onListItemClick(myGroups.java:117)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.app.ListActivity$2.onItemClick(ListActivity.java:319)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.widget.ListView.performItemClick(ListView.java:3535)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1827)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.os.Handler.handleCallback(Handler.java:587)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.os.Handler.dispatchMessage(Handler.java:92)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.os.Looper.loop(Looper.java:130)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at android.app.ActivityThread.main(ActivityThread.java:3703)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at java.lang.reflect.Method.invokeNative(Native Method)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at java.lang.reflect.Method.invoke(Method.java:507)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
09-04 17:59:26.084: E/AndroidRuntime(18084):    at dalvik.system.NativeStart.main(Native Method)
09-04 17:59:27.556: I/Process(18084): Sending signal. PID: 18084 SIG: 9

解决方案

Try to use following code in your onListItemClick method:

long groupId = id;
    String[] cProjection = { Contacts.DISPLAY_NAME, GroupMembership.CONTACT_ID };

    Cursor groupCursor = getContentResolver().query(
            Data.CONTENT_URI,
            cProjection,
            CommonDataKinds.GroupMembership.GROUP_ROW_ID + "= ?" + " AND "
                    + ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE + "='"
                    + ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE + "'",
            new String[] { String.valueOf(groupId) }, null);
    if (groupCursor != null && groupCursor.moveToFirst())
    {
        do
        {

            int nameCoumnIndex = groupCursor.getColumnIndex(Phone.DISPLAY_NAME);

            String name = groupCursor.getString(nameCoumnIndex);

            long contactId = groupCursor.getLong(groupCursor.getColumnIndex(GroupMembership.CONTACT_ID));

            Cursor numberCursor = getContentResolver().query(Phone.CONTENT_URI,
                    new String[] { Phone.NUMBER }, Phone.CONTACT_ID + "=" + contactId, null, null);

            if (numberCursor.moveToFirst())
            {
                int numberColumnIndex = numberCursor.getColumnIndex(Phone.NUMBER);
                do
                {
                    String phoneNumber = numberCursor.getString(numberColumnIndex);
                    Log.d("your tag", "contact " + name + ":" + phoneNumber);
                } while (numberCursor.moveToNext());
                numberCursor.close();
            }
        } while (groupCursor.moveToNext());
        groupCursor.close();
    }

You need to specify mimetype when querying for contacts, which belong to specified group. And because single contact can have multiple phone numbers, you may need to query all of them.

EDIT: To get all groups with at least one contact with phone number you can use following query:

ContentResolver cr = getContentResolver();
Uri groupsUri = ContactsContract.Groups.CONTENT_SUMMARY_URI;
String where = "((" + ContactsContract.Groups.GROUP_VISIBLE + " = 1) AND (" 
                + ContactsContract.Groups.SUMMARY_WITH_PHONES + "!= 0))";
Cursor cursor = cr.query(groupsUri, null, where, null, null);

As for getting contacts with phone number from a specified group - I don't know simple solution.