效果图: 正题: 本实例包含几下实际应用: 1. 获取手机通讯录(包括SIM卡中的联系人) 2. 几种Intent的传值应用 3. Adapter的自定义使用 4. AutoCompleteTextView应用 5. TextWatcher应用(带正则应用) 6. AsyncTask应用 7. 防止手机横屏时页面重新加载 8. 通讯录联系人按拼音重排序 (注:以下代码都是针对标题节选的关键代码,甚至有些不是同一文件中,详情请参考工程) 一.获取手机通讯录:
-
- //从本机中取号
- private void GetLocalContact(){
- //读取手机中手机号
- Cursor cursor = getContentResolver().query(People.CONTENT_URI, null,
- null, null, null);
- while (cursor.moveToNext()) {
- ContactInfo cci = new ContactInfo();
- //取得联系人名字
- int nameFieldColumnIndex = cursor.getColumnIndex(People.NAME);
- cci.contactName = cursor.getString(nameFieldColumnIndex);
- //取得电话号码
- int numberFieldColumnIndex = cursor.getColumnIndex(People.NUMBER);
- cci.userNumber = cursor.getString(numberFieldColumnIndex);
- cci.userNumber = GetNumber(cci.userNumber);
- cci.isChecked = false;
- if (IsUserNumber(cci.userNumber)) {
- if (!IsContain(contactList, cci.userNumber)) {
- if(IsAlreadyCheck(wNumStr, cci.userNumber)){
- cci.isChecked = true;
- numberStr += "," + cci.userNumber;
- }
- contactList.add(cci);
- //Log.i("eoe", "*********"+cci.userNumber);
- }
- }
- }
- cursor.close();
- }
-
- //从SIM卡中取号
- private void GetSimContact(String add){
- //读取SIM卡手机号,有两种可能:content://icc/adn与content://sim/adn
- try {
- Intent intent = new Intent();
- intent.setData(Uri.parse(add));
- Uri uri = intent.getData();
- mCursor = getContentResolver().query(uri, null, null, null, null);
- if (mCursor != null) {
- while (mCursor.moveToNext()) {
- ContactInfo sci = new ContactInfo();
- // 取得联系人名字
- int nameFieldColumnIndex = mCursor.getColumnIndex("name");
- sci.contactName = mCursor.getString(nameFieldColumnIndex);
- // 取得电话号码
- int numberFieldColumnIndex = mCursor
- .getColumnIndex("number");
- sci.userNumber = mCursor.getString(numberFieldColumnIndex);
- sci.userNumber = GetNumber(sci.userNumber);
- sci.isChecked = false;
-
- if (IsUserNumber(sci.userNumber)) {
- if (!IsContain(contactList, sci.userNumber)) {
- if(IsAlreadyCheck(wNumStr, sci.userNumber)){
- sci.isChecked = true;
- numberStr += "," + sci.userNumber;
- }
- contactList.add(sci);
- //Log.i("eoe", "*********"+sci.userNumber);
- }
- }
- }
- mCursor.close();
- }
- } catch (Exception e) {
- Log.i("eoe", e.toString());
- }
- }
复制代码
二. 几种Intent的传值应用
- //页面传值并获取回传值
- Intent intent = new Intent();
- intent.setClass(Eoe_Contact.this, ContactListView.class);
- Bundle bundle = new Bundle();
- String wNumberStr = eMsisdn.getText().toString();
- bundle.putString("wNumberStr", wNumberStr);
- intent.putExtras(bundle);
- startActivityForResult(intent, CONTACT_REQUEST_CODE);
-
- //获取前一页面所传值
- Intent intent = this.getIntent();
- Bundle bundle = intent.getExtras();
- String wNumberStr = bundle.getString("wNumberStr").replace(",", ",");
-
- //获取回传值
- //重写获取页面回传值
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- case CONTACT_REQUEST_CODE:
- if (resultCode == RESULT_OK) {
- String numberStr = null;
- Bundle bundle = data.getExtras();
- if (bundle != null) {
- numberStr = bundle.getString("numberStr");
- }
- eMsisdn.setText(numberStr);
- }
- break;
- }
- }
复制代码
三. Adapter的自定义使用 继承BaseAdapter类,重写。这个内容比较多就不粘了,详情看ContactAdapter.JAVA页面 需要注意的一点是,getView方法,adapter是在页面变化的时候,重新获取当前页面的数据 四. AutoCompleteTextView应用 和 TextWatcher应用 大家都看过APIDEMOS的示例,看过AutoCompleteTextView的基本应用,但是实际当中那些是不够的,我们往往希望点击自动提示后对所获取的内容做自己的逻辑处理,因此TextWatcher可以派上用场了
- //编辑AUTOCOMPLETE数组
- autoContact = new String[contactList.size()];
- for(int c=0;c<contactList.size();c++){
- autoContact[c]=contactList.get(c).contactName+"("+contactList.get(c).userNumber+")";
- }
- //绑定AUTOCOMPLETE
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(ContactListView.this,
- android.R.layout.simple_dropdown_item_1line, autoContact);
- textView.setAdapter(adapter);
- textView.addTextChangedListener(mTextWatcher);
-
- //监听AUTOTEXT内容变化,当出现符合选中联系人[联系人(手机号)]的情况下,将该勾中,并加入选中手机号中
- private TextWatcher mTextWatcher = new TextWatcher() {
- public void beforeTextChanged(CharSequence s, int start, int
- before, int after) { }
- public void onTextChanged(CharSequence s, int start,
- int before, int after) {
- String autoText = s.toString();
- if(autoText.length()>=13){
- Pattern pt=Pattern.compile("\\(([1][3,5,8]+\\d{9})\\)");
- Matcher mc = pt.matcher(autoText);
- if(mc.find()){
- String sNumber = mc.group(1);
- DealWithAutoComplete(contactList,sNumber);
- //刷新列表
- Toast.makeText(ContactListView.this, "已选中您搜索的结果!",1000).show();
- ca.setItemList(contactList);
- ca.notifyDataSetChanged();
- }
- }
- }
- public void afterTextChanged(Editable s) { }
- };
复制代码
五. AsyncTask应用 考虑到从机子上获取通讯有时间等待,因此使用了进程,提高体验效果(有关AsyncTask可以在EOE找专贴,我也是学来的,呵呵)
- //启动进程
- new GetContactTask().execute("");
-
- //获取通讯录进程
- private class GetContactTask extends AsyncTask<String, String, String> {
- public String doInBackground(String... params) {
-
- return "";
- }
- @Override
- protected void onPreExecute() {
- showDialog(DIALOG_KEY);
- }
- @Override
- public void onPostExecute(String Re) {
-
- removeDialog(DIALOG_KEY);
- }
-
- //下面这段本例未使用,能配合doInBackground进行刷新效果
- @Override
- protected void onProgressUpdate(String... values) {
- // TODO Auto-generated method stub
- }
- }
- //
复制代码
六. 防止手机横屏时页面重新加载 AndroidManifest.xml中:
- <activity android:name=".ContactListView"
- android:theme="@android:style/Theme.NoTitleBar"
- android:noHistory="true"
- android:configChanges="orientation|keyboardHidden|navigation">
- </activity>
复制代码
七. 通讯录联系人按拼音重排序
- //按中文拼音顺序排序
- Comparator comp = new Mycomparator();
- Collections.sort(contactList,comp);
-
- //通讯社按中文拼音排序
- public class Mycomparator implements Comparator{
- public int compare(Object o1,Object o2) {
- ContactInfo c1=(ContactInfo)o1;
- ContactInfo c2=(ContactInfo)o2;
- Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);
- return cmp.compare(c1.contactName, c2.contactName);
- }
-
- }
复制代码
呃,应该都差不多这些了。。。不容易啊,也老长一贴啊~ 个人认为已经贴的比较详细了,有关要点部分都粘出来了,并且源码中也作了相当的注释。 如果还有问题的话,我就想使用安脚无影腿、鸡风双眼插。。。 好吧。。。还是提供一个邮箱: yingmuxiaodao@yahoo.com.cn 后记: 发现ANDROID 2.0以后提供了一个新的类,android.provider.ContactsContract,貌似可以直接取出SIM卡中的联系人。 以前代码都是使用ANDROID 1.5,毕竟需要考虑到一些低版本用户吧~ 下次如果有时间的话,再写一个有关软件版本更新(XML)、文件下载(带进度条)、文件安装的实例 后续发现一些手机还需要从以下两处取: content://icc/fdn content://sim/fdn MOTO XT800比较异常,通讯录在: content://contacts/phones 双卡双待手机同时插两张卡无法取出...杯具! 附上大家最关注的东东--源码: Eoe_Contact.rar (67.8 KB, 下载次数: 1801) |