Импортировать контакты с телефона в список в моем приложении на Android

В своем приложении я хотел, чтобы пользователь мог отображать контакты со своего телефона. Я использовал этот пример, чтобы открыть контакты моего телефона из приложения. . Но теперь я хочу сделать список контактов в своем приложении, скопировав все контакты с телефона. Как лучше всего это сделать?

ИЗМЕНИТЬ:

Я уже знаю, как отображать контакты, но я не знаю, как сохранить их в sqlite db. Я новичок, поэтому любая помощь приветствуется.


person Banana    schedule 17.12.2015    source источник


Ответы (2)


Попробуйте этот пример. Работал для меня.

Прежде всего, вам нужно установить разрешение в файле mainifest. Ваш файл Mainifest должен выглядеть примерно так.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="in.wptrafficanalzer.listviewcontacts"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="5"
    android:targetSdkVersion="15" />

<uses-permission 
    android:name="android.permission.READ_CONTACTS" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

after you are done with this you need to create Two XML Files in your layout folder.

Activity_main.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" >

<ListView
    android:id="@+id/lst_contacts"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />

</RelativeLayout>

lv_layout.xml

<?xml version="1.0" encoding="utf-8"?>

<TextView 
    android:id="@+id/tv_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"        
    android:textSize="20dp"   
    android:textStyle="bold" />

<ImageView 
    android:id="@+id/iv_photo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/tv_name"
    android:layout_centerHorizontal="true"
    android:padding="5dp" />

<TextView 
    android:id="@+id/tv_details"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/iv_photo"        
      />

</RelativeLayout>

after creating the layout files your MainActivity class will look something like this.

MainActivity.Java

public class MainActivity extends Activity {

SimpleCursorAdapter mAdapter;
MatrixCursor mMatrixCursor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // The contacts from the contacts content provider is stored in this
    // cursor
    mMatrixCursor = new MatrixCursor(new String[] { "_id", "name", "photo",
            "details" });

    // Adapter to set data in the listview
    mAdapter = new SimpleCursorAdapter(getBaseContext(),
            R.layout.lv_layout, null, new String[] { "name", "photo",
                    "details" }, new int[] { R.id.tv_name, R.id.iv_photo,
                    R.id.tv_details }, 0);

    // Getting reference to listview
    ListView lstContacts = (ListView) findViewById(R.id.lst_contacts);

    // Setting the adapter to listview
    lstContacts.setAdapter(mAdapter);

    // Creating an AsyncTask object to retrieve and load listview with
    // contacts
    ListViewContactsLoader listViewContactsLoader = new ListViewContactsLoader();

    // Starting the AsyncTask process to retrieve and load listview with
    // contacts
    listViewContactsLoader.execute();

}

/** An AsyncTask class to retrieve and load listview with contacts */
private class ListViewContactsLoader extends AsyncTask<Void, Void, Cursor> {

