2011-09-25 5 views
9

나는 이미 폼에있는 일부 데이터로 안드로이드 네이티브 "연락처 추가 또는 편집"활동을 시작하려고합니다. 현재 사용중인 코드입니다.인 텐트를 통해 이름과 성을 가진 연락처를 추가하는 방법

Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 

intent.putExtra(Insert.NAME, "A name"); 
intent.putExtra(Insert.PHONE, "123456789"); 
startActivity(intent); 

제 이름은 성을 지정하고 싶습니다. 거기에 필요한 모든 필드에 대한 상수 식별자가 들어있는 StructuredName 클래스가 있음을 알게되었습니다. 안타깝게도 StructuredName 필드를 의도에 추가 할 수 없었습니다 ...

아무도 이것이 제대로 수행 된 방법을 알고 있습니까?

참고 : 연락처를 직접 추가하려고하지는 않지만 채워진 "연락처 추가"대화 상자를 열고 싶습니다.

감사 뜨아

답변

2

대부분의/ContactsContract.Intents.Insert에서 모든 값이 기본 연락처 응용 프로그램에서 model/EntityModifier.java 클래스에서 처리됩니다 - 그리고 그건 그냥 StructuredName.GIVEN_NAMEInsert.NAME의 값을 거즈.

모든 이름 구성 요소를 지원하지만 vCard 파일을 sdcard에 덤프하거나 ContentResolver#openInputStream(Uri) 읽을 수있는 파일 (일반적으로 파일)을 제공해야하는 vCard 2.1 (text/x-vcard)로 가져 오기를 시도해 볼 수 있습니다. sdcard 또는 자신의 ContentProvider를 가리키는 URI).

동적으로 vCard를 생성하기 위해 컨텐트 프로를 사용하는 간단한 예 :

당신의 활동에 :

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setDataAndType(Uri.parse("content://some.authority/N:Jones;Bob\nTEL:123456790\n"), "text/x-vcard"); 
startActivity(i); 

귀하의 컨텐트 프로에서 (ACTION_VIEW 인 텐트에 사용 권한 등록) :

public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
    try { 
    FileOutputStream fos = getContext().openFileOutput("filename.txt", Context.MODE_PRIVATE); 
    String vcard = "BEGIN:VCARD\nVERSION:2.1\n" + 
     uri.getPath().substring(1) + 
     "END:VCARD\n"; 
    fos.write(vcard.getBytes("UTF-8")); 
    fos.close(); 
    return ParcelFileDescriptor.open(new File(getContext().getFilesDir(), "filename.txt"), ParcelFileDescriptor.MODE_READ_ONLY); 
    } catch (IOException e) { 
    throw new FileNotFoundException(); 
    } 
} 

이것은 트리거 될 때 Uri의 경로에 넣은 이름의 연락처를 전화 번호부에 삽입해야합니다. 사용자에게 여러 개의 연락처 계정이있는 경우 하나를 선택하라는 메시지가 표시됩니다.

참고 : vCard의 적절한 인코딩은 물론 완전히 무시됩니다. 나는 대부분의 버전의 연락처 앱 을 이미지화해야합니다.은 vCard 3.0을 지원하며 vCard 2.1과 같이 뇌사가없는 인코딩을 제공하지 않습니다.

위쪽에서이 방법을 사용하면 직장/휴대 전화 및 기타 번호를 추가 할 수 있습니다.

+0

오 스냅. 저주받은 일을 편집하고 싶다는 사실을 눈치 챘을 것입니다. 대부분의 경우 연락처를 추가하고 계정 이름과 유형을 정의하면 사용자에게 확인을 요구하지 않습니다. – Jens

+0

답변 해 주신 Jens에게 감사드립니다. 참으로 재미있는 (해커 임에도 불구하고) 접근법입니다. ACTION_INSERT_OR_EDIT를 사용하여 vcard (추상화의 일부 레이어에서)를 의도에 전달할 수있는 방법이 있습니까? – Dino

+0

잘 모르겠습니다. ACTION_INSERT_OR_EDIT 의도는 기본 연락처 앱에서 지원하는 항목에서 매우 제한적입니다. – Jens

관련 문제