728x90

연락처(Contacts) ContactHelper Class  메소드를 세부적으로 추가했다.

첨부된 파일의 소스는 한명의 데이터가 분리되어 표기되기 때문에 실제 연락처 소스로 활용하기에는 부족하다. 테스트 용도로는 매우 좋다.

Cursor 쿼리 중심으로 이해하기 쉽게 코드를 수정 보완해서 작성했다.

SQLiteHelper 에서 사용하는 Cursor 와는 개념은 비슷한데 약간 다르다.

아래 코드 중에서 100% 완료 상태가 아닌 테스트 중인 것을 그대로 올린 것도 있으므로 필요하신 분은 수정해서 사용하면 될 것으로 본다.

구글링을 하고 본인의 생각을 담아서 코드를 추가하면 유용하게 사용할 수 있는 좋은 자료라고 본다.


import java.util.ArrayList;

import android.content.ContentProviderOperation;
import android.content.ContentResolver;
import android.content.Context;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.PhoneLookup;
import android.provider.ContactsContract.RawContacts;
import android.widget.Toast;

public class ContactHelper {

    // Display Name 이 포함된 모든 Cursor 반환
    public static Cursor getContactCursorFromDisplayNameLIKE(ContentResolver contactHelper, String display_name) {

        // 검색할 칼럼 정하기, null 이면 모든 필드
        String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER };
        // Cursor를 얻기 위한 쿼리 조건
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like \'%" + display_name + "%\'";
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;

