Android 連絡先一覧表示・一括削除プログラム

soft-icon-android.png Android 連絡先一覧表示・一括削除プログラム
Android Contacts Editor (> Android 4.1)


戻る一つ前のメニューに戻る

目次

ソフトウエアのダウンロード

soft-ico-download.gif Javaソースコード・apkファイルをSubversionブラウザよりダウンロード
soft-ico-download.gif Javaソースコード・apkファイルをGitHubブラウザよりダウンロード
soft-ico-download.gif Android Studioプロジェクトの全ファイルをGoogleドライブよりダウンロード


機能の概要

Androidの標準機能「連絡先(Contacts)」のデータを、名前・電話番号でフィルタリングして一覧表示・一括削除するプログラム。

android-contactsedit-mainscr.jpg
起動直後の画面、ポップアップ・メニューを表示したところ

android-contactsedit-searchscr.jpg
一覧表示の検索条件入力用アクション・ダイアログ表示

連絡先はSQLiteで内部処理されているため、検索条件もSQLite準拠のSQL文が利用可能。つまり、「%」文字は0文字以上の任意の文字に一致し、「_」は任意の1文字に一致する。

「,」(コンマ)で区切って、複数の検索を実行できるようにしている。

検索文字はプレースホルダで渡しているが、どこまで不正な構文を除去してくれるかわからないため、入力文字列がSQL文法の一部にならないよう注意して使うほうがよい。

android-contactsedit-setupscr.jpg
設定用アクション・ダイアログ表示

検索条件の名前・電話番号をプロファイルに記憶させておくための設定画面。


動作確認済み

SDK API16で構築したため、Android 4.1 以降のみで実行可能

  • Android 4.1.2
  • Android 5.0
  • Android 6.0


インストール方法

apkファイルをインストールできるファイラーを用いるか、パソコンと接続してadbコマンドより次のコマンドを実行する。

adb install app-release.apk


開発の背景

高層マンション居住で「ほぼ電波圏外」のため、「弱すぎる電波」をサーチするスマートフォンのバッテリーの消費が猛烈に早い。どうせ使えないならスマートフォンの寿命を伸ばすためにも、部屋に帰るとスマートフォンの電源OFF。翌朝ONを繰り返している。

それに伴って、NTTドコモ製のSIMカードがスマートフォン起動毎にサービスダイヤル番号新たに追加するので、連絡先が不要なサービスダイヤル番号で膨れ上がってしまう。これを一括削除するために作成したソフトウエア。

android-contactsedit-servicedial.jpg
再起動毎に追加されていくNTTドコモのサービスダイヤル番号

プログラム解説

Android連絡先は、「ID,名前,誕生日,...」を格納しているContactsデータベースと「ID,ID_Contacts,電話番号」「ID,ID_Contacts,email」… など一人が複数の値を持つことの出来る属性を格納しているデータベースからできている。

Contactsデータベース内のみで完結する「名前で検索」であれば、単純に次のようなプログラムで可能。

  /**
   * 指定された名前文字列に一致する連絡先アイテムを画面表示用文字列に格納する。
   *
   * @param names 検索条件となる名前文字列(複数はコンマ区切り)
   * @return 名前・email・電話番号を格納した文字列が返される
   */
  private String getContactsByName(String names) {
    String strTemp = "";
    Cursor cr = null;
    try {
      String sql = ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?";
      String[] arrayName = names.split(",", 0);
      for (String _name : arrayName) {
        String[] args = {_name};
        strTemp += ("検索キーワード=" + _name + "\n");
        cr = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, sql, args,
                null);
        if (cr != null) {
          if (cr.moveToFirst()) {
            do {
              // データIDの表示
              String id = cr.getString(cr.getColumnIndexOrThrow(ContactsContract.CommonDataKinds
                      .Identity._ID));
              strTemp += ("id=" + id + "\n");
              // 表示名・電話番号・emailの表示
              strTemp += getContactData(id);
              // =====
              strTemp += "=====\n";
            } while (cr.moveToNext());
          }
        }
      }
    } catch (Exception e) {
      strTemp += (e.getMessage() + "\n");
    } finally {
      if (cr != null && !cr.isClosed()) cr.close();
    }
 
    return (strTemp);
  }

「電話番号で検索」する場合は、このリレーショナル・データベース構造を意識して、電話番号データベースのCONTACT_IDがContactsデータベースのIDに一致するということを用いて2段階で検索をかける必要がある。

  /**
   * 指定された電話番号文字列に一致する連絡先アイテムを画面表示用文字列に格納する。
   *
   * @param phones 検索条件となる電話番号文字列(複数はコンマ区切り)
   * @return 名前・email・電話番号を格納した文字列が返される
   */
  private String getContactsByPhone(String phones) {
    String strTemp = "";
    Cursor cr = null;
    try {
      String sql = ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE ?";
      String[] arrayPhone = phones.split(",", 0);
      for (String _phone : arrayPhone) {
        String[] args = {_phone};
        strTemp += ("検索キーワード=" + _phone + "\n");
        cr = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                sql, args, null);
        if (cr != null) {
          if (cr.moveToFirst()) {
            do {
              // データIDの表示
              String id = cr.getString(cr.getColumnIndexOrThrow(ContactsContract.CommonDataKinds
                      .Phone.CONTACT_ID));
              strTemp += ("id=" + id + "\n");
              // 表示名・電話番号・emailの表示
              strTemp += getContactData(id);
              // =====
              strTemp += "=====\n";
            } while (cr.moveToNext());
          }
        }
      }
    } catch (Exception e) {
      strTemp += (e.getMessage() + "\n");
    } finally {
      if (cr != null && !cr.isClosed()) cr.close();
    }
    return (strTemp);
  }

このように検索はquery関数で行うことができ、削除は次のようにdelete関数で簡単に行える。

  /**
   * 指定された名前文字列に一致する連絡先アイテムを一括削除する。
   *
   * @param names 検索条件となる名前文字列(複数はコンマ区切り)
   * @return 削除したアイテムのid及び削除総数を格納した文字列が返される
   */
  private String deleteContactsByName(String names) {
    String strTemp = "";
    Cursor cr = null;
    int count = 0;
    try {
      String sql = ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?";
      String[] arrayName = names.split(",", 0);
      for (String _name : arrayName) {
        String[] args = {_name};
        strTemp += ("検索キーワード=" + _name + "\n");
        cr = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, sql, args,
                null);
        if (cr != null) {
          if (cr.moveToFirst()) {
            do {
              // データIDの表示
              String id = cr.getString(cr.getColumnIndexOrThrow(ContactsContract.CommonDataKinds
                      .Identity._ID));
              strTemp += ("id=" + id + " deleted\n");
              // 削除
              Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, cr
                      .getString(cr.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)));
              count += getContentResolver().delete(uri, null, null);
            } while (cr.moveToNext());
          }
        }
      }
      strTemp += (count + "件削除\n");
    } catch (Exception e) {
      strTemp += (e.getMessage() + "\n");
    } finally {
      if (cr != null && !cr.isClosed()) cr.close();
    }
 
    return (strTemp);
  }


バージョンアップ情報

  • Version 1.0 (2016/12/23)
    当初


関連ソフトウエア

使用許諾条件

GNU GPL フリーソフトウエア

GNU 一般公衆利用許諾書 (GNU General Public License v3)

戻る一つ前のメニューに戻る