Как удалить контакт программно в андроиде

Если вы проверите typeof любого вложенного (или родительского) FormGroup, он всегда будет возвращать объект. так что вы можете просто преобразовать вашу переменную типа объекта следующим образом -

apiForm : Object;
...
this.apiForm = this.serviceItemForm.get('api');

Иначе, вы можете выполнить приведение типов во время присвоения значения такой переменной -

apiForm : FormGroup;
this.apiForm = (<FormGroup>this.serviceItemForm.get['api']);
24
задан Arun J 26 March 2018 в 12:04
поделиться

7 ответов

Чтобы удалить все контакты, используйте следующий код:

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

Чтобы удалить любой конкретный контакт, измените запрос

cr.delete(uri, null, null);

Надеюсь, это поможет!

21
ответ дан Tim Cooper 28 November 2019 в 22:53
поделиться

Это все, что нам нужно. Удалить контакт с указанным номером телефона и именем

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

и напомнить добавить разрешение на чтение / запись контакта

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
19
ответ дан rude 28 November 2019 в 22:53
поделиться

Вам объявляли соответствующие полномочия в Вашей декларации?

Вам будет нужно android.permission.READ_CONTACTS и android.permission.WRITE_CONTACTS теги разрешения использования, прежде чем Android позволит Вам смешать с поставщиком контактов:

<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
ответ дан Reto Meier 28 November 2019 в 22:53
поделиться

Поздний ответ, но, может быть, он все равно поможет:

Если вы посмотрите на исходный код ContactsProvider и поищите «matcher.addURI» ( не будет Удивлен, если он перестает загружаться посередине ... он возобновляет загрузку через минуту или две ), тогда вы видите, что у него есть конечный набор схем URI, которые он может обработать. Он имеет обработчик для «телефонов / #», но не для «телефонов», который вам нужен.

Это означает, что просто нет кода для удаления всех телефонных номеров, вы должны сначала получить идентификаторы всех номеров, а затем удалять каждый из них за раз. Конечно, это требует гораздо больше ресурсов процессора и памяти, но, по крайней мере, это работает.

Следующий код удаляет конкретный номер. Имейте в виду, что я не тестировал этот код, но он на 90% идентичен коду, который я использую для удаления всех номеров данного человека, который нуждается в аналогичной обработке, потому что Android не может удалить "люди / # / телефоны", но " people / # / phones / # "

РЕДАКТИРОВАТЬ: Я только что понял, что неправильно понял вопрос. Я думал, что вы хотели бы удалить номер телефона, что мой код делает. Но теперь я вижу, что вы хотите удалить объект.

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

Код немного многословен, потому что он делает два предположения:

  • может быть несколько строк для удаления (например, число сохраняется дважды)
  • может быть небезопасным, чтобы получить курсор, удалить строку и продолжать использовать курсор

Оба предположения обрабатываются сначала сохранением idsToDelete в ArrayList, а затем удалением.

Вы также можете подумать о нормализации искомого числа и использовать вместо него столбец People.Phones.NUMBER_KEY, поскольку он содержит числа в нормализованной форме.

7
ответ дан Lena Schimmel 28 November 2019 в 22:53
поделиться

Лучший способ удалить контакт - удалить все необработанные контакты, используя идентификатор контакта

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

, и не забудьте добавить разрешения

        <uses-permission android:name="android.permission.READ_CONTACTS"/>
        <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
1
ответ дан Anish Bhandari 28 November 2019 в 22:53
поделиться
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());
    }
}

Я использовал этот код для удаления контактов. Он будет удалять как сим-контакты, так и телефонные контакты или только контакты, хранящиеся в памяти телефона.

0
ответ дан Tirtha 28 November 2019 в 22:53
поделиться

Этот код идеально подходит для удаления контакта из его идентификатора ( ContactsContract.Contacts._ID )

Регистрация по телефону для всех номеров этого контакта должна быть удалена независимо

  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()
                }
            }
}
0
ответ дан Sergio Sánchez Sánchez 28 November 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: