Android实例-手机安全卫士(二十七)—读取联系人号码

一、目标

  1、将“二十六”介绍的读取联系人的方法移植到项目中;

  2、选取读取到的联系人条目,将其号码自动填入文本框中(通过Intent方式在Activity之间传递数据)。

 

二、代码实现。

  1、将读取联系人方法移植到项目中。

    ①.在主程序包(mobilesafe)下新建选择联系人类(SelectContactActivity),并在布局文件夹中(layout)新建”选择联系人“的布局文件(activity_select_contact.xml)。布局文件各联系人信息采用ListView组件显示。再在选择联系人类中的onCreate方法内通过setContentVie将布局文件和类关联。

布局文件代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <TextView
 8         android:layout_width="match_parent"
 9         android:layout_height="50dip"
10         android:background="#00ffff"
11         android:gravity="center"
12         android:text="请选择联系人"
13         android:textColor="#000000"
14         android:textSize="20sp" />
15 
16     <ListView
17         android:id="@+id/list_select_contact"
18         android:layout_width="match_parent"
19         android:layout_height="match_parent" >
20     </ListView>
21 
22 </LinearLayout>
View Code

     ②.在新建选择联系人类(SelectContactActivity)的主方法中复制适配器代码和“获取联系人”方法代码,同时将“读取联系人”类的单条联系人布局文件(contact_item_view)复制至项目布局文件下,更改适配器(contactListView.setAdapter())代码中相关参数的值。

新建选择联系人类(SelectContactActivity)代码:

 1 public class SelectContactActivity extends Activity {
 2     private ListView contactListView;
 3     
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_select_contact);
 8         contactListView = (ListView) findViewById(R.id.list_select_contact);
 9         List<Map<String, String>> listContact = getContactInfo();
10         contactListView.setAdapter(new SimpleAdapter(this, listContact, R.layout.contact_item_view,
11          new String[]{"name","phone"}, new int[]{R.id.contact_item_name,R.id.contact_item_phone}));
12     }
13     
14     /**
15      * 读取手机内的联系人信息    
16      * @return
17      */
18     private List<Map<String, String>> getContactInfo() {
19         //获取内容解析器
20         ContentResolver resolver = getContentResolver();
21         List<Map<String, String>> listContacts = new ArrayList<Map<String,String>>();
22         //获取手机联系人数据库相关表的Uri
23         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
24         Uri uriData = Uri.parse("content://com.android.contacts/data");
25         //查询数据表中的相关数据
26         Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
27                 null, null, null);
28         while (cursor.moveToNext()) {
29             String contact_id = cursor.getString(0);
30             if (contact_id != null) {
31                 //具体的某一个联系人
32                 Map<String,String> mapContact = new HashMap<String, String>();
33                 Cursor dataCursor = resolver.query(uriData, new String[] {
34                         "data1", "mimetype" }, "contact_id=?",
35                         new String[] { contact_id }, null);
36                 while(dataCursor.moveToNext()){
37                     String data1 = dataCursor.getString(0);
38                     String mimetype = dataCursor.getString(1);
39                     if("vnd.android.cursor.item/name".equals(mimetype)){
40                         //联系人姓名    
41                         mapContact.put("name", data1);
42                     }else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
43                         //联系人的电话号码
44                         mapContact.put("phone", data1);
45                     }
46                 }
47                 //将每个联系人放入List对象中
48                 listContacts.add(mapContact);
49                 //关闭Cursor对象
50                 dataCursor.close();
51             }
52         }
53         //关闭Cursor对象
54         cursor.close();
55         return listContacts;
56     }
57 }
View Code

 

    ③.为项目新增“读取联系人”权限(<uses-permission android:name="android.permission.READ_CONTACTS"/>)。

  2、选取读取到的联系人条目,将其号码自动填入文本框中

    ①.在选择联系人类(SelectContactActivity)中为获取的联系人列表(contactListView)设置条目点击事件(setOnItemClickListener(OnItemClickListener listener)),参数OnItemClickListener listener通过new OnItemClickListener(){}创建,并实现其未实现的方法(onItemClick(AdapterView<?> parent, View view,int position, long id));

    ②.在未实现的方法(onItemClick())中,通过主方法中获取的联系人信息列表(listContact)的get(int location)方法可以获知所点击条目的位置(由于内部类需要访问外部类,所以要将联系人信息列表(listContact)设置为final类型),再通过get(Object key)(参数为键名,这里是“phone”)获取所点击的联系人的号码,号码为String类型的值。

