天天看點

ContentProvider往通訊錄添加聯系人和擷取聯系人

在Android中,可以使用ContentResolver對通信錄中的資料進行添加、删除、修改和查詢操作。

在對聯系人進行操作時需加入以下兩個權限  

<!-- 添加操作聯系人的權限 -->

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

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

<!-- 聯系人相關的uri -->

content://com.android.contacts/contacts 操作的資料是聯系人資訊Uri

content://com.android.contacts/data/phones 聯系人電話Uri

content://com.android.contacts/data/emails 聯系人Email Uri            

一、清單檔案

ContentProvider往通訊錄添加聯系人和擷取聯系人
<?
   xml version="1.0" encoding="utf-8"
   ?>
   

   <
   manifest 
   xmlns:android
   ="http://schemas.android.com/apk/res/android"
   
    package
   ="com.ljq.contact"
    android:versionCode
   ="1"
   
    android:versionName
   ="1.0"
   >
   
    
   <
   application 
   android:icon
   ="@drawable/icon"
   
        android:label
   ="@string/app_name"
   >
   
        
   <
   uses-library 
   android:name
   ="android.test.runner"
    
   />
   
        
   <
   activity 
   android:name
   =".ContactActivity"
   
            android:label
   ="@string/app_name"
   >
   
            
   <
   intent-filter
   >
   
                
   <
   action 
   android:name
   ="android.intent.action.MAIN"
    
   />
   
                
   <
   category
                    
   android:name
   ="android.intent.category.LAUNCHER"
    
   />
   
            
   </
   intent-filter
   >
   
        
   </
   activity
   >
   

    
   </
   application
   >
   
    
   <
   uses-sdk 
   android:minSdkVersion
   ="7"
    
   />
   
    
   <
   instrumentation
        
   android:name
   ="android.test.InstrumentationTestRunner"
   
        android:targetPackage
   ="com.ljq.contact"
   
        android:label
   ="Tests for My App"
    
   />
   
    
   <!--
    添加聯系人權限 
   -->
   
    
   <
   uses-permission 
   android:name
   ="android.permission.READ_CONTACTS"
    
   />
   
    
   <
   uses-permission 
   android:name
   ="android.permission.WRITE_CONTACTS"
    
   />
   


   </
   manifest
   >
        
ContentProvider往通訊錄添加聯系人和擷取聯系人

擷取聯系人和添加聯系人

