Если вы проверите typeof любого вложенного (или родительского) FormGroup
, он всегда будет возвращать объект. так что вы можете просто преобразовать вашу переменную типа объекта следующим образом -
apiForm : Object;
...
this.apiForm = this.serviceItemForm.get('api');
Иначе, вы можете выполнить приведение типов во время присвоения значения такой переменной -
apiForm : FormGroup;
this.apiForm = (<FormGroup>this.serviceItemForm.get['api']);
Чтобы удалить все контакты, используйте следующий код:
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);
Надеюсь, это поможет!
Это все, что нам нужно. Удалить контакт с указанным номером телефона и именем
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" />
Вам объявляли соответствующие полномочия в Вашей декларации?
Вам будет нужно 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>
Поздний ответ, но, может быть, он все равно поможет:
Если вы посмотрите на исходный код 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
, поскольку он содержит числа в нормализованной форме.
Лучший способ удалить контакт - удалить все необработанные контакты, используя идентификатор контакта
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"/>
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());
}
}
Я использовал этот код для удаления контактов. Он будет удалять как сим-контакты, так и телефонные контакты или только контакты, хранящиеся в памяти телефона.
Этот код идеально подходит для удаления контакта из его идентификатора ( 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()
}
}
}