5

Sto sviluppando un'applicazione in cui sto lavorando su Contatti Android e non posso andare avanti. In app la necessità dell'applicazione è che il contatto che viene aggiornato deve essere inviato al server o il contatto che viene eliminato deve essere inviato al server per la sincronizzazione.Android: ricevi solo contatti aggiornati e cancellati

Sto usando il servizio di contatto come:

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 
    } 
} 

I problemi che sto affrontando sono i seguenti:

A: Nel codice qui sopra per ottenere il contatto recentemente aggiornato ho bisogno per controllare la versione di ogni contatto da dispositivo con la mia versione memorizzata nel database dei contatti. Il che ha richiesto molto tempo per una grande quantità di contatti.

B. Per ottenere contatto eliminato ho bisogno di verificare che i dati per la id Raw memorizzati nel mio database è presente nel dispositivo o meno. In caso contrario, il contatto viene eliminato. Ci vuole anche troppo tempo per controllare tutti i contatti.

Ma la stessa cosa di aggiornamento contatto è fatto in che cosa è app in pochi secondi come 2 o tre secondi ...

EDIT: Nel codice sopra nella seguente modulo:

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"); 
} 

Ho messo il registro. Così il modulo di aggiornamento è chiamato molte volte, e anche quando faccio aggiungere o eliminare quel tempo troppo ...

per favore mi guida e mi suggerisce cosa fare per ridurre i tempi per i compiti di cui sopra ...

risposta

2

usa la query qui sotto per ottenere tutti i contatti cancellati e aggiornati.

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

Grazie per la risposta. Ma sopra le risposte mi dà il mio account account contatti cancellati o aggiornati. Ho bisogno di tutti i contatti che vengono cancellati o aggiornati. –

+0

Basta rimuovere la condizione del tipo di account dal dove se sei interessato a tutti gli account – RocketRandom

+0

Ho provato anche quello, ma ricevendo molti numeri cancellati e aggiornati. La necessità è solo l'ultimo numero aggiornato o cancellato. –