Android 读取手机联系人、拨号、发送短信及长按菜单的操作

本示例实现了读取手机联系人,拨号、发送短信及长按出现菜单选项的操作↓

1.Andrid项目结构图↓主要操作图中红色方框内的文件。

2.首先布局代码如下↓

a, main.xml
程序运行的主界面,主要用ListView列表控件展示手机联系人


 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:background="@drawable/bg"
6 android:orientation="vertical" >
7
8 <ListView
9 android:id="@+id/listView"
10 android:layout_width="fill_parent"
11 android:layout_height="fill_parent"
12 android:layout_marginLeft="5dip"
13 android:cacheColorHint="#00000000"
14 android:divider="@drawable/divider_horizontal_bright"
15 android:paddingRight="5dip" >
16 </ListView>
17
18 </LinearLayout>

b.list_item.xml
ListView的列表项布局文件,相当于展示模版

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<?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="wrap_content"

android:orientation="horizontal"
>

<ImageView

android:id="@+id/imgView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:contentDescription="@string/photo"

android:paddingRight="2dip"
/>

<TextView

android:id="@+id/name"

android:layout_width="80dip"

android:layout_height="wrap_content"

android:layout_marginLeft="10dip"

android:paddingTop="8dip"

android:singleLine="false"

android:textAppearance="?android:attr/textAppearanceMedium"

android:textColor="#ffffff"
/>

<TextView

android:id="@+id/number"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginRight="6dip"

android:paddingTop="8dip"

android:singleLine="false"

android:textColor="#ffffff"

android:textAppearance="?android:attr/textAppearanceMedium"/>

</LinearLayout>

  

c,phonedetails.xml
长按菜单显示联系人详细布局界面,示例只做了跳转展示

?





1

2

3

4

5

6

7

8

9

10

11

12

13

<?xml version="1.0"
encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"
>

<TextView

android:id="@+id/ymw"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:textAppearance="?android:attr/textAppearanceMedium"/>

</LinearLayout>

2.Java实现代码如下↓

a,MainActivity.java
程序运行的入口文件


  1 package com.example.myandroid;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.Iterator;