        try {
            if (display_name != null && !display_name.equals("")) {
                cursor = contactHelper.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, where, null,
                        sortOrder);
            } else {
                cursor = contactHelper.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null,
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
            }
            cursor.moveToFirst();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return cursor;
    }

    // Display Name 으로 모든 Cursor 반환
    public static Cursor getContactCursorFromDisplayName(ContentResolver contactHelper, String display_name) {

        // 검색할 칼럼 정하기, null 이면 모든 필드
        String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER };
        // Cursor를 얻기 위한 쿼리 조건
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ='" + display_name + "'";
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;

        try {
            if (display_name != null && !display_name.equals("")) {
                cursor = contactHelper.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, where, null,
                        sortOrder);
            }
            cursor.moveToFirst();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return cursor;
    }

    public static Cursor getDisplayNameFromNumber(ContentResolver contactHelper, String number) {

        // 참조 https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html
        // Android 2.0 and later
        Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

        // 검색할 칼럼 정하기, null 이면 모든 필드
        String[] projection = { PhoneLookup._ID, PhoneLookup.DISPLAY_NAME, PhoneLookup.NUMBER };

        Cursor cursor = null;

        try {
            if (number != null && !number.equals("")) {
                cursor = contactHelper.query(contactUri, projection, null, null, null);
                if (cursor.getCount() > 0) {
                    while (cursor.moveToNext()) {
                        long rawContactId = cursor.getLong(cursor.getColumnIndex(PhoneLookup._ID));
                        System.out.println("Contact ID from number : " + rawContactId);
                        System.out.println("Contact DISPLAY_NAME : "
                                + cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME)));
                        System.out.println("Contact NUMBER : " + cursor.getString(cursor.getColumnIndex(PhoneLookup.NUMBER)));
                    }
                    return cursor;
                }

            } else {
                System.out.println("전화번호 검색어가 입력되지 않았습니다 ");
            }

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

    private static long getContactIDFromName(ContentResolver contactHelper, String display_name) {
        Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

        String[] projection = { ContactsContract.Contacts._ID };
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = '" + display_name + "'";
        String[] whereParams = null; // new String[] {display_name};
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;

        try {
            cursor = contactHelper.query(contactUri, null, where, whereParams, sortOrder);

            if (cursor.moveToFirst()) {
                System.out.println("ContactID from display_name : "
                        + cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
                return cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
                cursor = null;
            }
        }

        return -1;
    }

    // 전화번호에서 ContactID 획득
    private static long getContactIDFromNumber(ContentResolver contactHelper, String number) {
        Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

        String[] projection = { PhoneLookup._ID };
        Cursor cursor = null;

        try {
            cursor = contactHelper.query(contactUri, projection, null, null, null);

            if (cursor.moveToFirst()) {
                System.out.println("ContactID from number : " + cursor.getLong(cursor.getColumnIndex(PhoneLookup._ID)));
                return cursor.getLong(cursor.getColumnIndex(PhoneLookup._ID));
            }

            return -1;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
                cursor = null;
            }
        }

        return -1;
    }

    // 연락처 추가 (이름 + 전화번호), 기존 개발자 구현 완료사항
    public static boolean insertContact(ContentResolver contactHelper, String firstName, String mobileNumber) {

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());

        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, firstName).build());

        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, mobileNumber)
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_MOBILE).build());

        try {
            // 연락처 제공자는 applyBatch()에서의 모든 작업을 하나의 트랜잭션으로서 수행
            contactHelper.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (Exception e) {
            return false;
        }

        return true;
    }

    // 구한 ID 기준으로 연락처 삭제
    // 성명 검색으로 구한 ContactID는 삭제가 안되고, Phone Number 로 구한 ContactID는 삭제가 정상처리됨
    public static void deleteContactFromgetContactID(ContentResolver contactHelper, long getContactId) {
        System.out.println("Contact ID : " + getContactId);
        String where = RawContacts.CONTACT_ID + " = " + getContactId;
        contactHelper.delete(RawContacts.CONTENT_URI, where, null);
    }

    // 전화번호 기준으로 연락처 삭제 (구현 완료)
    public static void deleteContactFromNumber(ContentResolver contactHelper, String number) {

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        String[] WhereArgs = new String[] { String.valueOf(getContactIDFromNumber(contactHelper, number)) };

        ops.add(ContentProviderOperation.newDelete(RawContacts.CONTENT_URI)
                .withSelection(RawContacts.CONTACT_ID + "=?", WhereArgs).build());
        try {
            contactHelper.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            e.printStackTrace();
        }
    }

    // 성명 기준으로 동일한 성명을 가진 모든 연락처 삭제 (구현 완료)
    public static void deleteAllContactFromName(ContentResolver contactHelper, String display_name) {
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = '" + display_name + "'";
        contactHelper.delete(RawContacts.CONTENT_URI, where, null);
    }

    // 성명 기준으로 동일한 성명을 가진 모든 연락처 삭제 -- 진행중
    public static void deleteAllContactFromName2(ContentResolver contactHelper, String display_name) {

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
       
        Cursor cursor = null;
        cursor = getContactCursorFromDisplayName(contactHelper, display_name);
        if (cursor != null && cursor.getCount() > 0) {
            cursor.moveToFirst();
            while (cursor.moveToNext()) {
                String number = cursor.getString(2); // 전화번호 구하기
                // 전화번호 기준으로 ContactID 구하기
                System.out.println("Contact Phone Number : " + number);
                long rawContactId = getContactIDFromNumber(contactHelper, number);
                if (rawContactId > 0) {
                    String where = RawContacts.CONTACT_ID + "=" + rawContactId;
                    //contactHelper.delete(RawContacts.CONTENT_URI, where, null);
                   
                    ops.add(ContentProviderOperation.newDelete(RawContacts.CONTENT_URI)
                            .withSelection(where, null).build());
                    try {
                        contactHelper.applyBatch(ContactsContract.AUTHORITY, ops);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    } catch (OperationApplicationException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }

    // 성명 포함 연락처 삭제 (구현 완료)
    public static void deleteContactFromNameLIKE(ContentResolver contactHelper, String display_name) {
        System.out.println("Contact Name Search : " + display_name);
        Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.NUMBER }; // 검색할 칼럼 정하기
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like \'%" + display_name + "%\'";
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;
        try {
            if (display_name != null && !display_name.equals("")) {
                cursor = contactHelper.query(contactUri, projection, where, null, sortOrder);
                if (cursor.getCount() > 0) {
                    // cursor.moveToFirst();
                    while (cursor.moveToNext()) {
                        long rawContactId = cursor.getLong(cursor.getColumnIndex(Phone._ID));
                        System.out.println("Contact ID from number : " + rawContactId);
                        String phoneNO = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
                        System.out.println("Contact Phone Number : " + phoneNO);
                        deleteContactFromNumber(contactHelper, phoneNO);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 성명 + 전화번호 기준으로 ContactId 구하기 -- 구현중
    public static long getContactIdFromNameAndNumber(ContentResolver contactHelper, String display_name, String number) {
        long rawContactId;
        // 먼저 이름기준으로 Cursor 를 구한 다음에 폰 번호 기준 ID 구한다.
        Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.NUMBER }; // 검색할칼럼 정하기
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = '" + display_name + "'";
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;
        try {
            if (display_name != null && !display_name.equals("") && number != null && !number.equals("")) {
                cursor = contactHelper.query(contactUri, projection, where, null, sortOrder);
                if (cursor.getCount() > 0) {
                    while (cursor.moveToNext()) {
                        long getContactId = cursor.getLong(cursor.getColumnIndex(Phone._ID));
                        System.out.println("Contact ID from number : " + getContactId);
                        String phoneNO = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
                        System.out.println("Contact Phone Number : " + phoneNO);
                        rawContactId = getContactIDFromName(contactHelper, phoneNO);
                        System.out.println("Contact ID from Phone Number : " + rawContactId);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1;
    }

    // 성명 + 전화번호 기준으로 연락처 삭제 (동명이인 고려) -- 진행중
    public static void deleteContactFromNameAndNumber(ContentResolver contactHelper, Context context, String display_name,
            String number) {
        // 로직 개념 : 이름 검색으로 전화번호를 구한 다음에, 전화번호 기준으로 ContactID 를 구하는 순서로 로직 구현
        number = number.replaceAll("[^0-9]", ""); // 숫자만 추출
        // 이름 + 전화번호 조건으로 처리하는 로직이 없는 듯....
        // String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME +
        // " = '" + display_name + "' AND "
        // + ContactsContract.CommonDataKinds.Phone.NUMBER + " = '" + number +
        // "' AND "
        // + ContactsContract.CommonDataKinds.Phone.TYPE + "=" +
        // ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE + "";
        Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, ContactsContract.CommonDataKinds.Phone.NUMBER }; // 검색할 칼럼 정하기
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = '" + display_name + "'";
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;
        try {
            if (display_name != null && !display_name.equals("") && number != null && !number.equals("")) {
                cursor = contactHelper.query(contactUri, projection, where, null, sortOrder);
                if (cursor.getCount() > 0) {
                    // cursor.moveToFirst();
                    while (cursor.moveToNext()) {
                        long getContactId = cursor.getLong(cursor.getColumnIndex(Phone._ID));
                        String phoneNO = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
                        System.out.println("Contact Phone Number : " + phoneNO);
                        long rawContactId = getContactIDFromNumber(contactHelper, phoneNO);
                        System.out.println("Contact ID from Number : " + rawContactId);
                        deleteContactFromNumber(contactHelper, phoneNO);
                        Toast.makeText(context, "getIDFromName : " + getContactId + " getIDFromNumber : " + rawContactId,
                                Toast.LENGTH_LONG).show();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 모든 연락처 삭제(구현완료)
    public static void deleteAllContact(ContentResolver contactHelper) {
        contactHelper.delete(RawContacts.CONTENT_URI, null, null);
    }

}



MainActivity.java 에서 사용법 예제

예제라고 할 순 없고 테스트 중인 것을 적었다.

public class MainActivity extends ListActivity {

    private ArrayList<String> contactID;
    private ArrayList<String> contactNames;
    private ArrayList<String> contactNumbers;
    ArrayAdapter<String> adapter;
    private Cursor cursor;

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

        Button btn_Test1 = (Button) findViewById(R.id.btn_CustomDelete1);
        Button btn_Test2 = (Button) findViewById(R.id.btn_CustomDelete2);

        contactID = new ArrayList<String>();
        contactNames = new ArrayList<String>();
        contactNumbers = new ArrayList<String>();

        cursor = ContactHelper.getContactCursorFromDisplayNameLIKE(getContentResolver(), "");
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            contactID.add(cursor.getString(0));
            contactNames.add(cursor.getString(1));
            contactNumbers.add(cursor.getString(2));
            cursor.moveToNext();
        }

        adapter = new MyAdapter(this, android.R.layout.simple_list_item_1, R.id.tvNameMain, contactNames);
        setListAdapter(adapter);

        // 추가 테스트
        // Cursor cursor1 =
        // ContactHelper.getDisplayNameFromNumber(getContentResolver(), "010-1234-0401");
        // System.out.println("Contact Cursor Return !!");
        // if (cursor1 != null) {
        // cursor1.moveToFirst();
        // while (!cursor1.isAfterLast()) {
        // System.out.println("ContactId =" + cursor1.getString(0) + " 성명: " +
        // cursor1.getString(1) + " 휴대폰번호:"
        // + cursor1.getString(2));
        // cursor1.moveToNext();
        // }
        // }

        btn_Test1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 성명 포함 삭제 테스트
                // 이름 검색으로 구한 ContactID 로는 삭제가 안되나, Number 로 구한 ContactID로는 삭제가
                // 됨
                // ContactHelper.deleteContactFromNameLIKE(getContentResolver(),
                // "개발");
                // ContactHelper.deleteContactFromgetContactID(getContentResolver(),53360);
                ContactHelper.deleteContactFromgetContactID(getContentResolver(), 10674);
                adapter.notifyDataSetChanged();
                // 현재 Activity 갱신처리
                finish();
                startActivity(getIntent());
            }
        });

        btn_Test2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // 전화번호 삭제 테스트
                        // ContactHelper.deleteContactFromNameAndNumber(getContentResolver(), MainActivity.this, "테스트", "010-1212-7710");
                        ContactHelper.deleteAllContactFromName(getContentResolver(), "개발자");
                    }
                });

                // 현재 Activity 갱신처리
                finish();
                startActivity(getIntent());

            }
        });

    }

    private class MyAdapter extends ArrayAdapter<String> {

        public MyAdapter(Context context, int resource, int textViewResourceId, ArrayList<String> conNames) {
            super(context, resource, textViewResourceId, conNames);

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View row = setList(position, parent);
            return row;
        }

        private View setList(int position, ViewGroup parent) {
            LayoutInflater inf = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View row = inf.inflate(R.layout.liststyle, parent, false);

            TextView tvID = (TextView) row.findViewById(R.id.tvContactID);
            TextView tvName = (TextView) row.findViewById(R.id.tvNameMain);
            TextView tvNumber = (TextView) row.findViewById(R.id.tvNumberMain);

            Button btn_Add = (Button) row.findViewById(R.id.btn_AddContact);
            Button btn_Del = (Button) row.findViewById(R.id.btn_deleteContact);

            tvID.setText("ContactID : " + contactID.get(position));
            tvName.setText(contactNames.get(position));
            tvNumber.setText("No: " + contactNumbers.get(position));

            btn_Add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this, AddContact.class);
                    startActivity(intent);
                }
            });

            btn_Del.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this, DeleteContacts.class);
                    startActivity(intent);
                }
            });

            return row;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater imf = getMenuInflater();
        imf.inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.item1) {
            Intent intent = new Intent(MainActivity.this, AddContact.class);
            startActivity(intent);
        } else if (item.getItemId() == R.id.item2) {
            Intent intent = new Intent(MainActivity.this, DeleteContacts.class);
            startActivity(intent);
        }
        return super.onOptionsItemSelected(item);
    }
}
 


테스트에 사용한 파일

본 파일은 구글링으로 구한 파일을 가지고 이해하기 쉽게 코드를 상당히 수정하고, 연락처 삭제 중심으로 코드를 추가 구현했다.

테스트 환경 : Eclipse

안드로이드 스튜디오에서 테스트하려면 코드가 복잡한 것이 없으므로 변환하면 될 것으로 본다.

Android-Contacts.zip


Android Studio 버전으로 수정한 코드는 http://link2me.tistory.com/1305 에 올려져 있다.

보완해서 테스트 하고 있는 중이라 약간 더 코드가 수정되었다.

블로그 이미지

Link2Me

,