27

次のコードを試して、指定された番号の連絡先を削除します。

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

しかし、私はこの例外を受け取ります:

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)

私の問題を解決する方法を教えてください。

ありがとうございました。

4

7 に答える 7

23

すべての連絡先を削除するには、次のコードを使用します。

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

それが役に立てば幸い!

于 2010-11-22T10:59:49.783 に答える
20

必要なのはこれだけです。指定された電話番号と名前の連絡先を削除するには

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" />
于 2012-04-07T22:09:29.890 に答える
9

マニフェストで適切なアクセス許可が宣言されていますか?

Android で連絡先プロバイダーを操作できるようにするには、android.permission.READ_CONTACTSおよびuses-permission タグが必要です。android.permission.WRITE_CONTACTS

<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>
于 2009-02-09T08:59:41.150 に答える
7

遅い答えですが、とにかく役立つかもしれません:

ContactsProvider のソース コードを見て「matcher.addURI」を検索すると (途中で読み込みが停止しても驚かないでください... 1 ~ 2 分後に読み込みが再開されます)、処理できる URI スキームの有限セット。「phones/#」のハンドラーがありますが、「phones」のハンドラーはありません。これが必要です。

つまり、すべての電話番号を削除するコードはありません。最初にすべての番号の ID を取得してから、一度に 1 つずつ削除する必要があります。もちろん、これにはより多くの CPU とメモリ リソースが必要ですが、少なくとも機能します。

次のコードは、特定の番号を削除します。私はこのコードをテストしていませんが、特定の人のすべての番号を削除するために使用するコードと 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);
    }
}

このコードは、次の 2 つの前提があるため、少し冗長です。

  • 削除する行が複数ある可能性があります (たとえば、番号が 2 回保存されます)。
  • カーソルを取得し、行を削除し、カーソルを使い続けることは安全ではない可能性があります

両方の仮定は、最初に を に格納してから削除することによって処理されidsToDeleteますArrayList

正規化された形式の数値が含まれているため、検索する数値を正規化し、People.Phones.NUMBER_KEY代わりに列を使用することも検討してください。

于 2009-05-25T17:51:46.163 に答える
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());
    }
}

このコードを使用して連絡先を削除しました。sim の連絡先と電話の連絡先、または電話のストレージに保存されている連絡先のみを削除します。

于 2012-08-07T11:26:25.783 に答える