    @Override
    protected Cursor doInBackground(Void... params) {
        Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;

        // Querying the table ContactsContract.Contacts to retrieve all the
        // contacts
        Cursor contactsCursor = getContentResolver().query(contactsUri,
                null, null, null,
                ContactsContract.Contacts.DISPLAY_NAME + " ASC ");

        if (contactsCursor.moveToFirst()) {
            do {
                long contactId = contactsCursor.getLong(contactsCursor
                        .getColumnIndex("_ID"));

                Uri dataUri = ContactsContract.Data.CONTENT_URI;

                // Querying the table ContactsContract.Data to retrieve
                // individual items like
                // home phone, mobile phone, work email etc corresponding to
                // each contact
                Cursor dataCursor = getContentResolver().query(dataUri,
                        null,
                        ContactsContract.Data.CONTACT_ID + "=" + contactId,
                        null, null);

                String displayName = "";
                String nickName = "";
                String homePhone = "";
                String mobilePhone = "";
                String workPhone = "";
                String photoPath = "" + R.drawable.blank;
                byte[] photoByte = null;
                String homeEmail = "";
                String workEmail = "";
                String companyName = "";
                String title = "";

                if (dataCursor.moveToFirst()) {
                    // Getting Display Name
                    displayName = dataCursor
                            .getString(dataCursor
                                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
                    do {

                        // Getting NickName
                        if (dataCursor
                                .getString(
                                        dataCursor
                                                .getColumnIndex("mimetype"))
                                .equals(ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE))
                            nickName = dataCursor.getString(dataCursor
                                    .getColumnIndex("data1"));

                        // Getting Phone numbers
                        if (dataCursor
                                .getString(
                                        dataCursor
                                                .getColumnIndex("mimetype"))
                                .equals(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)) {
                            switch (dataCursor.getInt(dataCursor
                                    .getColumnIndex("data2"))) {
                            case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
                                homePhone = dataCursor.getString(dataCursor
                                        .getColumnIndex("data1"));
                                break;
                            case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
                                mobilePhone = dataCursor
                                        .getString(dataCursor
                                                .getColumnIndex("data1"));
                                break;
                            case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
                                workPhone = dataCursor.getString(dataCursor
                                        .getColumnIndex("data1"));
                                break;
                            }
                        }

                        // Getting EMails
                        if (dataCursor
                                .getString(
                                        dataCursor
                                                .getColumnIndex("mimetype"))
                                .equals(ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)) {
                            switch (dataCursor.getInt(dataCursor
                                    .getColumnIndex("data2"))) {
                            case ContactsContract.CommonDataKinds.Email.TYPE_HOME:
                                homeEmail = dataCursor.getString(dataCursor
                                        .getColumnIndex("data1"));
                                break;
                            case ContactsContract.CommonDataKinds.Email.TYPE_WORK:
                                workEmail = dataCursor.getString(dataCursor
                                        .getColumnIndex("data1"));
                                break;
                            }
                        }

                        // Getting Organization details
                        if (dataCursor
                                .getString(
                                        dataCursor
                                                .getColumnIndex("mimetype"))
                                .equals(ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)) {
                            companyName = dataCursor.getString(dataCursor
                                    .getColumnIndex("data1"));
                            title = dataCursor.getString(dataCursor
                                    .getColumnIndex("data4"));
                        }

                        // Getting Photo
                        if (dataCursor
                                .getString(
                                        dataCursor
                                                .getColumnIndex("mimetype"))
                                .equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)) {
                            photoByte = dataCursor.getBlob(dataCursor
                                    .getColumnIndex("data15"));

                            if (photoByte != null) {
                                Bitmap bitmap = BitmapFactory
                                        .decodeByteArray(photoByte, 0,
                                                photoByte.length);

                                // Getting Caching directory
                                File cacheDirectory = getBaseContext()
                                        .getCacheDir();

                                // Temporary file to store the contact image
                                File tmpFile = new File(
                                        cacheDirectory.getPath() + "/wpta_"
                                                + contactId + ".png");

                                // The FileOutputStream to the temporary
                                // file
                                try {
                                    FileOutputStream fOutStream = new FileOutputStream(
                                            tmpFile);

                                    // Writing the bitmap to the temporary
                                    // file as png file
                                    bitmap.compress(
                                            Bitmap.CompressFormat.PNG, 100,
                                            fOutStream);

                                    // Flush the FileOutputStream
                                    fOutStream.flush();

                                    // Close the FileOutputStream
                                    fOutStream.close();

                                } catch (Exception e) {
                                    e.printStackTrace();
                                }

                                photoPath = tmpFile.getPath();
                            }

                        }

                    } while (dataCursor.moveToNext());

                    String details = "";

                    // Concatenating various information to single string
                    if (homePhone != null && !homePhone.equals(""))
                        details = "HomePhone : " + homePhone + "\n";
                    if (mobilePhone != null && !mobilePhone.equals(""))
                        details += "MobilePhone : " + mobilePhone + "\n";
                    if (workPhone != null && !workPhone.equals(""))
                        details += "WorkPhone : " + workPhone + "\n";
                    if (nickName != null && !nickName.equals(""))
                        details += "NickName : " + nickName + "\n";
                    if (homeEmail != null && !homeEmail.equals(""))
                        details += "HomeEmail : " + homeEmail + "\n";
                    if (workEmail != null && !workEmail.equals(""))
                        details += "WorkEmail : " + workEmail + "\n";
                    if (companyName != null && !companyName.equals(""))
                        details += "CompanyName : " + companyName + "\n";
                    if (title != null && !title.equals(""))
                        details += "Title : " + title + "\n";

                    // Adding id, display name, path to photo and other
                    // details to cursor
                    mMatrixCursor.addRow(new Object[] {
                            Long.toString(contactId), displayName,
                            photoPath, details });
                }

            } while (contactsCursor.moveToNext());
        }
        return mMatrixCursor;
    }

