Android/Java

안드로이드 주소록으로 내보내기

easy-1 2021. 6. 10. 16:38

<개요>

앱에서 원하는 연락처 정보를 내 디바이스 주소록으로 내보내기


<적용 방법>

1. 주소록 접근권한을 허용

   AndroidManifest.xml 에 주소록 접근 권한 추가 (쓰기 권한 필요)

<uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 주소록 읽기 -->
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> <!-- 주소록 쓰기 -->

2. ContentProviderOperation.newInsert 를 사용하여 리스트에 내보낼 데이터를 추가시킴

3. 리스트에 담긴 데이터를 applyBatch 시점에 ArrayList 형태로 넘겨줌

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

/**
 * 주소록으로 내보내는 정보
 */
try {

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


    // 이름
    list.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.DISPLAY_NAME, "name") // 저장할 이름
            .build());
    // 휴대폰 번호
    list.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, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) // 번호타입(Type_Mobile : 모바일)
            .build());
    // 회사 전화번호
    list.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, "companyNumber") // 전화번호
            .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_WORK) // 번호타입(TYPE_WORK : 직장)
            .build());
    // 이메일
    list.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Email.DATA, "email@example.com") // 이메일
            .build());

    // 사진
    if (cachedImage != null) { // cachedImage : Bitmap
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        cachedImage.compress(Bitmap.CompressFormat.JPEG, 100, out);

        byte[] byteArray = out.toByteArray();

        list.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Photo.DATA15, byteArray)
                .build());

    }

    context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, list);

    list.clear(); // 리스트 초기화

} catch (RemoteException e) {
    Dlog.d("RemoteException :: " + e);
} catch (OperationApplicationException e) {
    Dlog.d("OperationApplicationException :: " + e);
} catch (Exception e) {
    Dlog.d("Exception :: " + e);
}