尝试以编程方式将联系人插入Android设备时,应用程序崩溃

时间:2013-05-08 06:06:54

标签: android

我正在编写一个函数,将我数据库中存储的Android联系人添加到用户的联系人列表中。昨天我问了一个类似的问题,Programmatically Inserting New Android Contacts into Phone,我刚刚要求提供一个将Android联系人插入联系人列表的示例。虽然我收到了正确的答案,但它并没有解决我遇到的问题。我的应用程序所做的是获取用户存储在我的数据库中的联系人,将其转换为联系人对象,然后从联系人对象获取信息并将其重新插入手机。我的问题是应用程序崩溃第二次我尝试将任何数据插入设备。这是我用到崩溃点的代码:

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);
    values.clear();
}

我认为没有任何理由不起作用,毕竟我有权在AndroidManifest.xml文件中读取和写入联系人:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

无论如何,回复我上一个问题的人提供了代码,

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

运行它,我仍然得到了崩溃。这是我在应用程序中点击“恢复联系人”按钮的第二个代码的logcat:

05-08 05:57:40.905: D/AndroidRuntime(2917): Shutting down VM
05-08 05:57:40.905: W/dalvikvm(2917): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
05-08 05:57:40.945: E/AndroidRuntime(2917): FATAL EXCEPTION: main
05-08 05:57:40.945: E/AndroidRuntime(2917): java.lang.NullPointerException
05-08 05:57:40.945: E/AndroidRuntime(2917):     at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:99)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at com.protextyou.contacts.ContactHandler.addContact(ContactHandler.java:46)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at com.protextyou.StartPage$12.onClick(StartPage.java:542)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at android.os.Looper.loop(Looper.java:137)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at android.app.ActivityThread.main(ActivityThread.java:5041)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at java.lang.reflect.Method.invokeNative(Native Method)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at java.lang.reflect.Method.invoke(Method.java:511)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-08 05:57:40.945: E/AndroidRuntime(2917):     at dalvik.system.NativeStart.main(Native Method)

当然,当我在代码中添加try / catch语句时,它会出现“Exception:Null”。所以,我猜测NullPointerException是我的问题,但我不知道是什么导致它。有人可以解释我可能需要解决的问题,以使我的应用程序停止崩溃吗?

3 个答案:

答案 0 :(得分:0)

这是我目前用来以编程方式添加联系人的代码。

import java.util.ArrayList;

import android.app.Activity;
import android.content.ContentProviderOperation;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.Contacts.People;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.widget.Toast;

public class AddContactDemo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
addContact("Coderz","1234567890");
addContact("James","5656215521");
addContact("John","4545454545");
addContact("Mary","9632587410");
addContact("Peter","4561237890");
}
private void addContact(String name, String phone) {
ContentValues values = new ContentValues();
values.put(People.NUMBER, phone);
values.put(People.TYPE, Phone.TYPE_CUSTOM);
values.put(People.LABEL, name);
values.put(People.NAME, name);
Uri dataUri = getContentResolver().insert(People.CONTENT_URI, values);
Uri updateUri = Uri.withAppendedPath(dataUri, People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(People.Phones.TYPE, People.TYPE_MOBILE);
values.put(People.NUMBER, phone);
updateUri = getContentResolver().insert(updateUri, values);
}
}

你已经插入了清单权限,所以我觉得你很高兴...

希望这有帮助

答案 1 :(得分:0)

尝试将行values.put("contact_id", contact.getContactId());更改为

values.put("raw_contact_id", contact.getContactId());

在这里查看http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html

http://developer.android.com/reference/android/provider/ContactsContract.DataColumns.html#RAW_CONTACT_ID

答案 2 :(得分:0)

检查context方法中的addContact()变量,此时可能会变为空,您调用该方法。你的堆栈跟踪清楚地指向它。

希望这有帮助。