你的位置:首页 > 操作系统

[操作系统]获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。


 1 package com.lixu.tongxunlu; 2  3 import java.util.ArrayList; 4 import com.lixu.tongxunlu.PinnedSectionListView.PinnedSectionListAdapter; 5 import android.app.Activity; 6 import android.content.ContentResolver; 7 import android.content.Context; 8 import android.content.Intent; 9 import android.database.Cursor; 10 import android.graphics.Color; 11 import android.net.Uri; 12 import android.os.Bundle; 13 import android.provider.ContactsContract; 14 import android.view.LayoutInflater; 15 import android.view.View; 16 import android.view.ViewGroup; 17 import android.view.Window; 18 import android.view.WindowManager; 19 import android.widget.AdapterView; 20 import android.widget.AdapterView.OnItemClickListener; 21 import android.widget.ArrayAdapter; 22 import android.widget.TextView; 23  24 public class MainActivity extends Activity { 25   private ArrayList<Contacts> contacts; 26   private ArrayList<Data> data; 27  28   @Override 29   protected void onCreate(Bundle savedInstanceState) { 30     super.onCreate(savedInstanceState); 31     // 去掉标题头 32     requestWindowFeature(Window.FEATURE_NO_TITLE); 33     setContentView(R.layout.activity_main); 34     // 设置程序全屏 35     toggleFullscreen(true); 36  37     data = new ArrayList<Data>(); 38     contacts = new ArrayList<Contacts>(); 39     // 获取手机联系人后装到contacts中 40     getcontacts(contacts); 41  42     int A = (int) 'A'; 43     for (int i = 0; i < 26; i++) { 44       int letter = A + i; 45       char c = (char) letter; 46  47       Data group = new Data(); 48  49       group.type = Data.GROUP; 50       group.text = c + ""; 51       data.add(group); 52       for (int j = 0; j < contacts.size(); j++) { 53         Contacts cc = contacts.get(j); 54         String ss = cc.firstLetterofNmae(); 55         // 判断联系人名字首字母是否和组名字母一样,一样后加入本组 56         if (ss.equals(group.text)) { 57           Data child = new Data(); 58           child.type = Data.CHILD; 59           child.text = cc.name + "" + cc.getPhoneNumbers(); 60           child.contacts = cc; 61           data.add(child); 62         } 63  64       } 65  66     } 67  68     PinnedSectionListView pslv = (PinnedSectionListView) findViewById(R.id.pslv); 69  70     pslv.setAdapter(new MyAdapter(this, -1)); 71  72     pslv.setOnItemClickListener(new OnItemClickListener() { 73  74       @Override 75       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 76         // 判断点击子菜单才会触发点击事件 77         if (data.get(position).type == Data.CHILD) { 78           Data datas = data.get(position); 79           Contacts contact = datas.contacts; 80           // 获取电话号码 81           String number = contact.getPhoneNumbers(); 82  83           Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number)); 84           startActivity(intent); 85         } 86       } 87     }); 88  89   } 90  91   // 设置程序全屏的方法 92   public void toggleFullscreen(boolean fullScreen) { 93     // fullScreen为true时全屏 94  95     WindowManager.LayoutParams attrs = getWindow().getAttributes(); 96  97     if (fullScreen) { 98       attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; 99     } else {100       attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;101     }102 103     getWindow().setAttributes(attrs);104   }105 106   private class Data {107     public static final int GROUP = 0;108     public static final int CHILD = 1;109     public static final int STYE = 2;110     public String text;111     public int type;112     public Contacts contacts = null;113 114   }115 116   private class MyAdapter extends ArrayAdapter implements PinnedSectionListAdapter {117     private LayoutInflater flater;118 119     public MyAdapter(Context context, int resource) {120       super(context, resource);121       flater = LayoutInflater.from(context);122     }123 124     @Override125     public int getCount() {126       return data.size();127     }128 129     @Override130     public Object getItem(int position) {131       return data.get(position);132     }133 134     @Override135     public int getItemViewType(int position) {136       return data.get(position).type;137     }138 139     @Override140     public int getViewTypeCount() {141       return Data.STYE;142     }143 144     @Override145     public View getView(int position, View convertView, ViewGroup parent) {146       int type = getItemViewType(position);147       Data data = (Data) getItem(position);148       switch (type) {149       case Data.GROUP:150         if (convertView == null)151           convertView = flater.inflate(android.R.layout.simple_list_item_1, null);152 153         TextView tv = (TextView) convertView.findViewById(android.R.id.text1);154         tv.setBackgroundColor(Color.GREEN);155         tv.setTextSize(35);156         tv.setText(data.text);157 158         break;159 160       case Data.CHILD:161         if (convertView == null)162           convertView = flater.inflate(android.R.layout.simple_list_item_1, null);163 164         TextView tv1 = (TextView) convertView.findViewById(android.R.id.text1);165         tv1.setTextSize(20);166         tv1.setText(data.text);167 168         break;169 170       default:171         break;172       }173       return convertView;174     }175 176     @Override177     public boolean isItemViewTypePinned(int viewType) {178       boolean type = false;179       switch (viewType) {180       case Data.CHILD:181 182         type = false;183 184         break;185 186       case Data.GROUP:187 188         type = true;189 190         break;191 192       default:193         break;194       }195       return type;196     }197 198   }199 200   // 获取手机联系人的方法201   private void getcontacts(ArrayList<Contacts> contacts) {202     Uri uri = Uri.parse("content://com.android.contacts/contacts");203     ContentResolver resolver = this.getContentResolver();204     // 给query传递一个SORT_KEY_PRIMARY,让ContentResolver将获得的数据按照联系人名字首字母排序205     Cursor cursor = resolver.query(uri, null, null, null,206         android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);207     while (cursor.moveToNext()) {208       // 联系人的id209       String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));210       // 将联系人按姓名首字母分组211       String sort_key_primary = cursor212           .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));213       // 获取联系人的名字214       String name = cursor215           .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));216       Contacts mContacts = new Contacts();217       mContacts.id = id;218       mContacts.name = name;219       mContacts.sort_key_primary = sort_key_primary;220       // 获取联系人手机号码221       Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,222           ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);223       // 将获取到的号码遍历224       ArrayList<String> phonenumbers = new ArrayList<String>();225       while (phone.moveToNext()) {226         int phoneFieldColumnIndex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);227         String phonenumber = phone.getString(phoneFieldColumnIndex);228         phonenumbers.add(phonenumber);229       }230       mContacts.phonenumbers = phonenumbers;231       contacts.add(mContacts);232 233     }234   }235 236   private class Contacts {237     public String id;238     public String name;239     public String sort_key_primary;240     public ArrayList<String> phonenumbers;241 242     // 获取汉字首字母转换成大写字母243     public String firstLetterofNmae() {244       String s = sort_key_primary.charAt(0) + "";245       return s.toUpperCase();246 247     }248 249     public String getPhoneNumbers() {250       String phones = "";251       for (int i = 0; i < phonenumbers.size(); i++) {252         phones += ":" + phonenumbers.get(i);253       }254       return phones;255 256     }257   }258 259 }

不要忘记添加各种权限。

 

 1 <RelativeLayout ="http://schemas.android.com/apk/res/android" 2   ="http://schemas.android.com/tools" 3   android:layout_width="match_parent" 4   android:layout_height="match_parent" 5   android:padding="10dp" > 6  7   <com.lixu.tongxunlu.PinnedSectionListView 8     android:id="@+id/pslv" 9     android:layout_width="wrap_content"10     android:layout_height="wrap_content" />11 12 </RelativeLayout>

效果示例图: