5

Ich entwickle eine Anwendung, in der ich an Android Contacts arbeite und nicht in der Lage bin voranzukommen. In der Anwendung muss der Kontakt, der aktualisiert wird, an den Server gesendet werden, oder der Kontakt, der gelöscht wird, sollte zur Synchronisierung an den Server gesendet werden.Android: Aktualisiere und lösche nur Kontakt

Ich bin mit dem Kontaktservice wie:

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

Die Themen i bin vor wie folgt:

A: In dem obigen Code für das Erhalten der aktualisiert Kontakt ich brauche Überprüfen Sie die Version von jedem Kontakt von Gerät mit meiner Datenbank gespeicherte Version von Kontakten. Das hat viel Zeit für eine große Anzahl von Kontakten benötigt.

B. Für gelöschte Kontakt bekommen ich, dass die Daten für die Raw-ID in der Datenbank gespeichert überprüfen müssen in Gerät vorhanden ist oder nicht. Wenn nicht, wird der Kontakt gelöscht. Es dauert auch zu viel Zeit, um ganze Kontakte zu überprüfen.

Aber die gleiche Kontaktauffrischung in was app in wenigen Sekunden wie 2 bis 3 Sekunden ...

EDIT getan: In dem obigen Code in folgenden Modul:

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

Ich legte das Protokoll. So wird die Update-Modul oft genannt, und auch wenn ich füge oder die Zeit löschen ...

Bitte leite mich und schlagen Sie mich, was das Timing für die oben genannten Aufgaben zu tun zu reduzieren ...

Antwort

2

Verwenden Sie die folgende Abfrage, um alle gelöschten und aktualisierten Kontakte abzurufen.

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

Vielen Dank für die Antwort. Aber über den Antworten gibt mir mein App-Account Kontakt gelöscht oder aktualisiert. Ich brauche alle Kontakte, die gelöscht oder aktualisiert werden. –

+0

Entfernen Sie einfach die Bedingung des Kontotyps aus dem wo, wenn Sie an allen Konten interessiert sind – RocketRandom

+0

Ich habe das auch versucht, aber viele gelöschte und aktualisierte Nummern. Die Notwendigkeit ist nur die letzte aktualisierte oder gelöschte Nummer. –

Verwandte Themen