2013-05-07 62 views
18

Tôi đang viết một ứng dụng cho phép người dùng xóa địa chỉ liên hệ khỏi thiết bị Android của họ và lưu trữ chúng trong cơ sở dữ liệu riêng biệt. Họ cũng sẽ có thể khôi phục các số liên lạc vào điện thoại của họ, nhưng tôi đang gặp rắc rối với phần này. Tôi lấy thông tin liên lạc từ cơ sở dữ liệu của tôi và tạo một đối tượng liên lạc chứa ID liên hệ, khóa tra cứu, tên cấu trúc, tổ chức, danh sách mảng các đối tượng điện thoại (có chứa số điện thoại và loại), v.v. Chức năng của tôi để khôi phục thông tin đó về điện thoại có dạng như sau:Lập trình Chèn Danh bạ Android mới vào Điện thoại

public void addContact(Contact contact) 
{ 
    ContentValues values = new ContentValues(); 
    values.put("contact_id", contact.getContactId()); 
    values.put("lookup", contact.getLookupKey()); 
    values.put("mimetype", StructuredName.CONTENT_ITEM_TYPE); 
    values.put("data1", contact.getStructuredName().getDisplayName()); 
    values.put("data2", contact.getStructuredName().getGivenName()); 
    values.put("data3", contact.getStructuredName().getFamilyName()); 
    values.put("data4", contact.getStructuredName().getPrefix()); 
    values.put("data5", contact.getStructuredName().getMiddleName()); 
    values.put("data6", contact.getStructuredName().getSuffix()); 
    context.getContentResolver().insert(Data.CONTENT_URI, values); 
} 

Và, đó là nơi ứng dụng gặp sự cố. Tôi đã sử dụng phương pháp này để chèn dữ liệu vào cơ sở dữ liệu của mình mà không gặp bất kỳ sự cố nào và tôi có thể xác minh rằng nó đang được lưu trữ chính xác. Vì vậy, tôi đoán là có một cách tốt hơn so với điều này để chèn địa chỉ liên lạc vào thiết bị, nhưng tôi không có ý tưởng đó sẽ là gì. Ai đó có thể cho tôi một ví dụ về lập trình và chèn một số liên lạc vào thiết bị của người dùng không? Tôi sẽ hài lòng ngay cả khi tôi có thể thấy một liên hệ chỉ với tên hiển thị được tạo.

Trong trường hợp vấn đề, tôi cũng đã cố gắng đặt mã này trên chèn tên cấu trúc, nhưng không có kết quả:

values.put("_id", contact.getContactId()); 
values.put("lookup", contact.getLookupKey()); 
values.put("display_name", contact.getStructuredName().getDisplayName()); 
context.getContentResolver().insert(Contacts.CONTENT_URI, values); 
values.clear(); 

Edit: Đây là logcat log lỗi của tôi cho khi treo ứng dụng:

05-07 20:31:53.941: E/Trace(819): error opening trace file: No such file or directory (2) 
05-07 20:34:39.035: D/AndroidRuntime(853): Shutting down VM 
05-07 20:34:39.048: W/dalvikvm(853): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
05-07 20:34:39.197: E/AndroidRuntime(853): FATAL EXCEPTION: main 
05-07 20:34:39.197: E/AndroidRuntime(853): java.lang.NullPointerException 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Parcel.readException(Parcel.java:1431) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentProviderProxy.insert(ContentProviderNative.java:420) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.content.ContentResolver.insert(ContentResolver.java:866) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.contacts.ContactHandler.addContact(ContactHandler.java:58) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.protextyou.StartPage$12.onClick(StartPage.java:542) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.os.Looper.loop(Looper.java:137) 
05-07 20:34:39.197: E/AndroidRuntime(853): at android.app.ActivityThread.main(ActivityThread.java:5041) 
05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invokeNative(Native Method) 
05-07 20:34:39.197: E/AndroidRuntime(853): at java.lang.reflect.Method.invoke(Method.java:511) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
05-07 20:34:39.197: E/AndroidRuntime(853): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
05-07 20:34:39.197: E/AndroidRuntime(853): at dalvik.system.NativeStart.main(Native Method) 
+0

Nếu gặp sự cố, sẽ có một dấu vết ngăn xếp trong nhật ký. Vui lòng đăng logcat. –

+0

Er, tôi không chắc chắn phần nào cần đăng. Một loạt các lỗi bật lên trong logcat, vì vậy đây là số ít nhất: '05-07 09: 07: 02.334: E/Dấu vết (3052): lỗi mở tệp theo dõi: Không có tệp hoặc thư mục nào (2)' ' 05-07 09: 07: 21.483: E/AndroidRuntime (3052): LOẠI TRỪ CHẤT LƯỢNG: main' '05-07 09: 07: 21.483: E/AndroidRuntime (3052): java.lang.NullPointerException' ' 05-07 09: 07: 21.483: E/AndroidRuntime (3052): \t tại android.os.Parcel.readException (Parcel.java:1431) ' ' 05-07 09: 07: 21.483: E/AndroidRuntime (3052): \t tại android.database.DatabaseUtils.readExceptionFromParcel (DatabaseUtils.java:185) ' – Cheddar

+0

phần về' NullPointerException' là một phần để đăng. Chỉnh sửa câu hỏi của bạn và thêm dấu vết ngăn xếp _full_, không chỉ hai hàng đầu tiên. –

Trả lời

16

Reference

ContentValues values = new ContentValues(); 
      values.put(Data.RAW_CONTACT_ID, 001); 
      values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); 
      values.put(Phone.NUMBER, "1-800-GOOG-411"); 
      values.put(Phone.TYPE, Phone.TYPE_CUSTOM); 
      values.put(Phone.LABEL, "Nirav"); 
      Uri dataUri = getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values); 

Sử dụng đoạn mã trên. http://developer.android.com/reference/android/provider/ContactsContract.Data.html

+0

Tôi đã thử mã của bạn nhưng ứng dụng vẫn gặp sự cố. Sau đó, tôi đã thử mã của câu trả lời hàng đầu trong liên kết đầu tiên bạn đăng và Bánh mì nướng bắt được "Ngoại lệ: Null". Nhưng tôi không biết phải làm gì. – Cheddar

+1

Bạn có cho phép viết liên lạc không? –

+0

Có, tôi có quyền đọc và viết, '', ' 'và tôi có thể xóa địa chỉ liên hệ (tôi thực hiện việc này bằng cách xóa khỏi' RawContacts.CONTENT_URI'), vì vậy tôi không nghĩ rằng quyền là vấn đề của tôi. @NiravRanpara – Cheddar

1
ArrayList<ContentProviderOperation> ops = 
     new ArrayList<ContentProviderOperation>(); 
ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
     .withValue(Data.RAW_CONTACT_ID, rawContactId) 
     .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) 
     .withValue(Phone.NUMBER, "1-800-GOOG-411") 
     .withValue(Phone.TYPE, Phone.TYPE_CUSTOM) 
     .withValue(Phone.LABEL, "free directory assistance") 
     .build()); 
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
Các vấn đề liên quan