【问题标题】:NullPointer Exception in adding contact numberNullPointer 添加联系人号码时出现异常
【发布时间】:2015-01-18 17:27:18
【问题描述】:

我想遍历联系人,然后向他们添加新号码。 ApplyBatch() 中出现空指针异常。

这是我获取 iD 的代码

 protected Object doInBackground(Object[] objects) {
    final String[] projection = new String[] {
            RawContacts.CONTACT_ID, // the contact id column
            RawContacts.DELETED     // column if this contact is deleted
    };
    final Cursor rawContacts = context.getContentResolver().query(
            RawContacts.CONTENT_URI,    // the URI for raw contact provider
            projection,
            null,                    // selection = null, retrieve all entries
            null,                    // selection is without parameters
            null);                  // do not order
    final int contactIdColumnIndex = rawContacts.getColumnIndex(RawContacts.CONTACT_ID);

    final int deletedColumnIndex = rawContacts.getColumnIndex(RawContacts.DELETED);

    if(rawContacts.moveToFirst()) {
        while(!rawContacts.isAfterLast()) {     // still a valid entry left?
            final int contactId = rawContacts.getInt(contactIdColumnIndex);
            final boolean deleted = (rawContacts.getInt(deletedColumnIndex) == 1);
            if(!deleted) {
                EditContactPhone(contactId);
            }
            rawContacts.moveToNext();           // move to the next entry
        }
    }
    rawContacts.close();
    if (!ops.isEmpty()) {
        try {
            context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            e.printStackTrace();
        }
    }
    return null;
}

这是 EditContactPhone 方法,它将数据添加到操作中

private void EditContactPhone(int contactId) {
    final String[] projection = new String[] {
            Phone.NUMBER,
            Phone.TYPE
    };
    final Cursor phone =  context.getContentResolver().query(
            Phone.CONTENT_URI,
            projection,
            Data.CONTACT_ID + "=?",
            new String[]{String.valueOf(contactId)},
            null);
    if(phone.moveToFirst()) {
        while (!phone.isAfterLast()) {
            String newNumber = buildNineFineNine(number); //Function which modify the NewNumber to be added
            ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
                            .withValue(ContactsContract.Data.CONTACT_ID, contactId)
                            .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
                            .withValue(Phone.NUMBER, newNumber)
                            .withValue(Phone.TYPE, Phone.TYPE_CUSTOM)
                            .withValue(Phone.LABEL, "NineFiveNine")
                            .build());
                    phone.moveToNext();
        }
    }
    phone.close();
}

当我将 ContactsContract.Data.CONTACT_ID 切换到 RAW_CONTACT_ID 时,它成功完成,但数字被添加到错误的联系人中。我仍然无法弄清楚为什么它显示 nullPointer 异常。

这是 LOGCAT

01-18 23:46:02.955  15824-15955/vapp.ninefivenineconverter E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
        at java.util.concurrent.FutureTask.run(FutureTask.java:239)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at java.lang.Thread.run(Thread.java:838)
 Caused by: java.lang.NullPointerException
        at android.os.Parcel.readException(Parcel.java:1434)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
        at android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:160)
        at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:461)
        at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:225)
        at android.content.ContentResolver.applyBatch(ContentResolver.java:976)
        at vapp.ninefivenineconverter.ConverterTask.doInBackground(ConverterTask.java:67)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask.run(FutureTask.java:234)

【问题讨论】:

    标签: android nullpointerexception android-contacts


    【解决方案1】:

    第一个问题可能在这里:

     .withValue(Phone.NUMBER, newNumber)
    

    确保 newNumber 不是 Null。

    如果这没有帮助并且问题仍然存在,请尝试使用 URI:

    ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI);
    

    而不是这个

    ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
    

    接下来的工作是简单地使用 Data.CONTENT_URI 和 RAW_CONTACT_ID:

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                        .withValue(ContactsContract.Data.RAW_CONTACT_ID, id)
                        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, newNumber)
                        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM)
                        .withValue(ContactsContract.CommonDataKinds.Phone.LABEL, "NineFiveNine").build());
    

    【讨论】:

    • 我按照你说的做了修改,AsyncTask 完成,但是任何联系人都没有变化。尝试使用 RAW_CONTACT_ID 和 CONTACT_ID。
    • 所以更改URI后不再抛出NullpointerException?
    • 是的,不再有空指针异常
    • 请查看答案,希望对您有所帮助。
    • 抱歉回复晚了,我的网络已经中断了整整一周。转换任务完成且没有错误,但随后错误地添加了电话号码。这是它如何错误地向错误的联系人添加 no 的屏幕截图 => imgur.com/ZWsT9WD
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多