在Android Contact Content Provider中显示联系人的电话号码 [英] Displaying the phone number of a contact in Android Contact Content Provider

查看:75
本文介绍了在Android Contact Content Provider中显示联系人的电话号码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个程序,该程序将在android中显示联系人的ID,姓名和电话号码.到目前为止,已显示联系人的ID和姓名,但没有显示联系人的号码.有人可以帮我吗,下面是我程序的代码:

i am trying to write a program that would display the id, name and phone number of a contact in android. So far the Id and Names of the contact are displayed but the number of the contact doesn't. Can someone help me, below is the code for my program:

package com.example.oghenekaroedoh.provider;

import android.app.ListActivity;
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.CursorAdapter;
import android.widget.SimpleCursorAdapter;

public class Provider2Activity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_provider);

        Uri allContacts = ContactsContract.Contacts.CONTENT_URI;

        //query string for our contacts
        //Uri allContacts = Uri.parse("content://contacts/people");

        //declare our cursor
        Cursor c;

        String[] projection = new String[]
                {ContactsContract.Contacts._ID,
                        ContactsContract.Contacts.DISPLAY_NAME,
                        ContactsContract.Contacts.HAS_PHONE_NUMBER};

        //---detect the android version
        //---Projection, Filtering, and sorting
        /* >>The second parameter of the managedQuery() method (third parameter for the CursorLoader class)
            controls how many columns are returned by the query; this parameter is known as the projection
           >>The third parameter of the managedQuery() method (fourth parameter for the CursorLoader class)
           enable you to specify a SQL WHERE clause to filter the result of the query
           >>The fourth parameter of the managedQuery() method (the fifth parameter for the CursorLoader class)
           enables you to specify a SQL ORDER BY clause to sort the result of the query, either in ascending or descending order
        * */
        if (android.os.Build.VERSION.SDK_INT <11) {
            //---if the device ids running on OS before Honeycomb
            //use the managedQuery() of the Activity class to retrieve a managed cursor
            c = managedQuery(allContacts, projection, null, null, null);

        }
        else {
            //---Honeycomb and later use the cursor loader class to retrieve managed cursor---
            CursorLoader cursorLoader = new CursorLoader(
                    this,
                    allContacts,
                    projection,
                    null,
                    null ,
                    null);
            c = cursorLoader.loadInBackground();
        }

        //create columns for the contacts display name and the column
        String[] columns = new String[] {
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts._ID};

        int[] views = new int[] {R.id.contactName, R.id.contactID};

        SimpleCursorAdapter adapter;

        //detect the android version again..s
        if (android.os.Build.VERSION.SDK_INT <11) {
            //---if it is before Honeycomb---
            //use the SimpleCursorAdapter class to map the cursor to a view (like textViews imageViews e.t.c)
            adapter = new SimpleCursorAdapter(
                    this, R.layout.activity_provider, c, columns, views);
        }
        else {
            //---Honeycomb and later---
            ////use the SimpleCursorAdapter class to map the cursor to a view (like textViews imageViews e.t.c)
            //with an extra parameter known as CursorAdapter.FLAG_REGISTER_CURRENT_OBSERVER
            adapter = new SimpleCursorAdapter(
                    this, R.layout.activity_provider, c, columns, views,
                    CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
        }

        this.setListAdapter(adapter);
        PrintContacts(c);
    }

    private void PrintContacts(Cursor c)
    {
        //---display the contact id and name and phone number----
        if (c.moveToFirst()) {
            do{
                //---get the contact id and name
                String contactID = c.getString(c.getColumnIndex(
                        ContactsContract.Contacts._ID));
                String contactDisplayName =
                        c.getString(c.getColumnIndex(
                                ContactsContract.Contacts.DISPLAY_NAME));
                Log.v("Content Providers", contactID + ", " +
                        contactDisplayName);

                //---get phone number---
                int hasPhone =
                        c.getInt(c.getColumnIndex(
                                ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (hasPhone == 1) {
                    Cursor phoneCursor =
                            getContentResolver().query(
                                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " +
                            contactID, null, null);
                    while (phoneCursor.moveToNext()) {
                        Log.v("Content Providers",
                                phoneCursor.getString(
                                        phoneCursor.getColumnIndex(
                                                ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    }
                    phoneCursor.close();
                }

            } while (c.moveToNext());
        }
    }

}

推荐答案

我通过添加扩展了ArrayAdapter的CustomAdapter MyClassAdapter并填充了Contact个对象的ArrayList来使您的示例工作.

I got your example working by adding a CustomAdapter MyClassAdapter which extends ArrayAdapter, and populating an ArrayList of Contact objects.

import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class Provider2Activity extends ListActivity {

    ArrayList<Contact> contacts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_provider2);

        contacts = new ArrayList<Contact>();

        Uri allContacts = ContactsContract.Contacts.CONTENT_URI;

        //declare our cursor
        Cursor c;

        String[] projection = new String[]
                {ContactsContract.Contacts._ID,
                        ContactsContract.Contacts.DISPLAY_NAME,
                        ContactsContract.Contacts.HAS_PHONE_NUMBER};


        /* >>The second parameter of the managedQuery() method (third parameter for the CursorLoader class)
            controls how many columns are returned by the query; this parameter is known as the projection
           >>The third parameter of the managedQuery() method (fourth parameter for the CursorLoader class)
           enable you to specify a SQL WHERE clause to filter the result of the query
           >>The fourth parameter of the managedQuery() method (the fifth parameter for the CursorLoader class)
           enables you to specify a SQL ORDER BY clause to sort the result of the query, either in ascending or descending order
        * */
        if (android.os.Build.VERSION.SDK_INT <11) {
            //---if the device ids running on OS before Honeycomb
            //use the managedQuery() of the Activity class to retrieve a managed cursor
            c = managedQuery(allContacts, projection, null, null, null);

        }
        else {
            //---Honeycomb and later use the cursor loader class to retrieve managed cursor---
            CursorLoader cursorLoader = new CursorLoader(
                    this,
                    allContacts,
                    projection,
                    null,
                    null ,
                    null);
            c = cursorLoader.loadInBackground();
        }

        PrintContacts(c);

        MyClassAdapter adapter;


        //detect the android version again..
        if (android.os.Build.VERSION.SDK_INT <11) {
            //---if it is before Honeycomb---

            adapter = new MyClassAdapter(
                    this, R.layout.row_line, contacts);
        }
        else {
            //---Honeycomb and later---

            adapter = new MyClassAdapter(
                    this, R.layout.row_line, contacts);
        }

        this.setListAdapter(adapter);

    }

    private void PrintContacts(Cursor c)
    {
        ContentResolver cr = getContentResolver();
        //---display the contact id and name and phone number----
        if (c.moveToFirst()) {
            do{
                //---get the contact id and name
                String contactID = c.getString(c.getColumnIndex(
                        ContactsContract.Contacts._ID));
                String contactDisplayName =
                        c.getString(c.getColumnIndex(
                                ContactsContract.Contacts.DISPLAY_NAME));
                Log.v("Content Providers", contactID + ", " +
                        contactDisplayName);

                String contactDisplayPhone = "";
                    //---get phone number---
                int hasPhone =
                        c.getInt(c.getColumnIndex(
                                ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (hasPhone == 1) {
                    Cursor phoneCursor =
                            getContentResolver().query(
                                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " +
                                            contactID, null, null);
                    while (phoneCursor.moveToNext()) {
                        Log.v("Content Providers",
                                contactDisplayPhone = phoneCursor.getString(
                                        phoneCursor.getColumnIndex(
                                                ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    }
                    phoneCursor.close();

                }
                contacts.add(new Contact(contactDisplayName, contactID, contactDisplayPhone));

            } while (c.moveToNext());
        }
    }

    public class Contact{
        public String contactName = "";
        public String contactID = "";
        public String contactNumber = "";
        public Contact(String name, String id, String number){

            contactName = name;
            contactID = id;
            contactNumber = number;
        }
    }

    public class MyClassAdapter extends ArrayAdapter<Contact> {

        private class ViewHolder {
            private TextView name;
            private TextView id;
            private TextView number;
        }

        public MyClassAdapter(Context context, int textViewResourceId, ArrayList<Contact> items) {
            super(context, textViewResourceId, items);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = LayoutInflater.from(this.getContext())
                        .inflate(R.layout.row_line, parent, false);

                viewHolder = new ViewHolder();
                viewHolder.name = (TextView) convertView.findViewById(R.id.contactName);
                viewHolder.id = (TextView) convertView.findViewById(R.id.contactID);
                viewHolder.number = (TextView) convertView.findViewById(R.id.contactNumber);

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            Contact item = getItem(position);
            if (item!= null) {
                viewHolder.name.setText(item.contactName);
                viewHolder.id.setText(item.contactID);
                viewHolder.number.setText(item.contactNumber);
            }

            return convertView;
        }
    }

}

row_line.xml:

row_line.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView android:id="@+id/contactName"
        android:textSize="16sp"
        android:textStyle="bold"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView android:id="@+id/contactID"
        android:textSize="16sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView android:id="@+id/contactNumber"
        android:textSize="16sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

activity_provider2.xml:

activity_provider2.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".Provider2Activity">

    <ListView

        android:id="@android:id/list"

        android:layout_height="wrap_content"

        android:layout_width="match_parent">

    </ListView>

</RelativeLayout>

这篇关于在Android Contact Content Provider中显示联系人的电话号码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