2017-08-30 3 views
-1

J'ai essayé d'obtenir des contacts que j'ai vu qu'il a besoin de temps pour attendre. Donc, j'ai essayé de le faire en tâche asynchrone avec l'écriture de contacts à l'application db. Voici ma tentative a échoué:comment obtenir des contacts de téléphone dans la tâche asynchrone?

public class GetUpdateContactsTask extends AsyncTask<Void, Contact, Void> { 

private static final String TAG = "lifeCycle"; 
private Context mContext; 

public GetUpdateContactsTask (Context context){ 
    mContext = context; 
} 
public interface OnFinishListener{ 
    void onFinish(); 
} 

public OnFinishListener finishListener; 

public void setFinishListener(OnFinishListener finishListener){ 
    this.finishListener = finishListener; 
} 

@Override 
protected void onPreExecute() { 
} 


@Override 
protected Void doInBackground(Void... params) { 
    ContentResolver cr = mContext.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
    if (cur.getCount() > 0) { // here is an NullPointerException error 
     while (cur.moveToNext()) { 
      String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      if (cur.getInt(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) { 
       Cursor pCur = cr.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 
       while (pCur.moveToNext()) { 
        String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        Contact contact = new Contact(); 
        contact.setName(name); 
        contact.setPhoneNumber(phoneNo); 
        publishProgress(contact); 
       } 
       pCur.close(); 
      } 
     } 
    } 
    return null; 
} 

@Override 
protected void onProgressUpdate(Contact... values) { 
    Contact contact = values[0]; 
    String name = contact.getName(); 
    String phoneNumber = contact.getPhoneNumber(); 
    if (!phoneNumber.equals("not valid")){ 
     Log.e(TAG, name + ": " + phoneNumber); 
     if(!DataHelper.getInstance().isContactIsset(values[0])){ 
      DataHelper.getInstance().saveContact(values[0]); 
      Log.e(TAG, "contact saved"); 
     } else { 
      Log.e(TAG, "contact is isset"); 
     } 
    } 
} 

@Override 
protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 
    finishListener.onFinish(); 
} 

}

ça fonctionne pas. Il y a une erreur nullpointerexception sur le curseur. Ce sera bien si vous aidez à corriger ma version, mais ce sera génial si vous montrez votre meilleure solution. Merci

+0

double possible de [android obtenir tous les contacts] (https://stackoverflow.com/questions/12562151/android-get-all-contacts) – Yoni

+0

Oui, mon code à partir de là. Et j'essaye de le faire dans la tâche asynchrone ... –

+0

juste employez le cadre [loader] (https://developer.android.com/guide/components/loaders.html) avec 'CursorLoader' – pskink

Répondre

0

Affiches originales solution incorrectement publié à la question

Le problème était dans l'application Lenovo Security. Il bloque l'accès aux contacts. J'ai donc ajouté mon application à la liste blanche et le problème a été résolu!

0

Vous retournez null de méthode doInBackground et obtenir résultat dans onProgressUpdate, il est utilisé pour état d'avancement de la mise à jour, au lieu

return contact; 

puis obtenir le résultat de la méthode onPostExecute, comme ci-dessous

@Override 
     protected void onPostExecute(Contact values) { 
      super.onPostExecute(values); 

      Contact contact = values[0]; 
      String name = contact.getName(); 
      ............... 
      ............... 

     }