Android4.0(ICS)から、Androidは所有者の個人情報(UserProfile)を持つようになりました。
UserProfileは、Peopleアプリケーションを初めて起動した時に登録を促されます。
スクリーンショットはPeopleアプリケーションでのUserProfile登録画面
本エントリでは、この新たに追加されたUserProfileを読み出す方法を紹介します。
紹介するAPI一覧はこちら
新規API | 概要 |
---|---|
ContactsContract.Profile.CONTENT_URI | ProfileのCONTENT_URI情報 |
ContactsContract.Profile.DISPLAY_NAME | ユーザ名のフィールド |
ContactsContract.Profile.HAS_PHONE_NUMBER | 電話番号を持っているかを表すフィールド。"0"なら非保持、"1"なら保持 |
また、本エントリはコンテンツプロバイダを利用します。
TechBoosterでは以下の記事で取り扱っています。参考にどうぞ。
ContentProviderからデータを取得する
ContentProviderで端末内の画像データを取得する
ContentProviderで通話履歴を取得する
それでは続きをどうぞ。
パーミッションを設定する
UserProfileを保持するコンテンツプロバイダにアクセスするために、以下のパーミッションが新たに追加されました。
追加されたパーミッション | 概要 |
---|---|
WRITE_PROFILE | Profileの書き込み権限 |
READ_PROFILE | Profileの読み取り権限 |
これらのパーミッションは従来通り、設定されていないとアクセス権限エラーでエラー終了するため、
UserProfileにアクセスする際には必ず付与するようにしましょう。
※UserProfileにアクセスすることは、ユーザの個人情報にアクセスすることに繋がります。
※自己防衛のため、ユーザはWRITE_PROFILEやREAD_PROFILEを持つアプリケーションを積極的にインストールしないかもしれません。
<manifest 省略> <uses-permission android:name="android.permission.WRITE_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> ...省略
UserProfileにアクセスする
UserProfileにアクセスするためには、以下の手順を取る必要があります。
1.Content_URIからCursorを取得する。
2.目的のフィールドからデータを取得する。
1.Content_URIからCursorを取得する。
データベースへのアクセスと同様に、Cursorを取得します。
UserProfileにアクセスする際に使用する、コンテントプロバイダのURIは以下の通り。
追加されたURI | 概要 |
---|---|
ContactsContract.Profile.CONTENT_URI | Profileが保存されているURIを指す |
表内のAPIを用いて、以下ソースコード2行目の様にCursorを取得します。
また、取得したCursorはデータの先頭を指すように移動させておきます。
// Cursorの取得 Cursor mCursor = getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null); mCursor.moveToFirst();
2.目的のフィールドからデータを取得する。
UserProfileクラスが持つ、フィールド名の一部を以下の表に表します。
その他のフィールドについては、リンク先のInherited Constantsの項を参考にしてください。
フィールド名 | 概要 |
---|---|
DISPLAY_NAME | そのレコードのユーザ名 |
HAS_PHONE_NUMBER | そのレコードに電話番号を持つかどうか |
IS_USER_PROFILE | そのレコードがUserProfileであるかどうか |
PHOTO_THUMBNAIL_URI | そのレコードのユーザのサムネイル画像のURI |
PHOTO_URI | そのレコードのユーザの画像のURI |
表で例に取り上げたフィールド名を利用し、ユーザ名を取得するソースコードは以下の通りです。
CursorクラスのgetColumnIndexメソッドに対しフィールド名を指定し、getStringメソッドでデータを取得しています。
// UserName int nameIndex = mCursor.getColumnIndex(ContactsContract.Profile.DISPLAY_NAME); String uName = mCursor.getString(nameIndex);
サンプルソースコード
UserProfileに登録した、ユーザ名と電話番号を取得するサンプルコードは以下の通りです。
注意しなければいけない点は、ContactsContract.Profile.CONTENT_URIから取得したCursorでは電話番号が取得できない点です。
サンプルでは、UserProfileからIDを取得し、ContentProviderからデータを取得するで紹介したContactsContract.CommonDataKinds.Phoneクラスを利用し電話番号を取得しています。
@Override public void onClick(View v) { /* Get UserProfile */ // Cursorの取得 Cursor mCursor = getContentResolver().query( ContactsContract.Profile.CONTENT_URI, null, null, null, null); mCursor.moveToFirst(); // UserNameの取得 int nameIndex = mCursor .getColumnIndex(ContactsContract.Profile.DISPLAY_NAME); String uName = mCursor.getString(nameIndex); // Phone Numberの取得 int hasPhoneNumIndex = mCursor .getColumnIndex(ContactsContract.Profile.HAS_PHONE_NUMBER); String hasNumber = mCursor.getString(hasPhoneNumIndex); // ProfileレコードのIDを取得する int idIndex = mCursor.getColumnIndex(ContactsContract.Profile._ID); long _id = mCursor.getLong(idIndex); // ProfileのURLから取得したCursorを閉じる mCursor.close(); String phoneNumber = "No Data"; // 取得したIDからNumberの取得 if (hasNumber.equals("1")) { // ProfileのContent_Uriから取得したIDから、Phone情報のUriを取得する Uri pUri = ContentUris.withAppendedId( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, _id); // UriからCursorを取り出す mCursor = managedQuery(pUri, null, null, null, null); mCursor.moveToFirst(); // Cursorを使い、PhoneNumberを取得する phoneNumber = mCursor .getString(mCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); // Close Cursor mCursor.close(); } // TextViewを表示する StringBuilder sb = new StringBuilder(); sb.append("User Name : "); sb.append(uName); sb.append("\n"); sb.append("Phone Number : "); sb.append("\n"); sb.append(phoneNumber); tv.setText(sb.toString()); }