6
7 import android.app.Activity;
8 import android.content.ContentResolver;
9 import android.content.Intent;
10 import android.database.Cursor;
11 import android.net.Uri;
12 import android.os.Bundle;
13 import android.provider.ContactsContract;
14 import android.provider.ContactsContract.CommonDataKinds;
15 import android.view.ContextMenu;
16 import android.view.ContextMenu.ContextMenuInfo;
17 import android.view.MenuItem;
18 import android.view.View;
19 import android.view.View.OnCreateContextMenuListener;
20 import android.widget.AdapterView;
21 import android.widget.AdapterView.OnItemClickListener;
22 import android.widget.ListView;
23 import android.widget.SimpleAdapter;
24 import android.widget.Toast;
25
26 import com.ymw.details.Detail;
27
28 public class MainActivity extends Activity {
29
30
31 @Override
32 public void onCreate(Bundle savedInstanceState) {
33 super.onCreate(savedInstanceState);
34 setContentView(R.layout.main);
35
36 final ListView listView = (ListView) findViewById(R.id.listView);
37
38 // 生成动态数组,加入数据
39 ArrayList<HashMap<String, Object>> listItem = fillMaps();
40
41 SimpleAdapter listItemAdapter = new SimpleAdapter(this, listItem,
42 R.layout.list_item,
43 new String[] { "imgView", "name", "number" }, new int[] {
44 R.id.imgView, R.id.name, R.id.number });
45 listView.setAdapter(listItemAdapter);
46
47 // 添加单击事件
48 listView.setOnItemClickListener(new OnItemClickListener() {
49 @Override
50 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
51 long arg3) {
52 HashMap<String, String> map = (HashMap<String, String>) listView
53 .getItemAtPosition(arg2);
54 String name = map.get("name");
55 Toast toast = Toast.makeText(getApplicationContext(), "第"
56 + arg2 + "项" + name, Toast.LENGTH_LONG);
57 toast.show();
58 String phoneNum = map.get("number");
59 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
60 + phoneNum));
61 startActivity(intent);
62 }
63 });
64
65 // 添加长按菜单
66 listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
67 public void onCreateContextMenu(ContextMenu menu, View v,
68 ContextMenuInfo menuInfo) {
69 menu.setHeaderTitle("长按菜单-ContextMenu");
70 menu.add(0, 0, 0, "查看详细");
71 menu.add(0, 1, 0, "发送信息");
72 menu.add(0, 2, 0, "删除联系人");
73 }
74 });
75 }
76
77 public boolean onContextItemSelected(MenuItem item) {
78 // setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目");
79 Toast.makeText(getApplicationContext(),
80 "选择了" + item.getItemId() + item.getTitle() + "项",
81 Toast.LENGTH_LONG).show();
82
83 int id = item.getItemId();
84 // 查看详细
85 if (id == 0) {
86 Intent intent = new Intent();
87 intent.putExtra("ymw", item.getTitle());
88 intent.setClass(MainActivity.this, Detail.class);
89 startActivity(intent);
90 }
91 // 发送短信
92 else if (id == 1) {
93 Uri uri = Uri.parse("smsto://18664599745");
94 Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
95 intent.putExtra("sms_body", "ymw-LOVE-yh");
96 startActivity(intent);
97 }
98 // 删除联系人
99 else if (id == 2) {
100 }
101 return super.onContextItemSelected(item);
102 }
103
104 // 获取手机联系人列表方法一
105 public ArrayList<HashMap<String, Object>> GetContects() {
106 ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
107 Cursor cursor = getContentResolver().query(
108 ContactsContract.Contacts.CONTENT_URI,
109 null,
110 null,
111 null,
112 ContactsContract.Contacts.DISPLAY_NAME
113 + " COLLATE LOCALIZED ASC");
114
115 if (cursor.moveToFirst()) {
116 int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
117 int nameColum = cursor
118 .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
119 do {
120 String contactId = cursor.getString(idColumn);
121 String disPlayNameString = cursor.getString(nameColum);
122
123 // 查看有多少电话号码 没有则返回为0
124 int phoneCount = cursor
125 .getInt(cursor
126 .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
127
128 if (phoneCount > 0) {
129 // 获得联系人的电话号码
130 Cursor phones = getContentResolver().query(
131 ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
132 null,
133 ContactsContract.CommonDataKinds.Phone.CONTACT_ID
134 + "=" + contactId, null, null);
135 HashMap<String, Object> map = new HashMap<String, Object>();
136 map.put("imgView", R.drawable.ic_launcher);
137 map.put("name", disPlayNameString);
138 list.add(map);
139
140 }
141 } while (cursor.moveToNext());
142 if (cursor != null)
143 cursor.close();
144 }
145 return list;
146 }
147
148 // 获取联系人方法二
149 public ArrayList<HashMap<String, Object>> fillMaps() {
150 ArrayList<HashMap<String, Object>> items = new ArrayList<HashMap<String, Object>>();
151
152 ContentResolver cr = getContentResolver();
153 HashMap<String, ArrayList<String>> hashMap = new HashMap<String, ArrayList<String>>();
154 Cursor phone = cr.query(CommonDataKinds.Phone.CONTENT_URI,
155 new String[] { CommonDataKinds.Phone.CONTACT_ID,
156 CommonDataKinds.Phone.DISPLAY_NAME,
157 CommonDataKinds.Phone.NUMBER,
158 CommonDataKinds.Phone.DATA1
159 // CommonDataKinds.StructuredPostal.DATA3,
160 }, null, null, null);
161 while (phone.moveToNext()) {
162 String contactId = phone.getString(phone
163 .getColumnIndex(CommonDataKinds.Phone.CONTACT_ID));
164 String displayName = phone.getString(phone
165 .getColumnIndex(CommonDataKinds.Phone.DISPLAY_NAME));
166 String PhoneNumber = phone
167 .getString(phone
168 .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
169 String address = phone.getString(phone
170 .getColumnIndex(CommonDataKinds.Phone.DATA1));
171
172 // 以contactId为主键,把同一人的所有电话都存到一起。
173 ArrayList<String> ad = hashMap.get(contactId);
174 if (ad == null) {
175 ad = new ArrayList<String>();
176 ad.add(displayName);
177 ad.add(PhoneNumber);
178 // ad.add(address);
179
180 hashMap.put(contactId, ad);
181 } else {
182 ad.add(PhoneNumber);
183 }
184
185 }
186 phone.close();
187
188 ArrayList<String> tmpList;
189 String tmpStr = "";
190 int k;
191 Iterator iter = hashMap.entrySet().iterator();
192 while (iter.hasNext()) {
193 HashMap.Entry entry = (HashMap.Entry) iter.next();
194 Object key = entry.getKey();
195 Object val = entry.getValue();
196
197 tmpList = (ArrayList) val;
198 tmpStr = "";
199 for (k = 1; k < tmpList.size(); k++) {
200 tmpStr = tmpStr + tmpList.get(k) + ‘,‘;
201 }
202 tmpStr = GetString(tmpStr);
203 HashMap<String, Object> tmpMap = new HashMap<String, Object>();
204 tmpMap.put("name", tmpList.get(0));
205 tmpMap.put("number", tmpStr);
206 tmpMap.put("imgView", R.drawable.ic_launcher);
207 items.add(tmpMap);
208 }
209 return items;
210 }
211
212 private String GetString(String str) {
213
214 String strLast = "";
215 int i = str.lastIndexOf(",");
216 if (i > 0) {
217 strLast = str.substring(0, str.length() - 1);
218 }
219 return strLast.replace(" ", "").replace(",", "\n").replace("+86", "");
220 }
221
222 }

b,Detail.java
主界面长按菜单显示联系人详细的跳转界面,接受主界面传来的参数


 1 package com.ymw.details;
2
3 import com.example.myandroid.R;
4
5 import android.app.Activity;
6 import android.content.Intent;
7 import android.os.Bundle;
8 import android.widget.TextView;
9
10 public class Detail extends Activity {
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 // TODO Auto-generated method stub
14 super.onCreate(savedInstanceState);
15 setContentView(com.example.myandroid.R.layout.phonedetails);
16
17 Intent intent = getIntent();
18 String strPara = intent.getStringExtra("ymw");
19
20 TextView tView = (TextView) findViewById(R.id.ymw);
21 tView.setText(strPara);
22 }
23 }

