作为一部手机,最重要的功能当属电话、短信、联系人了,所以今天想和大家分享的是关于Android电话、短信、联系人这块的API接口。

1、通话记录的获取

        List<TelePhoneRecord> mRecords=new ArrayList<TelePhoneRecord>();Cursor mCursor=mContext.getContentResolver().query(CallLog.Calls.CONTENT_URI, null,null, null,null);if(mCursor!=null && mCursor.moveToFirst()){do{TelePhoneRecord.getColumnIndex(mCursor);TelePhoneRecord mRecord=new TelePhoneRecord(mCursor);mRecords.add(mRecord);}while(mCursor.moveToNext());}mCursor.close();

其中TelephoneRecord是对通话记录的一个实体类,定义如下:

/** 通话记录描述类*/
package com.android.TelephoneAPIs.Tools;import android.database.Cursor;public class TelePhoneRecord
{/**通话记录ID **/private long mID;/**电话号码    **/private String mNumber;/**通话日期   **/private long mDate;/** 通话类型  **/private long mType;/** 1:来电* 2:去电*/private long mDuration;/**通话记录ID索引**/private static int Index_ID;/** 电话号码索引**/private static int Index_Number;/** 通话日期索引 **/private static int Index_Date;/** 通话类型索引 **/private static int Index_Type;/** 通话时间索引 **/private static int Index_Duration;public static void getColumnIndex(Cursor c){Index_ID=c.getColumnIndex("_id");Index_Number=c.getColumnIndex("number");Index_Date=c.getColumnIndex("date");Index_Type=c.getColumnIndex("type");Index_Duration=c.getColumnIndex("duration");}public TelePhoneRecord(Cursor c){mID=c.getLong(Index_ID);mNumber=c.getString(Index_Number);mDate=c.getLong(Index_Date);mType=c.getLong(Index_Type);mDuration=c.getLong(Index_Duration);}public long getID() {return mID;}public void setID(long mID) {this.mID = mID;}public String getNumber() {return mNumber;}public void setNumber(String mNumber) {this.mNumber = mNumber;}public long getDate() {return mDate;}public void setDate(long mDate) {this.mDate = mDate;}public long getType() {return mType;}public void setType(long mType) {this.mType = mType;}public long getDuration() {return mDuration;}public void setDuration(long mDuration) {this.mDuration = mDuration;}
}

2、来电、去电、短线的监听

监听来电:继承BoardcastReciver在onReceive方法中判断Intent的类型或者使用TelephoneManager获取电话状态

监听去电:继承BoardcastReciver在onReceive方法中判断Intent的类型

监听短信:在BoardcastReciver中,从Bundle中获取pdus数据,转换为SmsMessage对象

3、读取联系人

    List<Contact> mContacts=new ArrayList<Contact>();//此路径只能查询联系人名称/*Cursor c1=mContext.getContentResolver().query(Uri.withAppendedPath(ContactsContract.AUTHORITY_URI,"contacts"), null, null, null, null);*///此路径可以查询联系人名称和号码Cursor c2=mContext.getContentResolver().query(Uri.withAppendedPath(ContactsContract.AUTHORITY_URI,"data/phones"), null, null, null, null);if(c2!=null && c2.moveToFirst()){do{Contact.getColumnIndex(c2);Contact mContact=new Contact(c2);mContacts.add(mContact);}while(c2.moveToNext());}c2.close();

同样给出Contact的定义:

package com.android.TelephoneAPIs.Tools;import android.database.Cursor;public class Contact
{private String mName;private String mNum;private static int Index_Name;private static int Index_Num;public static void getColumnIndex(Cursor c){Index_Name=c.getColumnIndex("display_name");Index_Num=c.getColumnIndex("data1");}public Contact(Cursor c){mName=c.getString(Index_Name);mNum=c.getString(Index_Num);}public String getName() {return mName;}public void setName(String mName) {this.mName = mName;}public String getNum() {return mNum;}public void setNum(String mNum) {this.mNum = mNum;}
}

