【问题标题】:Add contact to group Android将联系人添加到组 Android
【发布时间】:2014-09-14 01:57:24
【问题描述】:

当我添加联系人而不将他添加到组时,这是可行的,但是当 我尝试添加到特定组(我有 id)它失败了。 我阅读了很多如何将联系人添加到组的答案。但它一直都失败了。

这是我的代码:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
             .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, "meu")
             .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, "meu")
             .build());

     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.name)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone._ID, contact.index)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
             .build());
     if(contact.phone2 !=" "){
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone2)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
             .build());
     }
     if(contact.phone3 !=" "){
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.phone3)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_WORK)
             .build());
     }
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.fax)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,Phone.TYPE_FAX_WORK)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET,contact.street+" "+contact.streetNumber+","+contact.city)
             .build());
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY,Screen.currentContext.getResources().getString(R.string.meuhedet))
             .build());

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Groups.CONTENT_URI)
             .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
             .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE)
             .withValue(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID, 10)
             .build());

     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     Bitmap photo = BitmapFactory.decodeResource(Screen.getContext().getResources(),R.drawable.logo);
     photo.compress(Bitmap.CompressFormat.PNG, 100, baos);
     ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
         .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
         .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, baos.toByteArray())
         .build());

我在日志中找到了这条踪迹:

12-03 10:17:11.693: E/SQLiteLog(18436): (1) 表组没有名为 mimetype 的列 12-03 10:17:11.698:E/SQLiteDatabase(18436):插入 mimetype=vnd.android.cursor.item/group_membership account_id=1 data1=10dirty=1 raw_contact_id=2 时出错 12-03 10:17:11.698: E/SQLiteDatabase(18436): android.database.sqlite.SQLiteException: 表组没有名为 mimetype 的列 (代码 1): , 编译时: INSERT INTO groups(mimetype,account_id,data1,脏,raw_contact_id)值(?,?,?,?,?) 12-03 10:17:11.698:E/SQLiteDatabase(18436):在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1012) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:623) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 com.android.providers.contacts.ContactsProvider2.insertGroup(ContactsProvider2.java:5170) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:3598) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 com.android.providers.contacts.AbstractContactsProvider.insert(AbstractContactsProvider.java:116) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2681) 12-03 10:17:11.698: E/SQLiteDatabase(18436): 在 android.content.ContentProviderOperation.apply(ContentProviderOperation.java:214) 12-03 10:17:11.698: E/SQLiteDatabase(18436): at com.android.providers.contacts.AbstractContactsProvider.applyBatch(AbstractContactsProvider.java:217)....

【问题讨论】:

  • 我明白了。我认为我确实喜欢这个答案。唯一不同的是“ContactsContract.Data.RAW_CONTACT_ID, 0”。在他们在另一个值中使用的示例中
  • 插入失败的错误是什么?
  • OperationApplicationException 插入失败

标签: android contacts android-contentprovider


【解决方案1】:

我发现了我的问题,这很愚蠢。

我写的是ContactsContract.**Groups**.CONTENT_URI 而不是ContactsContract.**Data**.CONTENT_URI

这就是为什么我在 sql 中得到异常。因为 Groups 表没有名为 mimetype 的列

【讨论】:

    【解决方案2】:

    试试这个代码。 Groups._ID 将由 Android 生成

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    
        ops.add(ContentProviderOperation.newInsert(Groups.CONTENT_URI)
                 .withValue(Groups.TITLE, "your_group_Title")
                 .withValue(Groups.GROUP_VISIBLE, true)
                 .withValue(RawContacts.ACCOUNT_TYPE, "com.google")
                 .withValue(RawContacts.ACCOUNT_NAME, "********@gmail.com")
                 .build());
    
    
        try {
            ContentProviderResult[] contactUri = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    

    【讨论】:

    • 这适用于此处除 HTC M8 之外的所有设备都会出现此错误:原因:java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a空对象引用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多