ContentProvider往通訊錄添加聯系人和擷取聯系人
package
    com.ljq.contact;


   import
    java.util.ArrayList;


   import
    android.content.ContentProviderOperation;

   import
    android.content.ContentProviderResult;

   import
    android.content.ContentResolver;

   import
    android.content.ContentUris;

   import
    android.content.ContentValues;

   import
    android.database.Cursor;

   import
    android.net.Uri;

   import
    android.provider.ContactsContract;

   import
    android.provider.ContactsContract.Data;

   import
    android.provider.ContactsContract.RawContacts;

   import
    android.provider.ContactsContract.CommonDataKinds.Email;

   import
    android.provider.ContactsContract.CommonDataKinds.Phone;

   import
    android.provider.ContactsContract.CommonDataKinds.StructuredName;

   import
    android.test.AndroidTestCase;

   import
    android.util.Log;


   public
    
   class
    ContactTest 
   extends
    AndroidTestCase{
    
   private
    
   static
    
   final
    String TAG 
   =
    
   "
   ContactTest
   "
   ;
    
    
   /**
   
     * 擷取通訊錄中聯系人
     
   */
   
    
   public
    
   void
    testGetContact(){
        ContentResolver contentResolver 
   =
    
   this
   .getContext().getContentResolver();
        Uri uri 
   =
    Uri.parse(
   "
   content://com.android.contacts/contacts
   "
   );
        Cursor cursor 
   =
    contentResolver.query(uri, 
   null
   , 
   null
   , 
   null
   , 
   null
   );
        
   while
   (cursor.moveToNext()){
            
   //
    擷取聯系人姓名
   

               StringBuilder sb 
   =
    
   new
    StringBuilder();
            String contactId 
   =
    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));  
            String name 
   =
    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
            sb.append(
   "
   contactId=
   "
   ).append(contactId).append(
   "
   ,name=
   "
   ).append(name);
            
            
   //
   擷取聯系人手機号碼
   

               Cursor phones 
   =
    contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,  
                    
   null
   ,  
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
   +
   "
    = 
   "
   +
    contactId,  
                    
   null
   , 
   null
   );  
            
   while
   (phones.moveToNext()){
                String phone 
   =
    phones.getString(phones.getColumnIndex(
   "
   data1
   "
   )); 
                sb.append(
   "
   ,phone=
   "
   ).append(phone);
            }
            
            
   //
   擷取聯系人email
   

               Cursor emails 
   =
    contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,  
                       
   null
   ,  
                       ContactsContract.CommonDataKinds.Email.CONTACT_ID 
   +
    
   "
    = 
   "
    
   +
    contactId,  
                       
   null
   , 
   null
   ); 
            
   while
   (emails.moveToNext()){
                String email 
   =
    emails.getString(emails.getColumnIndex(
   "
   data1
   "
   )); 
                sb.append(
   "
   ,email=
   "
   ).append(email);
            }
            Log.i(TAG, sb.toString());
        }
    }

    
   /**
   
     * 首先向RawContacts.CONTENT_URI執行一個空值插入,目的是擷取系統傳回的rawContactId 
     * 
     * 這是後面插入data表的資料,隻有執行空值插入,才能使插入的聯系人在通訊錄裡可見
     
   */
   
    
   public
    
   void
    testInsert(){
        ContentValues values 
   =
    
   new
    ContentValues();
        
   //
   首先向RawContacts.CONTENT_URI執行一個空值插入,目的是擷取系統傳回的rawContactId
   

           Uri rawContactUri 
   =
    
   this
   .getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values);
        
   long
    rawContactId 
   =
    ContentUris.parseId(rawContactUri);
        
        
   //
   往data表入姓名資料
   

           values.clear();
        values.put(Data.RAW_CONTACT_ID, rawContactId);
        values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
        values.put(StructuredName.GIVEN_NAME, 
   "
   zhangsan
   "
   );
        
   this
   .getContext().getContentResolver().insert(
                android.provider.ContactsContract.Data.CONTENT_URI, values);
        
        
   //
   往data表入電話資料
   

           values.clear();
        values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
        values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
        values.put(Phone.NUMBER, 
   "
   5554
   "
   );
        values.put(Phone.TYPE, Phone.TYPE_MOBILE);
        
   this
   .getContext().getContentResolver().insert(
                android.provider.ContactsContract.Data.CONTENT_URI, values);

        
   //
   往data表入Email資料
   

           values.clear();
        values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
        values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
        values.put(Email.DATA, 
   "
   [email protected]
   "
   );
        values.put(Email.TYPE, Email.TYPE_WORK);
        
   this
   .getContext().getContentResolver().insert(
                android.provider.ContactsContract.Data.CONTENT_URI, values);
    }
    
    
   /**
   
     * 批量添加聯系人,處于同一個事務中
     
   */
   
    
   public
    
   void
    testSave() 
   throws
    Throwable{
        
   //
   文檔位置:reference\android\provider\ContactsContract.RawContacts.html
   

           ArrayList
   <
   ContentProviderOperation
   >
    ops 
   =
    
   new
    ArrayList
   <
   ContentProviderOperation
   >
   ();
        
   int
    rawContactInsertIndex 
   =
    
   0
   ;
        ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                .withValue(RawContacts.ACCOUNT_TYPE, 
   null
   )
                .withValue(RawContacts.ACCOUNT_NAME, 
   null
   )
                .build());
        
        
   //
   文檔位置:reference\android\provider\ContactsContract.Data.html
   

           ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.GIVEN_NAME, 
   "
   lisi
   "
   )
                .build());
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                 .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
                 .withValue(Phone.NUMBER, 
   "
   5556
   "
   )
                 .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
                 .withValue(Phone.LABEL, 
   ""
   )
                 .build());
        ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
                 .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
                 .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
                 .withValue(Email.DATA, 
   "
   [email protected]
   "
   )
                 .withValue(Email.TYPE, Email.TYPE_WORK)
                 .build());
        
        ContentProviderResult[] results 
   =
    
   this
   .getContext()
                .getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops);
        
   for
    (ContentProviderResult result : results) {
            Log.i(TAG, result.uri.toString());
        }
    }
    
  
  
   	public static void addContact(Context context, final String number)
	{
		// reference\android\provider\ContactsContract.RawContacts.html
		ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
		int rawContactInsertIndex = 0;
		ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_TYPE, null)
				.withValue(RawContacts.ACCOUNT_NAME, null).build());


		// reference\android\provider\ContactsContract.Data.html
		// ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
		// .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
		// .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
		// .withValue(StructuredName.GIVEN_NAME, "lisi")
		// .build());
		ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
				.withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
				.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE).withValue(Phone.NUMBER, number)
				.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
				.withValue(Phone.PHONE_BLACKLIST, Phone.HAS_BLACKLIST)
				.build());


		try
		{
			ContentProviderResult[] results = context.getContentResolver()
					.applyBatch(ContactsContract.AUTHORITY, ops);
			Log.i(TAG, "addContact--->results[0]:" + results[0]);
			long rawContactid = ContentUris.parseId(results[0].uri);
			Log.i(TAG, "addContact--->rawContactid:" + rawContactid);
			
		}
		catch (RemoteException | OperationApplicationException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
				
	}
  
  
   	public static long getRawContactIdByContactId(Context context, final String contactId)
    {
        ContentResolver contentResolver = context.getContentResolver();
        long rawContactId = 0;
        Cursor cursor = contentResolver.query(
                android.provider.ContactsContract.Contacts.CONTENT_URI, null,
                android.provider.ContactsContract.Contacts._ID + " = ?",
                new String[] {
                    contactId
                }, null);
        if ((cursor != null) && (cursor.moveToNext()))
        {
            rawContactId = cursor
                    .getLong(cursor
                            .getColumnIndex(android.provider.ContactsContract.Contacts.NAME_RAW_CONTACT_ID));


            cursor.close();
        }
        Log.i(TAG, "getRawContactIdByContactId--->rawContactId:" + rawContactId);
        return rawContactId;
    }
  
  
   

  
  
   long rawContactId = getRawContactIdByContactId(context, contactId);
        ContentValues values1 = new ContentValues();
        values1.put(Phone.PHONE_BLACKLIST, 1);
        //contentResolver.update(android.provider.ContactsContract.Data.CONTENT_URI, values1,
        //        Data.RAW_CONTACT_ID + " = ? AND " + Data.MIMETYPE + " = ?", new String[] {
        //                rawContactId + "", Phone.CONTENT_ITEM_TYPE
        contentResolver.update(android.provider.ContactsContract.Data.CONTENT_URI, values1,
                Data.RAW_CONTACT_ID + " = ?", new String[] {
                        rawContactId + ""
                });

  
  
   private void setTablesAndProjectionMapForContactsIsBlacklist(SQLiteQueryBuilder qb,
            String[] projection,
            boolean includeDataUsageStat, boolean isblacklist)
    {
        final String OUTER_DATA_RAW_CONTACTS_ID = Data.RAW_CONTACT_ID;


        StringBuilder sb = new StringBuilder();


        sb.append(Views.CONTACTS);


        if (isblacklist)
        {
            // if (ContactsDatabaseHelper.isInProjection(
            // projection, Tables.PHONE_BLACKLIST, Tables.PHONE_BLACKLIST))
            {
                sb.append(" INNER JOIN ");


                String toAppend =


                        " ((SELECT DISTINCT "
                                + Data.RAW_CONTACT_ID + " AS " + OUTER_DATA_RAW_CONTACTS_ID
                                // + "," + Tables.DATA + "." + Tables.PHONE_BLACKLIST + " AS " +
                                // Tables.PHONE_BLACKLIST


                                + " FROM " + Tables.DATA + " WHERE "
                                + "("
                                + Tables.DATA + "." + Phone.PHONE_BLACKLIST + "=" + 1
                                + " AND "
                                + DataColumns.CONCRETE_MIMETYPE_ID + "="
                                + "(SELECT " + MimetypesColumns._ID
                                + " FROM " + Tables.MIMETYPES
                                + " WHERE "
                                + MimetypesColumns.CONCRETE_MIMETYPE + "="
                                + "'" + Phone.CONTENT_ITEM_TYPE + "'"
                                + ")"
                                + ")"


                                + ")" + " AS blacklist_number_table" + ")"
                                + " ON ("
                                + OUTER_DATA_RAW_CONTACTS_ID + "=" + Views.CONTACTS + "."
                                + Contacts.NAME_RAW_CONTACT_ID + ")";


                sb.append(toAppend);
            }
        }
        else
        {
            // if (ContactsDatabaseHelper.isInProjection(
            // projection, Tables.PHONE_BLACKLIST, Tables.PHONE_BLACKLIST))
            {
                sb.append(" INNER JOIN ");


                String toAppend =


                        " ((SELECT DISTINCT "
                                + Data.RAW_CONTACT_ID + " AS " + OUTER_DATA_RAW_CONTACTS_ID
                                // + "," + Tables.DATA + "." + Tables.PHONE_BLACKLIST + " AS " +
                                // Tables.PHONE_BLACKLIST


                                + " FROM " + Tables.DATA + " WHERE "
                                + "("
                                + Tables.DATA + "." + Phone.PHONE_BLACKLIST + "=" + 0
                                + " AND "
                                + DataColumns.CONCRETE_MIMETYPE_ID + "="
                                + "(SELECT " + MimetypesColumns._ID
                                + " FROM " + Tables.MIMETYPES
                                + " WHERE "
                                + MimetypesColumns.CONCRETE_MIMETYPE + "="
                                + "'" + Phone.CONTENT_ITEM_TYPE + "'"
                                + ")"
                                + ")"


                                + ")" + " AS blacklist_number_table" + ")"
                                + " ON ("
                                + OUTER_DATA_RAW_CONTACTS_ID + "=" + Views.CONTACTS + "."
                                + Contacts.NAME_RAW_CONTACT_ID + ")";


                sb.append(toAppend);
            }
        }
        // luyonggang 2015-03-25 modified begin for debug
        Log.i(TAG,
                "setTablesAndProjectionMapForContactsIsBlacklist--->projection:"
                        + Arrays.toString(projection));
        Log.i(TAG, "setTablesAndProjectionMapForContactsIsBlacklist--->sb1:" + sb);
        // luyonggang 2015-03-25 modified end for debug
        appendContactPresenceJoin(sb, projection, Contacts._ID);
        appendContactStatusUpdateJoin(sb, projection, ContactsColumns.LAST_STATUS_UPDATE_ID);
        // luyonggang 2015-03-25 modified begin for debug
        Log.i(TAG, "setTablesAndProjectionMapForContactsIsBlacklist--->sb2:" + sb);
        // luyonggang 2015-03-25 modified end for debug
        qb.setTables(sb.toString());
        qb.setProjectionMap(sContactsProjectionMap);
    }

  
  
   }
        
ContentProvider往通訊錄添加聯系人和擷取聯系人