4、增加联系人

    ContentValues mValues=new ContentValues();//获取RawContactIDUri mRawContactUri=mContext.getContentResolver().insert(RawContacts.CONTENT_URI, mValues);long mRawContactID=ContentUris.parseId(mRawContactUri);mValues.clear();//设置RawContactIDmValues.put(StructuredName.RAW_CONTACT_ID, mRawContactID);//设置MIMETYPEmValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//设置联系人姓名mValues.put(StructuredName.DISPLAY_NAME, Name);//插入联系人姓名信息mContext.getContentResolver().insert(Data.CONTENT_URI, mValues);mValues.clear();//设置RawContactIDmValues.put(Phone.RAW_CONTACT_ID, mRawContactID);//设置MIMETYPEmValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//设置联系人号码mValues.put(Phone.NUMBER, Num);//插入联系人号码信息mContext.getContentResolver().insert(Data.CONTENT_URI, mValues);

5、短信读取

/** 短信读取工具类* @author:秦元培* 时间:2014年1月23日*/
package com.android.TelephoneAPIs.Tools;import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.database.Cursor;
import android.net.Uri;public class ShortMessageReader
{/** 定义收件箱查询地址  **/public static final Uri SMS_INBOX=Uri.parse("content://sms/inbox");/** 定义所有信息查询地址 **/public static final Uri SMS_ALL=Uri.parse("content://sms");/** 定义发件箱查询地址  **/public static final Uri SMS_TOBOX=Uri.parse("content://sms/sent");/** 获取所有的短消息**/public static List<ShortMessage>  getAllMessages(Context mContext){List<ShortMessage> Messages=new ArrayList<ShortMessage>();Messages=queryMessage(mContext,SMS_ALL, null,null);return Messages;}/** 获取指定号码的短消息   **/public static List<ShortMessage> getMessageByNumber(Context mContext,Uri mUri,String[]mSelectionAns){List<ShortMessage> Messages=new ArrayList<ShortMessage>();Messages=queryMessage(mContext, mUri, "address=?",mSelectionAns);return Messages;}/** 获取指定会话ID的短消息    **/public static List<ShortMessage> getMessageByThreadID(Context mContext,Uri mUri,String[]mSelectionAns){List<ShortMessage> Messages=new ArrayList<ShortMessage>();Messages=queryMessage(mContext, mUri, "thread_id=?",mSelectionAns);return Messages;}/** 获取任何满足条件的短消息    **/public static List<ShortMessage> queryMessage(Context mContext,Uri mUri,String mSelection,String[]mSelectionAns){List<ShortMessage> Messages=new ArrayList<ShortMessage>();Cursor mCursor=mContext.getContentResolver().query(mUri, null,mSelection,mSelectionAns, null);if(mCursor!=null && mCursor.moveToFirst()){do{ShortMessage.getColumnIndex(mCursor);ShortMessage mMessage=new ShortMessage(mCursor);/** 添加到Messages **/Messages.add(mMessage);}while(mCursor.moveToNext());}mCursor.close();return Messages;}
}

