Jak odstranit kontakt programově v android

hlasů
20

Snažím následující kód odebrat kontakt s určitého počtu:

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

Ale jsem si tuto výjimku:

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)

Můžete mi říct, jak vyřešit můj problém?

Děkuji.

Položena 09/02/2009 v 07:01
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
19

Chcete-li odstranit všechny kontakty použít následující kód:

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

Chcete-li odstranit žádnou konkrétní kontakt upravit dotaz

cr.delete(uri, null, null);

Doufám, že to pomůže!

Odpovězeno 22/11/2010 v 11:59
zdroj uživatelem

hlasů
15

To je vše, co potřebujeme. Chcete-li odstranit Spojit se s telefonním číslem a jménem daného

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

A připomínají přidat kontakt oprávnění pro čtení / zápis

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
Odpovězeno 07/04/2012 v 23:09
zdroj uživatelem

hlasů
9

Máte příslušná oprávnění deklaroval ve svém manifestu?

Budete potřebovat android.permission.READ_CONTACTSi android.permission.WRITE_CONTACTSpoužití-oprávnění tagy před Android vám umožní nepořádek s poskytovatelem kontakty:

<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>
Odpovězeno 09/02/2009 v 09:59
zdroj uživatelem

hlasů
7

Pozdní odpověď, ale možná to pomůže tak jako tak:

Podíváte-li se do zdrojového kódu ContactsProvider a hledat „matcher.addURI“ ( nebuďte překvapeni, pokud se zastaví načítání uprostřed ... to obnoví načítání po jednu nebo dvě minuty ), pak zjistíte, že to má konečná množina schémat URI, že to zvládne. To má ovladač pro „telefony / #“, ale ne pro „telefony“, což je to, co budete potřebovat.

To znamená, že tam je jen žádný kód pro vymazání všech telefonních čísel, musíte se dostat identifikátory všech čísel a teprve potom odstraňte každý jeden po druhém. Samozřejmě to trvá mnohem více CPU a paměťové zdroje, ale aspoň to funguje.

Následující kód odstraní určitý počet. Uvědomte si, že jsem se otestovat tento kód, ale to je z 90% identický s kódem mohu použít k vymazání všech čísel dané osoby, který potřebuje podobnou léčbu beacause Android nelze odstranit „Lidé / # / telefon“, ale " people / # / telefony / #“

EDIT: Jen jsem si uvědomil, že jsem nepochopil otázku. Myslel jsem, že byste chtěli odstranit telefonní číslo, které můj kód dělá. Ale teď vidím, že chcete smazat contanct.

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

Tento kód je trochu upovídaný, protože to dělá dva předpoklady:

  • tam mohl být více řádků odstranit (např číslo je uloženo dvakrát)
  • to by mohlo být nebezpečné dostat kurzor, odstranit řádek a udržovat pomocí kurzoru

Oba předpoklady jsou zpracovány tak, že nejprve uložením idsToDeleteAn ArrayLista mazání.

Můžete také zvážit normalizovat číslo, které vyhledávat a používat Sloupec People.Phones.NUMBER_KEYmísto, protože obsahuje čísla v normalizované formě.

Odpovězeno 25/05/2009 v 18:51
zdroj uživatelem

hlasů
0

Tento kód funguje perfektní pro mě odstranit kontakt ze svého identifikátoru ( ContactsContract.Contacts._ID )

Telefon registrace pro všechna čísla daného kontaktu musí být odstraněny samostatně

  fun deleteContactById(id: String) {
      val cr = context.contentResolver
      val cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
                    null, null, null, null)
      cur?.let {
          try {
                    if (it.moveToFirst()) {
                        do {
                            if (cur.getString(cur.getColumnIndex(ContactsContract.PhoneLookup._ID)) == id) {
                                val lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY))
                                val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey)
                                cr.delete(uri, null, null)
                                break
                            }

                        } while (it.moveToNext())
                    }

                } catch (e: Exception) {
                    println(e.stackTrace)
                } finally {
                    it.close()
                }
            }
}
Odpovězeno 23/03/2019 v 17:01
zdroj uživatelem

hlasů
0

Lepší způsob, jak odstranit kontakt je tím, že odstraní všechny syrové kontaktů pomocí kontaktních id

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

a nezapomeňte přidat oprávnění

        <uses-permission android:name="android.permission.READ_CONTACTS"/>
        <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
Odpovězeno 23/06/2017 v 10:57
zdroj uživatelem

hlasů
0
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());
    }
}

Použil jsem tento kód odstranit contacts.It smaže sim kontakty stejně kontaktů v telefonu nebo pouze kontaktů uložených v paměti telefonu.

Odpovězeno 07/08/2012 v 12:26
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more