Comment faire pour supprimer un contact programmatically dans android

j'ai essayer le code suivant pour supprimer un contact avec un nombre spécifié:

private void removeContact(Context context, String phone) {
    //context.getContentResolver().delete(Contacts.Phones.CONTENT_URI, phone, null);
    context.getContentResolver().delete(Contacts.Phones.CONTENT_URI,
          Contacts.PhonesColumns.NUMBER+"=?", new String[] {phone});
}

Mais j'obtiens cette exception:

java.lang.UnsupportedOperationException: Cannot delete that URL: content://contacts/phones
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:130)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:110)
    at android.content.ContentProviderProxy.delete(ContentProviderNative.java:362)
    at android.content.ContentResolver.delete(ContentResolver.java:386)
<!-Pouvez-vous s'il vous plaît me dire comment résoudre mon problème?

je vous Remercie.

21
demandé sur Arun J 2009-02-09 09:01:33

6 réponses

Pour supprimer tous les contacts utilisez le code suivant:

ContentResolver cr = getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
            null, null, null, null);
    while (cur.moveToNext()) {
        try{
            String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
            Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
            System.out.println("The uri is " + uri.toString());
            cr.delete(uri, null, null);
        }
        catch(Exception e)
        {
            System.out.println(e.getStackTrace());
        }
    }

Pour supprimer tout contact spécifique modifier la requête

cr.delete(uri, null, null);

j'Espère que ça aide!

20
répondu Prateek Jain 2011-09-28 19:27:04

c'est tout Ce dont nous avons besoin. Pour supprimer le Contact avec le numéro de téléphone et le nom donné

public static boolean deleteContact(Context ctx, String phone, String name) {
    Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phone));
    Cursor cur = ctx.getContentResolver().query(contactUri, null, null, null, null);
    try {
        if (cur.moveToFirst()) {
            do {
                if (cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME)).equalsIgnoreCase(name)) {
                    String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
                    ctx.getContentResolver().delete(uri, null, null);
                    return true;
                }

            } while (cur.moveToNext());
        }

    } catch (Exception e) {
        System.out.println(e.getStackTrace());
    } finally {
        cur.close();
    }
    return false;
}

Et rappeler à ajouter de lecture/écriture de contact avec la permission

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
16
répondu khaintt 2015-04-02 09:23:47

avez-vous les permissions appropriées déclarées dans votre manifeste?

vous aurez besoin de la android.permission.READ_CONTACTS et android.permission.WRITE_CONTACTS uses-permission balises avant de Android vous permettra de jouer avec les contacts fournisseur de:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.android.app.myapp" >

  <uses-permission android:name="android.permission.READ_CONTACTS" />
  <uses-permission android:name="android.permission.WRITE_CONTACTS" />

</manifest>
9
répondu Reto Meier 2009-02-09 08:59:41

Une réponse tardive, mais peut-être que ça aide quand même:

si vous regardez code source de ContactsProvider et rechercher " matcher.addURI" (ne soyez pas surpris si le chargement s'arrête au milieu... le chargement reprend après une minute ou deux), alors vous voyez qu'il a un ensemble fini de schémas URI qu'il peut gérer. Il dispose d'un gestionnaire pour "téléphones" /#" mais pas pour "téléphones", qui est ce que vous auriez besoin.

cela signifie qu'il n'y a tout simplement pas de code pour supprimer tous les numéros de téléphone, vous devez obtenir les Identifiants de tous les nombres premiers, puis supprimer chacun d'eux à un moment. Bien sûr, cela prend beaucoup plus de ressources PROCESSEUR et mémoire, mais au moins ça marche.

Le code suivant supprime un nombre spécifique. S'il Vous Plaît être conscient que je n'ai pas testé ce code, mais il est 90% identique au code que j'utilise pour supprimer tous les numéros d'une personne donnée, qui nécessite un traitement similaire beacause Android ne peut pas supprimer "personnes/ # / téléphones" mais "les gens/#/téléphones/#"

EDIT:je viens de réaliser que j'ai mal compris la question. J'ai pensé que vous aimeriez supprimer le numéro de téléphone, mon code ne. Mais maintenant je vois que vous voulez supprimer le contenu.

private void deletePhoneNumber(Uri peopleUri, String numberToDelete) {

    Uri.Builder builder = peopleUri.buildUpon();
    builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY);
    Uri phoneNumbersUri = builder.build();


    String[] mPhoneNumberProjection = { People.Phones._ID, People.Phones.NUMBER };
    Cursor cur = resolver.query(phoneNumbersUri, mPhoneNumberProjection,
            null, null, null);

    ArrayList<String> idsToDelete = new ArrayList<String>();

    if (cur.moveToFirst()) {
        final int colId = cur.getColumnIndex(People.Phones._ID);
        final int colNumber = cur.getColumnIndex(People.Phones.NUMBER);

        do {
            String id = cur.getString(colId);
            String number = cur.getString(colNumber);
            if(number.equals(numberToDelete))
                idsToDelete.add(id);
        } while (cur.moveToNext());
    }
    cur.close();

    for (String id : idsToDelete) {
        builder.encodedPath(People.Phones.CONTENT_DIRECTORY + "/" + id);
        phoneNumbersUri = builder.build();
        resolver.delete(phoneNumbersUri, "1 = 1", null);
    }
}

Le code est un peu verbeux, car il fait deux hypothèses:

  • il pourrait y avoir plusieurs lignes à supprimer (par exemple, le numéro est enregistré deux fois)
  • il pourrait être dangereux d'obtenir un curseur, supprimer une ligne, et gardez à l'aide du curseur

les deux hypothèses sont traitées en stockant d'abord le idsToDelete dans un ArrayList puis suppression.

Vous pouvez également envisager de normaliser le numéro que vous recherchez, et utilisez la Colonne People.Phones.NUMBER_KEY à la place, parce qu'il contient les nombres sous forme normalisée.

7
répondu Lena Schimmel 2009-05-25 18:11:32

une meilleure façon de supprimer un contact est de supprimer tous les contacts bruts en utilisant l'id du contact

    final ArrayList ops = new ArrayList();
    final ContentResolver cr = getContentResolver();
    ops.add(ContentProviderOperation
            .newDelete(ContactsContract.RawContacts.CONTENT_URI)
            .withSelection(
                    ContactsContract.RawContacts.CONTACT_ID
                            + " = ?",
                    new String[] { allId.get(i) })
            .build());

        try {
            cr.applyBatch(ContactsContract.AUTHORITY, ops);
            int deletecontact = serialList.get(allId.get(i));

        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            e.printStackTrace();
        }
        //background_process();
        ops.clear();
    }

et n'oubliez pas d'ajouter des autorisations

        <uses-permission android:name="android.permission.READ_CONTACTS"/>
        <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
1
répondu Anish Bhandari 2017-06-23 10:57:04
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
        null, null, null, null);
while (cur.moveToNext()) {
    try{
        String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
        Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
        System.out.println("The uri is " + uri.toString());
        cr.delete(uri, null, null);
    }
    catch(Exception e)
    {
        System.out.println(e.getStackTrace());
    }
}

j'ai utilisé ce code pour supprimer les contacts.Il supprimera les contacts sim ainsi que les contacts téléphoniques ou seulement les contacts stockés dans le stockage de téléphone.

0
répondu Tirtha 2012-08-07 11:26:25