2011-09-25 34 views
9

Tôi đang cố gắng khởi chạy hoạt động "thêm hoặc chỉnh sửa liên hệ" gốc Android với một số dữ liệu đã có trong biểu mẫu. Đây là mã tôi đang sử dụng hiện tại:Cách thêm liên hệ có họ và tên thông qua mục đích

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); 

Vấn đề của tôi là tôi muốn chỉ định họ và tên. Tôi cũng nhận thấy rằng có một lớp StructuredName chứa các định danh liên tục cho tất cả các trường mà tôi yêu cầu. Rất tiếc, tôi không thể thêm trường StructuredName vào mục đích ...

Có ai biết cách thực hiện điều này đúng cách không?

Lưu ý: Tôi không cố thêm trực tiếp liên hệ, nhưng tôi muốn mở hộp thoại "thêm liên hệ" được điền vào!

Cảm ơn Duh

Trả lời

2

Hầu hết/tất cả các giá trị từ ContactsContract.Intents.Insert được xử lý trong lớp model/EntityModifier.java trong ứng dụng danh bạ mặc định - và đó chỉ là chất liệu giá trị từ Insert.NAME vào StructuredName.GIVEN_NAME.

Bạn có thể thử nhập nó dưới dạng vCard 2.1 (text/x-vcard), hỗ trợ tất cả các thành phần tên nhưng yêu cầu bạn đổ tệp vCard trên sdcard hoặc cung cấp thứ gì đó mà ContentResolver#openInputStream(Uri) có thể đọc (thường là tệp trên sdcard hoặc URI trỏ đến ContentProvider của riêng bạn).

Một ví dụ đơn giản mà sử dụng một ContentProvider để tạo ra các vCards động:

Trong hoạt động của bạn:

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); 

Trong ContentProvider bạn (đăng ký quyền sử dụng trong mục đích? 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(); 
    } 
} 

Điều này sẽ xảy ra khi được kích hoạt, chèn một liên hệ có tên là bất cứ thứ gì bạn đặt vào đường dẫn của Uri vào danh bạ. Nếu người dùng có nhiều tài khoản liên hệ, họ sẽ được yêu cầu chọn một tài khoản.

Lưu ý: Mã hóa đúng của vCard hoàn toàn bị bỏ qua. Tôi hình ảnh hầu hết các phiên bản của ứng dụng danh bạ nên hỗ trợ vCard 3.0 cũng không có mã hóa não chết như vCard 2.1.

Ở phía trên, phương pháp này cũng sẽ cho phép bạn thêm số công việc/di động và các số khác (và nhiều hơn nữa).

+0

Rất tiếc. Lưu ý rằng bạn muốn chỉnh sửa thứ chết tiệt - điều này sẽ trong hầu hết các trường hợp chỉ cần thêm số liên lạc - và nếu bạn xác định tên và loại tài khoản - thậm chí không yêu cầu người dùng xác nhận (lỗ hổng bảo mật lớn như bình thường). – Jens

+0

Cảm ơn câu trả lời Jens. Nó thực sự là một cách tiếp cận thú vị (mặc dù là hacky). Có thể có một cách để vượt qua các vcard (trên một số lớp trừu tượng) với ý định với ACTION_INSERT_OR_EDIT? – Dino

+0

Không phải là tôi biết - ý định ACTION_INSERT_OR_EDIT là khá hạn chế trong những gì nó hỗ trợ trong ứng dụng danh bạ mặc định. – Jens

Các vấn đề liên quan