    @Override
    protected void onPostExecute(Cursor result) {
        // Setting the cursor containing contacts to listview
        mAdapter.swapCursor(result);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
}
person Umer Kiani    schedule 17.12.2015
comment
Спасибо, Умер, это сработало для меня. Он открывает красивый список со всеми моими контактами. Однако открытие списка происходит немного медленнее. Любые советы по ускорению :) - person Banana; 17.12.2015
comment
@Kemo Добро пожаловать в любое время. Да, в этом коде много улучшений производительности, я просто быстро отправил его вам, чтобы он решил вашу проблему :) Вскоре я дам вам оптимизированный код, чтобы быстро с ним справиться :) - person Umer Kiani; 17.12.2015

Вы можете сделать это следующим образом:

Добавить Функция:

private List<Person> getContactList(){
        ArrayList<Person> contactList = new ArrayList<Person>();

        Uri contactUri = ContactsContract.Contacts.CONTENT_URI;
        String[] PROJECTION = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.HAS_PHONE_NUMBER,
        };
        String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'";
        Cursor contacts = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, PROJECTION, SELECTION, null, null);


        if (contacts.getCount() > 0)
        {
            while(contacts.moveToNext()) {
                Person aContact = new Person();
                int idFieldColumnIndex = 0;
                int nameFieldColumnIndex = 0;
                int numberFieldColumnIndex = 0;

                String contactId = contacts.getString(contacts.getColumnIndex(ContactsContract.Contacts._ID));

                nameFieldColumnIndex = contacts.getColumnIndex(PhoneLookup.DISPLAY_NAME);
                if (nameFieldColumnIndex > -1)
                {
                    aContact.setName(contacts.getString(nameFieldColumnIndex));
                }

                PROJECTION = new String[] {Phone.NUMBER};
                final Cursor phone = managedQuery(Phone.CONTENT_URI, PROJECTION, Data.CONTACT_ID + "=?", new String[]{String.valueOf(contactId)}, null);
                if(phone.moveToFirst()) {
                    while(!phone.isAfterLast())
                    {
                        numberFieldColumnIndex = phone.getColumnIndex(Phone.NUMBER);
                        if (numberFieldColumnIndex > -1)
                        {
                            aContact.setPhoneNum(phone.getString(numberFieldColumnIndex));
                            phone.moveToNext();
                            TelephonyManager mTelephonyMgr;
                            mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                            if (!mTelephonyMgr.getLine1Number().contains(aContact.getPhoneNum()))
                            {
                                contactList.add(aContact);  
                            }
                        }
                    }
                }
                phone.close();
            }

            contacts.close();
        }

        return contactList;
    }

Person.java :

public class Person {
    String myName = "";
    String myNumber = "";

    public String getName() {
        return myName;
    }

    public void setName(String name) {
        myName = name;
    }

    public String getPhoneNum() {
        return myNumber;
    }

    public void setPhoneNum(String number) {
        myNumber = number;
    }
}

Надеюсь, что это поможет вам.

person Hiren Patel    schedule 17.12.2015
comment
Большое спасибо за ваш ответ, я только что попробовал решение Умера, и оно сработало. Я тоже попробую этот, он кажется еще более компактным. Еще раз спасибо - person Banana; 17.12.2015
comment
@Кемо, добро пожаловать. :) - person Hiren Patel; 17.12.2015