5

Pracuję nad aplikacją, w której pracuję nad kontaktami Android i nie jestem w stanie iść do przodu. W aplikacji potrzebna jest aplikacja, aby zaktualizowany kontakt był wysyłany na serwer lub usunięty kontakt powinien być wysyłany na serwer w celu zsynchronizowania.Android: Otrzymuj tylko zaktualizowany i usunięty kontakt.

Używam usługę kontaktów jako:

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

    // Content provider authority 
    public static final String AUTHORITY = "com.android.contacts"; 
    // Account typek 
    public static final String ACCOUNT_TYPE = "com.example.myapp.account"; 
    // Account 
    public static final String ACCOUNT = "myApp"; 

    // Instance fields 
    Account mAccount; 
    Bundle settingsBundle; 

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // Get contact count at start of service 
     this.getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, mObserver); 
     return Service.START_STICKY; 
    } 

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

    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) { 
      this.onChange(selfChange, null); 
     } 

     @Override 
     public void onChange(boolean selfChange, Uri uri) { 
      new changeInContact().execute(); 
     } 
    }; 

    public class changeInContact extends AsyncTask<String, Void, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected String doInBackground(String... arg0) { 
      ArrayList<Integer> arrayListContactID = new ArrayList<Integer>(); 

      int currentCount = getContactCount(); 

      if (currentCount > mContactCount) { 
       // Contact Added 
      } else if (currentCount < mContactCount) { 
       // Delete Contact    
      } else if (currentCount == mContactCount) {    
       // Update Contact 
      } 
      mContactCount = currentCount; 
      return ""; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      contactService = false; 
     } // End of post 
    } 
} 

Kwestie Jestem stoi przedstawiają się następująco:

A: W powyższym kodzie na uzyskanie niedawno zaktualizowany kontakt i potrzeba aby sprawdzić Version każdego kontaktu z urządzenie z moją przechowywaną bazą danych zapisaną w wersji. Co zajęło dużo czasu dla dużej ilości kontaktów.

B. Uzyskania usunięty kontakt muszę sprawdzić, czy dane dla Raw ID przechowywane w mojej bazy danych jest obecny w urządzeniu lub nie. Jeśli nie, kontakt zostanie usunięty. Sprawdzanie całych kontaktów zajmuje również zbyt dużo czasu.

Ale ten sam kontakt rzeczą odświeżania odbywa się co jest aplikacją w niewielu sekund jak 2 do trzech sekund ...

EDIT: W powyższym kodzie w następujących modułów:

if (currentCount > mContactCount) { 
    // Contact Added 
    Log.d("In","Add"); 
} else if (currentCount < mContactCount) { 
    // Delete Contact    
    Log.d("In","Delete"); 
} else if (currentCount == mContactCount) {    
    // Update Contact 
    Log.d("In","Update"); 
} 

Położyłem dziennik. Moduł aktualizacji tak nazywa się wielokrotnie, a także kiedy należy dodawać lub usuwać, że czas też ...

proszę kierować do mnie i sugerują mi, co zrobić, aby zmniejszyć taktowanie dla powyższych zadań ...

Odpowiedz

2

użyj poniższej kwerendy, aby uzyskać wszystkie usunięte i zaktualizowane kontakty.

public static final String ACCOUNT_TYPE = "com.android.account.youraccounttype" 
public static final String WHERE_MODIFIED = "("+RawContacts.DELETED + "=1 OR "+ 
      RawContacts.DIRTY + "=1) AND "+RawContacts.ACCOUNT_TYPE+" = '"+ ACCOUNT_TYPE+"'"; 

c = contentResolver.query(ContactsContract.RawContacts.CONTENT_URI, 
        null, 
        WHERE_MODIFIED, 
        null, 
        null); 
+0

Dziękuję za odpowiedź. Ale powyższe odpowiedzi pozwalają mi usunąć kontakt z moim kontem aplikacji. Potrzebuję wszystkich kontaktów, które zostały usunięte lub zaktualizowane. –

+0

Po prostu usuń warunek typu konta z miejsca, gdzie jesteś zainteresowany wszystkimi kontami – RocketRandom

+0

Próbowałem tego również, ale otrzymuję wiele usuniętych i zaktualizowanych numerów. Potrzeba jest tylko najnowszym zaktualizowanym lub usuniętym numerem. –