3.获取手机联系人和拨号发短信等需要配置权限↓

在AndroidManifest.xml文件中的application节点上加入如下代码

<!--添加权限-->
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>

4.使用Android模拟器或连接Android智能手机运行本程序可以看到手机联系人列表,

单击某个联系人会直接拨号,长按某个联系人会出现菜单选项,可以选择发送短信。

Android 读取手机联系人、拨号、发送短信及长按菜单的操作

时间: 2024-10-05 16:30:42

Android 读取手机联系人、拨号、发送短信及长按菜单的操作的相关文章

android中调用系统的发送短信、发送邮件、打电话功能

1 调用发送短信功能: Uri smsToUri = Uri.parse("smsto:"); Intent sendIntent = new Intent(Intent.ACTION_VIEW, smsToUri); sendIntent.putExtra("address", "123456"); //电话号码,这行去掉的话,默认就没有电话 sendIntent.putExtra("sms_body","短信内容

android小功能实现之发送短信

新建一个Android工程. 一 布局 打开main.xml修改内容如下: <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/number" /> <EditText android:layout_width="fill_parent" android:

Android之发送短信和接收验证码

最近项目需求需要发送短信和接收验证码并将验证码显示在输入框中 以下是我的记录 前提---权限 <uses-permission android:name="android.permission.SEND_SMS"></uses-permission> <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <

双卡手机发送短信 - 坑爹的双卡双待

近期要写一个Android app.当中一个功能要发短信,直接照抄Android API Demos的样例OS\SMS Messaging,在自己的手机上測试.发现总是报错SmsManager.RESULT_ERROR_NO_SERVICE,理解不能. 于是開始Google. 发现网上非常少有人提到这个错误,并且Android上发短信,所有都是用的API Demos的发短信的样例,或者使用Intent调用系统短信App来发短信.尽管用Intent调用系统短信App来发短信也能够当作一个workr

删除,拨打电话,发送短信对话框

1-KehoutiActivity.java package com.example.lenovo.textapp4; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android

移动网页如何实现发送短信和拨打电话的功能

手机页面实现发送短信和拨打电话的功能非常简单,只需要<a>标签加一个属性就可以了. 1.发送短信的功能 html前端代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title>手机网页发送短信和拨打电话</title> 6 </head> 7 <body> 8 <a href=&qu

redis 基本操作-python 使用redis-手机验证接口-发送短信接口

目录 复习 今日内容 redis python使用redis 手机验证接口 发送短信接口 复习 """ 1.git项目开发 提供公钥成为开发者.copy项目.开发项目 先commit.再pull(可能出现冲突).最后push 特殊功能可以新建dev的子分支进行开发:git checkout -b 子分支, 切换回dev分支合并子分支内容:git merge 子分支 2.短信 注册并申请通信短信服务应用 安装指定模块,根据申请的应用配置得到发送短信的对象,对象调用方法完成短信的

Android手机获取通讯录联系人信息及短信广播实现

现在越来越多的android应用在注册时都要用到手机号码,通过获取手机验证码来完成注册.也有不少应用提供了手机通讯录备份功能,获得你的允许后把你的通讯录中的手机号码保存到服务器中,你要的时候又可以down下来,比如微信,QQ等就有这们的功能.那我们怎么样获取用户通讯录中的手机号码呢?Android已经为我们做好了准备: ---------------------------------获取通讯录联系人信息----------------------------------------------

[HTML] 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能

在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览器中实现拨打电话,发送email,美国服务器,调用sns等功能,移动手机WEB页面(HTML5)Javascript提供的接口是一个好办法. 采用url链接的方式,实现在Safari ios,香港服务器,Android 浏览器,webos 浏览器,塞班浏览器,IE,Operamini等主流浏览器,进行拨打电话功能. 1.最常用WEB页面J