상세 컨텐츠

본문 제목

연락처 및 이미지 공유 가능하도록 설정하기2

기능/안드로이드

by 강효재 2020. 7. 24. 14:14

본문

앞서 Manifest에 연락처 및 이미지를 공유하기를 통해 앱에 전달받을 수 있도록 세팅된 상태에서 데이터 처리법에 대해 알아보자.

 

1. 연락처(Text) - intent의 clipData안에 들어있음.

ex) ClipData clip = intent.getClipData();

    CharSequence clipText = clip.getItemAt(0).getText();


2. 연락처(vcf) - 일반 text에 비해 복잡하다. 순서대로 알아보자.

 

Uri contactUri = intent.getParcelableExtra(Intent.EXTRA_STREAM); 메소드로 내용물을 살펴보면

-> 단일 연락처 : content://com.android.contacts/contacts/as_multi_vcard/0r262-260667DB0667DB%3Acontent://com.android.contacts/contacts/as_vcard/0r262-260667DB0667DB

-> 복수 연락처 : content://com.android.contacts/contacts/as_multi_vcard/0r262-260667DB0667DB%3A2681i309254900ee0dbf3%3A

와 같이 나온다.

 

이 Uri에서 lookupKey를 뽑아내야 한다.

String[] lookupKeys = contactUri.getLastPathSegment().split(":");

contactUri.getLastPathSegment() 는 0r262-260667DB0667DB:같은 모양으로 나온다.

 

여기서 추가적인 작업을 통해 vcard의 내용을 볼 수 있다. (아래에 한 번에 정리)

vcard의 내용물의 예)

BEGIN:VCARD 
    VERSION:2.1 
    N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=EA=B0=95=EA=B0=95;;; 
    FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=EA=B0=95=EA=B0=95 
    TEL;CELL:01011111111 <-- type과 번호이다.
    END:VCARD

 

이 정보에서 손쉽게 원하는 정보를 꺼내기 위해선 Ezvcard를 이용하는 것이 좋다.

주소 : https://github.com/mangstadt/ez-vcard

 

mangstadt/ez-vcard

A vCard parser library for Java. Contribute to mangstadt/ez-vcard development by creating an account on GitHub.

github.com

예제)

Uri contactUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (contactUri != null) {
// getLastPathSegment() decodes "%3A" to ":", so split must be done on colon
String[] lookupKeys = contactUri.getLastPathSegment().split(":");
for (String lookupKey : lookupKeys) {
// Query contact with lookup key
Uri uriLookupKey = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_VCARD_URI, lookupKey);
AssetFileDescriptor fd;
String strVCard = null;
try {
fd = getContentResolver().openAssetFileDescriptor(uriLookupKey, "r");
FileInputStream fis = fd.createInputStream();
byte[] b = new byte[(int) fd.getDeclaredLength()];
fis.read(b);
strVCard = new String(b);
Log.e("Dddddd", "strVcard : " + strVCard);
if (strVCard != null && !strVCard.equals("")) {
VCard vcard = Ezvcard.parse(strVCard).first();
List<Telephone> arrTele = vcard.getTelephoneNumbers();
if (arrTele != null && arrTele.size() > 0) {
LayoutInflater li = getLayoutInflater();
View vLastSepa = null;
for (Telephone tele : arrTele) {
String strCall = "";
String strType = "";
Iterator<TelephoneType> iter = tele.getTypes().iterator();
while (iter.hasNext()) {
TelephoneType type = iter.next();
if (type == TelephoneType.CELL) {

break;
} else if (type == TelephoneType.HOME) {

break;
} else if (type == TelephoneType.WORK) {

break;
} else {

break;
}
}
strCall = tele.getText().replace("-", "");

}

} else {

}

List<Email> arrEmail = vcard.getEmails();
if (arrEmail != null && arrEmail.size() > 0) {
LayoutInflater li = getLayoutInflater();
View vLastSepa = null;

for (Email email : arrEmail) {
String strEmail = "";


Iterator<EmailType> iter = email.getTypes().iterator();
while (iter.hasNext()) {
EmailType type = iter.next();
if (type == EmailType.INTERNET)
continue;

if (type == EmailType.HOME) {

break;
} else if (type == EmailType.WORK) {

break;
} else {

break;
}
}
strEmail = email.getValue();

}

} else {

}
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


3. 이미지및 동영상 - intent의 clipData안에 contentUri형태로 들어있음. 꺼내오는 예제 아래 정리

ex)

String path = getPath(this, clip.getItemAt(i).getUri());

 

public String getPath(final Context context, final Uri uri) {

final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
// TODO handle non-primary volumes
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}

final String selection = "_id=?";
final String[] selectionArgs = new String[]{
split[1]
};

return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}

return null;
}

 

public static String getDataColumn(Context context, Uri uri, String selection,
String[] selectionArgs) {

Cursor cursor = null;
final String column = "_data";
final String[] projection = {
column
};

try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
Log.e("dddddddddddd","column_index : "+column_index);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}

 

관련글 더보기