-1

Я разрабатываю приложение, в котором я перечисляю контакты устройства и выполняю некоторые манипуляции с ними. Я слушаю, чтобы связаться изменения, как описано в следующих ссылок: Link 1, Link 2Android: Вставить/Обновить/Удалить контакт

Мой код выглядит следующим образом:

public class ContactService extends Service { 
private int mContactCount; 
Cursor cursor = null; 
private int contactStateCheckingFlag=0; 
static ContentResolver mContentResolver = null; 

public static final String AUTHORITY = "com.example.contacts"; 
public static final String ACCOUNT_TYPE = "com.example.myapplication.account"; 
public static final String ACCOUNT = "myapplication";  
Account mAccount; 

Bundle settingsBundle;  
int i=0; 

@Override 
public IBinder onBind(Intent arg0) { 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate();// Get contact count at start of service 
    mContactCount = getContactCount(); 

    this.getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, mObserver); 
    Cursor curval = getApplicationContext().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, null, null, null); 

    if (curval != null && curval.getCount() > 0) { 
     curval.getCount(); 
    } 
    curval.close(); 
} 

private int getContactCount() { 
    try { 
     cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null,null); 
     if (cursor != null) { 
      return cursor.getCount(); 
     } else { 
      cursor.close(); 
      return 0; 
     } 
    } catch (Exception ignore) { 
    } finally { 
     cursor.close(); 
    }  
    return 0; 
} 

private ContentObserver mObserver = new ContentObserver(new Handler()) {   
    @Override 
    public void onChange(boolean selfChange) { 
     super.onChange(selfChange);   
     new ContactServiceAsyncClass().execute();   
    }  
}; 

private class ContactServiceAsyncClass extends AsyncTask<Void, Void, Void> { 
    ArrayList<Integer> arrayListContactID = new ArrayList<Integer>(); 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute();   
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     // Get the current count of contacts 
     int currentCount = getContactCount(); 

     // Add New Contact 
     if (currentCount > mContactCount){ 
      Cursor contactCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 

      if (contactCursor.getCount()<=0) { 
       Log.d("Contact Cursor count"," is zero"); 
      }else { 
       Log.d("Contact Cursor count", " > 0");     
       // Fetch all contact ID from cursor 
       if(contactCursor.moveToFirst()){ 
        do {  
         int contactID = contactCursor.getInt(contactCursor.getColumnIndex(ContactsContract.Data._ID)); 
         arrayListContactID.add(contactID); 
        } while (contactCursor.moveToNext()); 
       }     
       // Sort the array list having all contact ID 
       Collections.sort(arrayListContactID); 
       Integer maxID=Collections.max(arrayListContactID); 
       Log.d("maxID", ""+maxID);     
       // Get details of new added contact from contact id 
       String whereName = ContactsContract.Data._ID + " = ?";// Where condition 
       String[] whereNameParams = new String[] { ""+maxID}; // Pass maxID 
       Cursor cursorNewContact = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, whereName, whereNameParams, null); 

       if(cursorNewContact.getCount()<=0){ 
       }else { 
        if(cursorNewContact.moveToFirst()){ 
         do{ 
          // Fetch new added contact details 
         } while(cursorNewContact.moveToNext()); 
        } 
       } 
       cursorNewContact.close(); 
      } 
      contactCursor.close(); 
     } else if(currentCount < mContactCount){ 
      // Delete Contact/ 
      // CONTACT DELETED. 
     } else if(currentCount == mContactCount){ 
      // Update Contact1 
     }    
     mContactCount = currentCount; 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
    } 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
} 
} 

Я могу принести новый добавленный контакт. Вопрос в том, как удалить и обновить контакт? Как узнать, какой контакт удален и обновлен, поскольку трансляция изменения контакта не указывает идентификатор измененного контакта?

Просьба представить ваши ценные советы и подробно посоветуйте мне.

спасибо.

ответ

0

Для операции удаления

1.First хранить предыдущий список контактов ид в локальной базе данных.

, например: вы добавили контактные id`s являются 123,124,125.

Теперь мы предполагаем, что ваш последний добавленный контакт() удален.

Как мы его находим ?.

простой сначала получите список старых контактов. и сравнить с текущим списком контактов.

Если старый элемент списка контактов не входит в новый список, этот контакт удаляется с телефона.

Примечание: Если операция удаления завершена, вам необходимо обновить идентификатор контакта в БД.

Для операции обновления,

1.Use версия флаг для указания каких-либо изменений в вашем контакт.

2.VERSION значение по умолчанию равно 1. Если при изменении контактов, он автоматически увеличится до 2.

3.So вам нужно сохранить старое значение версии в вашей локальной БД. и сравните увеличение значения версии или нет. Если увеличить значение VERSION, вам необходимо обновить этот контакт.

См официальную ссылку,

https://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html

Для полного проекта,

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.0.4_r2.1/com/android/exchange/adapter/ContactsSyncAdapter.java?av=f

+0

Спасибо за ценный ответ. Я ищу об удалении и нашел флаг удаления в контактах, которые хранят удаленный контакт в течение 30 дней. Но эффективна ли она и есть ли у вас какие-либо обновления? –

+0

Я знаю только флаг обновления, используя VERSION & DIRTY. Я не знаю о флаге удаления. – stacktry

+0

Спасибо за ваш ответ ... –

Смежные вопросы