Displaying the phone number of a contact in Android Contact Content Provider

会有一股神秘感。 提交于 2019-12-11 11:23:29

问题


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

}

回答1:


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:

<?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:

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


来源:https://stackoverflow.com/questions/29636406/displaying-the-phone-number-of-a-contact-in-android-contact-content-provider

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!