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