web-dev-qa-db-ja.com

プログラムで連絡先を削除する方法android

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

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)

問題の解決方法を教えていただけますか?

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

25
yinglcs

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

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

それが役に立てば幸い!

22
Prateek Jain

これで十分です。指定された電話番号と名前の連絡先を削除するには

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
khaintt

遅い答えですが、とにかくそれは役に立ちます:

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

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

次のコードは、特定の番号を削除します。このコードはテストしていませんが、特定の人物のすべての番号を削除するために使用するコードと90%同一であることに注意してください。Androidは "people /#/電話」、「人/#/電話/#」

編集:質問を誤解していることに気づきました。私のコードが行う電話番号を削除したいと思いました。しかし今、私はあなたが連絡先を削除したいと思っています。

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回保存される)
  • カーソルを取得し、行を削除して、カーソルを使い続けるのは安全ではないかもしれません

両方の仮定は、最初にidsToDeleteArrayListに格納してから削除することで処理されます。

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

7
Lena Schimmel

連絡先を削除するより良い方法は、連絡先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();
    }

権限を追加することを忘れないでください

        <uses-permission Android:name="Android.permission.READ_CONTACTS"/>
        <uses-permission Android:name="Android.permission.WRITE_CONTACTS"/>
1
Anish Bhandari

このコードは、連絡先を識別子から削除するのに最適です(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()
                }
            }
}
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の連絡先と電話の連絡先、または電話のストレージに保存されている連絡先のみが削除されます。

0
Tirtha