2011-07-28 41 views
4

正在构建一个应用程序,该应用程序需要为每个电话号码定制一个自定义联系人字段(如果您想知道“白名单”)。将自定义字段添加到电话号码

但是,我只找到了一种方法来保存每个联系人的自定义数据,与Data.RAW_CONTACT_ID,但不是每个电话号码。我尝试使用Phone._id,但我得到了一个java.nullpointerexception错误。

这是代码我现在有:

try{ //phoneId = get Phone._ID from cursor 
    ContentValues values = new ContentValues();       
    values.put(Data.DATA1, "yes"); 
    int state = getContentResolver().update(Phone.CONTENT_URI, values, Phone._ID + " = " 
       + phoneId + " AND " + Data.MIMETYPE + "='" + MIMETYPE_WHITELIST_CONTACT+"'", null); 
     if (state == 0) { 
      values.put(Phone._ID, phoneId); 
      values.put(Data.DATA1, "yes"); 
      values.put(Data.MIMETYPE, MIMETYPE_WHITELIST_CONTACT); 
          getContentResolver().insert(Data.CONTENT_URI, values); 
     } 
}catch (Exception e) { 
    Toast.makeText(ChooseContactsActivity.this, e.toString(), Toast.LENGTH_LONG).show(); 
} 

没有人有任何的想法需要改变什么,所以它可以节省的自定义字段的电话号码,不联系吗?

回答

0

所有权利标签专栏中,我想通了。也许有更好的解决方案,但这个工作对我来说:

values.put(Data.RAW_CONTACT_ID, contactId); 
    values.put(Data.DATA1, phoneId); 
    values.put(Data.DATA2, "1"); 
    values.put(Data.DATA5, phoneNum); 
    values.put(Data.MIMETYPE, MIMETYPE_WHITELIST_CONTACT); 
getContentResolver().insert(Data.CONTENT_URI, values); 

当我询问,我只需要添加phoneId得到结果我需要:

getContentResolver().query(Data.CONTENT_URI, {Data.DATA1, Data.DATA2}, 
Data.RAW_CONTACT_ID + " = " + contactId + " AND " + 
    Data.DATA1 + " = " + phoneId + " AND " + 
      Data.MIMETYPE + "='" + MIMETYPE_WHITELIST_CONTACT+"'", null, null); 
-1

由于联系人已被弃用且已被ContactsContract代替,因此您最好尝试新的联系人。较新的API允许访问多个帐户并支持类似联系人的聚合。

对于新的Phone类,它定义了三列。

  • 串号DATA1
  • 整型DATA2
  • 字符串标签DATA3

我认为你可以使用的ContactsContract.CommonDataKinds.Phone

+0

答:'LABEL'用于用户定义的数字描述,如果它不符合.data2选项。 B.我正在使用新的API。我导入... commonDataKinds.phone.-1。请在下次更仔细地阅读问题。 – Eric

2

尝试使用下面的代码添加自定义标签号码。 这是工作的代码在我的应用程序...

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

if (CustomLabelNo != null) { 
      ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, id) 
        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
        .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, CustomLabelNo) 
        .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM) 
        .withValue(ContactsContract.CommonDataKinds.Phone.LABEL, "mayurbhola_newCustomTest").build()); 
     } 

描述: CustomLabelNo:要在您的联系人添加任何数字。 ops:这是ArrayList。

getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

[参考链接,了解getContentResolver]:http://developer.android.com/guide/topics/providers/content-providers.html 此代码添加联系人......

可以添加其他类型的号码和显示名称按要求。

+0

我一直在寻找这个..大,很清楚..谢谢你 –

0
This is how you do it if you want your custom label: 

    Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION); 
    intent.setType(ContactsContract.RawContacts.CONTENT_TYPE); 
    intent.putExtra(ContactsContract.Intents.Insert.NAME, name); 

    ArrayList<ContentValues> data = new ArrayList<>();       
    ContentValues phonesRow = new ContentValues(); 

    phonesRow.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
              phonesRow.put(ContactsContract.CommonDataKinds.Phone.NUMBER,number); 
    phonesRow.put(ContactsContract.CommonDataKinds.Phone.LABEL,type);        phonesRow.put(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM); 
data.add(phonesRow); 
相关问题