代码如下:

1 String phone = listContact.get(position).get("phone");    
View Code

     ③.通过Intent方式将值传递至需要的Activity。new 出一个Intent,通过其putExtra(String name, String value)方法将传递过程中使用的键名(name)和值(value)加至Intent中,然后使用setResult(int resultCode, Intent data)为该Intent设置返回结果码(int resultCode)和数据(Intent data),注意setResult()方法后面必须有finish()方法(关闭当前Activity)。

Intent传递代码如下:

1 Intent intent = new Intent();
2                 intent.putExtra("phone", phone);
3                 setResult(0, intent);
4                 //关闭当前页面
5                 finish();    
View Code

 

整个setOnItemClickListener方法代码如下:

 1 contactListView.setOnItemClickListener(new OnItemClickListener() {
 2 
 3             @Override
 4             public void onItemClick(AdapterView<?> parent, View view,
 5                     int position, long id) {
 6                 //通过点击条目的位置和键名获取对应的值
 7                 String phone = listContact.get(position).get("phone");    
 8                 //通过Intent的形式将获取到的值传递至下一个Activity
 9                 Intent intent = new Intent();
10                 intent.putExtra("phone", phone);
11                 setResult(0, intent);
12                 //关闭当前页面
13                 finish();                        
14             }
15         });
View Code

    ④.在设置向导第三步代码的选择联系人点击方法(selectContact(View view))中,通过带有结果集的启动另一个Activity方法(startActivityForResult(Intent intent, int requestCode))后,需要在onCreate方法总重写onActivityResult(int requestCode, int resultCode, Intent data)方法。

    ⑤.在重写的onActivityResult方法中首先判断Intent返回值(data)是否为空,如果为空则直接返回,如果不为空则通过Intent的getStringExtra(String name)根据键名获取对应的值,并通过replace(CharSequence target, CharSequence replacement)方法将电话号码中的“-”替换成“”,已符合中国人的习惯。

    ⑥.通过EditText对象的setText(CharSequence text)方法将⑤中获取的值放入“设置安全号码”的文本框中(如果该文本框未实例化,则需要实例化,即在layout布局文件中为其设置id,再在主代码中通过findViewById找到该文本框对象,最后通过setText方法设置值)

  3、在设置向导第三步中,当点击下一步时要安全号码保存至配置文件中

    ①.通过SharedPreferences对象的getString(String key, String defValue)获取配置文件中是否已经保存了安全号码,参数key为配置文件中的键名,defValue表示得不到键名对应的值时的默认返回值。如果保存了则将其填入安全号码文本框中。

代码如下:

1 et_security_number.setText(sp.getString("security_number", ""));
View Code

 

    .在“设置向导第三步”类中的划向下一步方法(slideNext() )中,首先通过getText()方法获取编辑文本框内容,判断安全号码的文本框是否为空,若空则提醒并返回,若不为空则通过SharedPreferences对象保存至配置文件

代码如下:

 1 //获取安全号码编辑框的内容
 2         String security_number = et_security_number.getText().toString().trim();
 3         //如果为空,则提醒后再返回
 4         if(TextUtils.isEmpty(security_number)){
 5             Toast.makeText(this, "未设置安全号码", 0).show();
 6             return;
 7         }
 8         //如果不为空,则通过SharedPreferences对象保存至配置文件
 9         Editor editor = sp.edit();        
10         editor.putString("security_number", security_number);
11         editor.commit();
View Code

  

posted @ 2015-04-09 13:50  红烧大白鲨  阅读(393)  评论(0编辑  收藏  举报