앞서 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
예제)
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;
}
안드로이드 권한 설정 및 체크하기(Android 6.0이상은 필수) (0) | 2020.07.27 |
---|---|
연락처 및 이미지 공유 가능하도록 설정하기1 (0) | 2020.07.23 |