热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android编程实现读取手机联系人、拨号、发送短信及长按菜单操作方法实例小结

这篇文章主要介绍了Android编程实现读取手机联系人、拨号、发送短信及长按菜单操作方法,以完整实例形式总结分析了Android编程实现读取手机联系人、拨号、发送短信及长按菜单等操作的相关技巧,需要的朋友可以参考下

本文实例讲述了Android编程实现读取手机联系人、拨号、发送短信及长按菜单操作方法。分享给大家供大家参考,具体如下:

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

2.首先布局代码如下

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

<&#63;xml version="1.0" encoding="utf-8"&#63;>





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

<&#63;xml version="1.0" encoding="utf-8"&#63;>






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

<&#63;xml version="1.0" encoding="utf-8"&#63;>


2.Java实现代码如下

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

package com.example.myandroid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.ymw.details.Detail;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ListView listView = (ListView) findViewById(R.id.listView);
// 生成动态数组,加入数据
ArrayList> listItem = fillMaps();
SimpleAdapter listItemAdapter = new SimpleAdapter(this, listItem,
R.layout.list_item,
new String[] { "imgView", "name", "number" }, new int[] {
R.id.imgView, R.id.name, R.id.number });
listView.setAdapter(listItemAdapter);
// 添加单击事件
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<&#63;> arg0, View arg1, int arg2,
long arg3) {
HashMap map = (HashMap) listView
.getItemAtPosition(arg2);
String name = map.get("name");
Toast toast = Toast.makeText(getApplicationContext(), "第"
+ arg2 + "项" + name, Toast.LENGTH_LONG);
toast.show();
String phOneNum= map.get("number");
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
+ phoneNum));
startActivity(intent);
}
});
// 添加长按菜单
listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("长按菜单-ContextMenu");
menu.add(0, 0, 0, "查看详细");
menu.add(0, 1, 0, "发送信息");
menu.add(0, 2, 0, "删除联系人");
}
});
}
public boolean onContextItemSelected(MenuItem item) {
// setTitle("点击了长按菜单里面的第"+item.getItemId()+"个项目");
Toast.makeText(getApplicationContext(),
"选择了" + item.getItemId() + item.getTitle() + "项",
Toast.LENGTH_LONG).show();
int id = item.getItemId();
// 查看详细
if (id == 0) {
Intent intent = new Intent();
intent.putExtra("ymw", item.getTitle());
intent.setClass(MainActivity.this, Detail.class);
startActivity(intent);
}
// 发送短信
else if (id == 1) {
Uri uri = Uri.parse("smsto://18664599745");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "ymw-LOVE-yh");
startActivity(intent);
}
// 删除联系人
else if (id == 2) {
}
return super.onContextItemSelected(item);
}
// 获取手机联系人列表方法一
public ArrayList> GetContects() {
ArrayList> list = new ArrayList>();
Cursor cursor = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC");
if (cursor.moveToFirst()) {
int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
int nameColum = cursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
do {
String cOntactId= cursor.getString(idColumn);
String disPlayNameString = cursor.getString(nameColum);
// 查看有多少电话号码 没有则返回为0
int phOneCount= cursor
.getInt(cursor
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (phoneCount > 0) {
// 获得联系人的电话号码
Cursor phOnes= getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ "=" + contactId, null, null);
HashMap map = new HashMap();
map.put("imgView", R.drawable.ic_launcher);
map.put("name", disPlayNameString);
list.add(map);
}
} while (cursor.moveToNext());
if (cursor != null)
cursor.close();
}
return list;
}
// 获取联系人方法二
public ArrayList> fillMaps() {
ArrayList> items = new ArrayList>();
ContentResolver cr = getContentResolver();
HashMap> hashMap = new HashMap>();
Cursor phOne= cr.query(CommonDataKinds.Phone.CONTENT_URI,
new String[] { CommonDataKinds.Phone.CONTACT_ID,
CommonDataKinds.Phone.DISPLAY_NAME,
CommonDataKinds.Phone.NUMBER,
CommonDataKinds.Phone.DATA1
// CommonDataKinds.StructuredPostal.DATA3,
}, null, null, null);
while (phone.moveToNext()) {
String cOntactId= phone.getString(phone
.getColumnIndex(CommonDataKinds.Phone.CONTACT_ID));
String displayName = phone.getString(phone
.getColumnIndex(CommonDataKinds.Phone.DISPLAY_NAME));
String PhOneNumber= phone
.getString(phone
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String address = phone.getString(phone
.getColumnIndex(CommonDataKinds.Phone.DATA1));
// 以contactId为主键,把同一人的所有电话都存到一起。
ArrayList ad = hashMap.get(contactId);
if (ad == null) {
ad = new ArrayList();
ad.add(displayName);
ad.add(PhoneNumber);
// ad.add(address);
hashMap.put(contactId, ad);
} else {
ad.add(PhoneNumber);
}
}
phone.close();
ArrayList tmpList;
String tmpStr = "";
int k;
Iterator iter = hashMap.entrySet().iterator();
while (iter.hasNext()) {
HashMap.Entry entry = (HashMap.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
tmpList = (ArrayList) val;
tmpStr = "";
for (k = 1; k  tmpMap = new HashMap();
tmpMap.put("name", tmpList.get(0));
tmpMap.put("number", tmpStr);
tmpMap.put("imgView", R.drawable.ic_launcher);
items.add(tmpMap);
}
return items;
}
private String GetString(String str) {
String strLast = "";
int i = str.lastIndexOf(",");
if (i > 0) {
strLast = str.substring(0, str.length() - 1);
}
return strLast.replace(" ", "").replace(",", "\n").replace("+86", "");
}
}

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

package com.ymw.details;
import com.example.myandroid.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class Detail extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(com.example.myandroid.R.layout.phonedetails);
Intent intent = getIntent();
String strPara = intent.getStringExtra("ymw");
TextView tView = (TextView) findViewById(R.id.ymw);
tView.setText(strPara);
}
}

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

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




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

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

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
author-avatar
liuluoyu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有