ShortMessage定义如下:

 package com.android.TelephoneAPIs.Tools;import android.database.Cursor;public class ShortMessage
{/** 短消息会话ID **/private long mThreadID;/** 短消息Id **/private long mID;/** 短消息内容  **/private String mBody;/** 短消息主题  **/private String mSubject;/** 短消息发送时间  **/private long mDate;/** 短消息发送人号码  **/private String mAddress;/** 短消息发送人  **/private int mPerson;/** 短消息状态   **/private int mRead;/** 短消息类型  **/private int mType;/** 获取会话ID索引**/private static int Index_Thread_ID;/** 获取ID索引**/private static int Index_ID;/** 获取地址索引  **/private static int Index_Address;/** 获取时间索引  **/private static int Index_Date;/** 获取主题索引 **/private static int Index_Subject;/** 获取内容索引 **/private static int Index_Body;/** 获取发送人索引  **/private static int Index_Person;/** 获取状态索引  **/private static int Index_Read;/** 获取类型索引  **/private static int Index_Type;public ShortMessage(Cursor c){/** 获取会话ID **/mThreadID=c.getLong(Index_Thread_ID);/** 获取ID **/mID=c.getLong(Index_ID);/** 获取Address **/mAddress=c.getString(Index_Address);/** 获取Subject **/mSubject=c.getString(Index_Subject);/** 获取Date **/mDate=c.getLong(Index_Date);/** 获取Body **/mBody=c.getString(Index_Body);/** 获取Person **/mPerson=c.getInt(Index_Person);/** 获取Read **/mRead=c.getInt(Index_Read);/** 获取Type **/mType=c.getInt(Index_Type);}public static void getColumnIndex(Cursor c){/** 获取会话ID索引**/Index_Thread_ID=c.getColumnIndex("thread_id");/** 获取ID索引**/Index_ID=c.getColumnIndex("_id");/** 获取地址索引  **/Index_Address=c.getColumnIndex("address");/** 获取时间索引  **/Index_Date=c.getColumnIndex("date");/** 获取主题索引 **/Index_Subject=c.getColumnIndex("subject");/** 获取内容索引 **/Index_Body=c.getColumnIndex("body");/** 获取发送人索引  **/Index_Person=c.getColumnIndex("person");/** 获取状态索引  **/Index_Read=c.getColumnIndex("read");/** 获取类型索引  **/Index_Type=c.getColumnIndex("type");}public long getThreadID() {return mThreadID;}public void setThreadID(long mThreadID) {this.mThreadID = mThreadID;}public long getID() {return mID;}public void setID(long mID) {this.mID = mID;}public String getBody() {return mBody;}public void setBody(String mBody) {this.mBody = mBody;}public long getDate() {return mDate;}public void setDate(long mDate) {this.mDate = mDate;}public String getAddress() {return mAddress;}public void setAddress(String mAddress) {this.mAddress = mAddress;}public long getRead() {return mRead;}public void setRead(int mRead) {this.mRead = mRead;}public long getPerson() {return mPerson;}public void setPerson(int mPerson) {this.mPerson = mPerson;}public String getSubject() {return mSubject;}public void setSubject(String mSubject) {this.mSubject = mSubject;}public long getType() {return mType;}public void setType(int mType) {this.mType = mType;}}

6、短信发送

 public static void sendMessage(Context mContext,String mNum,String mContent,boolean mSave){if(mSave){SmsManager mManager=SmsManager.getDefault();mManager.sendTextMessage(mNum, null, mContent, null, null);ContentValues mValues=new ContentValues();mValues.put("thread_id",getThreadIDByAddress(mContext,new String[]{mNum}));mValues.put("body", mContent);mValues.put("date", new Date().getTime());mValues.put("address", mNum);mValues.put("type", 2);mValues.put("read", 1);mContext.getContentResolver().insert(Uri.parse("content://sms"), mValues);}else{SmsManager mManager=SmsManager.getDefault();mManager.sendTextMessage(mNum, null, mContent, null, null);}}private static long getThreadIDByAddress(Context mContext,String[] SelectionArg){List<ShortMessage> mMessages=ShortMessageReader.getMessageByNumber(mContext, ShortMessageReader.SMS_INBOX,SelectionArg );ShortMessage m=mMessages.get(0);return m.getThreadID();}

上面的两个方法分别是发送短信和获取短线会话ID的方法,可以设定是否保存到数据库中

7、将短信以Xml文件形式导出

 public static void OutputByXml(List<ShortMessage> mMessages,String mXmlFilePath){File XmlFile = new File(mXmlFilePath);  try{  XmlFile.createNewFile();  }catch (IOException e) {  e.printStackTrace();}  FileOutputStream fos = null;  try{  fos = new FileOutputStream(XmlFile);  }catch (FileNotFoundException  e) {  e.printStackTrace();}  XmlSerializer serializer = Xml.newSerializer();  try {  serializer.setOutput(fos,"UTF-8");  serializer.startDocument(null, true);  serializer.startTag(null, "ShortMessages");  for(int i = 0; i < mMessages.size(); i ++){  serializer.startTag(null, "Message");  serializer.startTag(null, "Address");  serializer.text(mMessages.get(i).getAddress());  serializer.endTag(null, "Address");  serializer.startTag(null, "Body");  serializer.text(mMessages.get(i).getBody());  serializer.endTag(null, "Body");  serializer.endTag(null, "Message");  }  serializer.endTag(null, "ShortMessages");  serializer.endDocument();  serializer.flush();  fos.close();  } catch (Exception e) {  e.printStackTrace();}  }

以上代码全部测试通过,所需权限如下:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_SMS"/><uses-permission android:name="android.permission.WRITE_SMS"/><uses-permission android:name="android.permission.SEND_SMS"/><uses-permission android:name="android.permission.READ_CONTACTS"/>

