▼Androidメモ▼
アドレス帳へのアクセス


アドレス帳にアクセスするプログラムを作成する。参考


リソース
「res/layout」に「listitem.xml」を配置。
listitem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width ="fill_parent"
    android:layout_height="fill_parent"
    android:orientation  ="horizontal" 
    android:background="#00FFFFFF">
    <LinearLayout 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:background="#00FFFFFF">
        <ImageView 
            android:layout_width ="wrap_content" 
            android:layout_height="wrap_content" 
            android:minHeight="48dp" 
            android:maxWidth ="48dp" 
            android:maxHeight="48dp" 
            android:minWidth ="48dp"
            android:tag      ="icon"/>
        <LinearLayout 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:orientation="vertical" 
            android:background="#00FFFFFF">
            <TextView 
                android:layout_width  ="wrap_content" 
                android:layout_height ="wrap_content" 
                android:textSize      ="24dp" 
                android:textColor     ="#000000" 
                android:layout_gravity="center_vertical"
                android:tag           ="text"/>
            <TextView 
                android:layout_width  ="wrap_content" 
                android:layout_height ="wrap_content" 
                android:textSize      ="16dp" 
                android:textColor     ="#000000" 
                android:layout_gravity="center_vertical"
                android:tag           ="dial"/>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

ソースコード
AddressEx.java
package net.npaka.addressex;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.view.Window;
import android.widget.ListAdapter;
import android.widget.ListView;

//アドレス帳へのアクセス
public class AddressEx extends ListActivity {
    //アプリ生成時に呼ばれる
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        //配列リストの生成
        List items=new ArrayList();

        //アドレス情報の取得
        ContentResolver cr=getContentResolver();
        Cursor c=cr.query(ContactsContract.Contacts.CONTENT_URI,
            null,null,null,null);
        
        while (c.moveToNext()) {
            //グループ
            int group=c.getInt(c.getColumnIndex(
                ContactsContract.Contacts.IN_VISIBLE_GROUP));
            if (group!=1) continue;
            
            //ID
            String id=c.getString(
                c.getColumnIndex(ContactsContract.Contacts._ID));

            //表示名
            String displayName=c.getString(c.getColumnIndex(
                ContactsContract.Contacts.DISPLAY_NAME));

            //写真
            int photoID=c.getInt(c.getColumnIndex(
                ContactsContract.Contacts.PHOTO_ID));
            Bitmap icon=null;
            if (photoID!=0) {
                Uri uri=ContentUris.withAppendedId(
                    ContactsContract.Contacts.CONTENT_URI,Long.parseLong(id));
                InputStream in=ContactsContract.Contacts.openContactPhotoInputStream(cr,uri);
                icon=BitmapFactory.decodeStream(in);
            }
            
            //電話
            String dial1="";
            if (Integer.parseInt(c.getString(
                c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))>0) {
                Cursor cp=cr.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                    new String[]{id}, null);
                while (cp.moveToNext()) {
                    dial1=cp.getString(cp.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.DATA1));
                }
                cp.close();
            } 

            //メール
            String mail="";
            Cursor cm=cr.query( 
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
                null,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID+" = ?", 
                new String[]{id},null);
            while (cm.moveToNext()) {
                mail=cm.getString(cm.getColumnIndex(
                    ContactsContract.CommonDataKinds.Email.DATA));
            }
            cm.close();
            
            //追加
            items.add(new ListArrayItem(icon,displayName,dial1,mail));
        }
        
        // アダプタの指定
        ListAdapter adapter=new ListArrayAdapter(
            this,R.layout.listitem,items);
        setListAdapter(adapter);
        
        //リストビューの設定
        ListView listView=this.getListView();
        listView.setBackgroundColor(Color.WHITE);
        listView.setScrollingCacheEnabled(false); 
    }
}

ListArrayAdapter.java
package net.npaka.addressex;
import java.util.List;
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

//リスト配列アダプタ
public class ListArrayAdapter 
    extends ArrayAdapter<ListArrayItem> {
    private int                 layoutID;
    private List<ListArrayItem> items;
    private LayoutInflater      inflater;

    //コンストラクタ.
    public ListArrayAdapter(Context context,
        int layoutID,List<ListArrayItem> items) {
        super(context,layoutID,items);
        this.layoutID=layoutID;
        this.items   =items;
        this.inflater=(LayoutInflater)context.getSystemService(
            Context.LAYOUT_INFLATER_SERVICE);
    }

    //1要素分のビューの取得
    @Override
    public View getView(int position,
        View convertView,ViewGroup parent) {
        //ビューの生成
        View view;
        if(convertView!=null){
            view=convertView;
        } else{
            view=inflater.inflate(layoutID,null);
        }

        //アイテムの取得
        ListArrayItem item=items.get(position);

        //アイコン
        ImageView imageView=(ImageView)view.findViewWithTag("icon");
        imageView.setImageDrawable(new BitmapDrawable(item.icon));

        //テキストの指定
        TextView textView;
        textView=(TextView)view.findViewWithTag("text");
        textView.setText(item.text);
        textView=(TextView)view.findViewWithTag("dial");
        textView.setText(item.dial);
        return view;
    }
}

ListArrayItem.java
package net.npaka.addressex;
import android.graphics.Bitmap;

//リスト配列要素
public class ListArrayItem {
    public Bitmap icon;
    public String text;
    public String dial;
    public String mail;
  
    //コンストラクタ
    public ListArrayItem(Bitmap icon,String text,
        String dial,String mail){
        this.icon=icon;
        this.text=text;
        this.dial=dial;
        this.mail=mail;
    }
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest package="net.npaka.addressex"
    android:versionCode="1"
    android:versionName="1.0" 
    xmlns:android="http://schemas.android.com/apk/res/android">
    <application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name">
        <activity 
            android:name=".AddressEx"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="7" />

    <uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest> 

アドレスの削除

 
getContentResolver().delete(ContactsContract.Data.CONTENT_URI,
ContactsContract.Data.RAW_CONTACT_ID+"="+id,null);
getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI,
ContactsContract.RawContacts._ID+"="+id,null);
getContentResolver().delete(ContactsContract.Contacts.CONTENT_URI,
ContactsContract.Contacts._ID+"="+id, null);


−戻る−