Android开发学习之电话、短信、联系人相关推荐

  1. android复制短信到sim,Android开发之关于复制短信到SIM卡的分析.docx

    Android开发之关于复制短信到SIM卡的分析 Android开发之关于复制短信到SIM卡的分析 在framework层下的SmsManager类中,封装好了一个copyMessageToIcc方法 ...

  2. android开发发送短信,Android开发入门之发送短信

    第一步:新建一个Android工程命名为03.Sms目录结构如下图: 第二步:修改activity_main.xml布局文件代码如下: xmlns:tools="http://schemas ...

  3. Android开发app实现发送短信功能

    程序使用手机发短信的方法 短信收发: ◆发送短信只需要几行代码,如下: SmsManager sms = SmsManager.getDefault(); PendingIntent pi = Pen ...

  4. android中默认短信,android开发中设置默认短信应用的两种方法

    第一种:利用反射实现的无弹窗设置 public static final String CLASS_SMS_MANAGER = "com.android.internal.telephony ...

  5. android 拨打电话 发送短信 权限,Android开发实现拨打电话与发送信息的方法分析...

    本文实例讲述了Android开发实现拨打电话与发送信息的方法.分享给大家供大家参考,具体如下: xml布局: android:layout_width="fill_parent" ...

  6. Android项目:手机安全卫士(12)—— 通讯卫士之电话短信黑名单设置与拦截

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Android项目:手机安全卫士(12)-- 通讯卫士之电话.短信黑名单设置与拦截 1 介绍 今天进入新的功能开发了:通讯卫士, ...

  7. Android studio 实现打电话发短信浏览网页功能 android开发小实验

    Android studio 实现打电话发短信浏览网页功能 android开发小实验 目标: android studio 实现打电话 发短信 浏览网站的功能 先在布局里面定义几个按钮 分别为 打电话 ...

  8. Android 获取通话记录和短信内容

    Android 获取通话记录和短信内容 一.获取通话记录 1.权限声明,需要在Manifest.xml文件中声明权限(读取通话记录权限): <uses-permission android:na ...

  9. 开发一个发送手机短信的计算机软件

    开发一个发送手机短信的计算机软件 很久以前就有这个想法了,无奈时间有限,资料不足,一直没有成功.昨天突然意念再生,没想到还真搞成功了.接下来我将对这方面的技术做一个总结,并详细介绍我使用的方法细节.我 ...

最新文章

  1. Tomcat 配置安装
  2. 谈一谈:抽象工厂+反射+配置文件 实现数据访问程序
  3. Qt CheckBox的使用
  4. wxwidgets mysql_Ubuntu下wxWidgets学生公寓管理编程,sqlite3的用法(mysql数据_MySQL
  5. python代码自动补齐插件
  6. Java性能调优调查结果(第三部分)
  7. 2022百度职业资格考试培训行业洞察
  8. c语言位运算测试题及答案,[原创] 位运算和bit位操作程序题目答案 -- 谭浩强C语言习题...
  9. 【2021牛客暑期多校训练营7】xay loves trees(dfs序,维护根出发的链)
  10. linux解压缩6层
  11. 爱快软路由拨号移动网络设置
  12. 虚拟均衡器:Producers Vault Baby Bass for Mac
  13. c语言竞赛信息管理系统,一种基于ACM程序设计竞赛在线评测系统解决方案
  14. 《俞军产品方法论》阅读笔记2020-08-07
  15. KIS专业版12.0迁移K3WISE14.3后自定义核算项目权限问题
  16. mysql odbc 连接失败,mysql odbc 定时连接不上数据库
  17. IE浏览器地址栏输入中文乱码问题
  18. 第二集 第一魂环 第十一章
  19. 电阻的组成、分类及读数方法
  20. Java结合腾讯云实现短信验证码的发送

热门文章

  1. 反向工程解析QQ扫码登录的OAuth2流程
  2. [node.js]小释
  3. JAVA编写的一个简单的计算器
  4. SharePoint 2013 对二进制大型对象(BLOB)进行爬网
  5. Maximo 7.5 集成方式 去掉主菜单
  6. 企业呼吁更多关注网络安全
  7. Springboot2.0从零开始搭建脚手架-初始化和整合MybatisPlus3.0+...
  8. Nginx日志配置及分割
  9. 兰州市智慧城市建设再迈出实质性一步
  10. XYGame-AI设计3-行为树-第1版本