作为一部手机,最重要的功能当属电话、短信、联系人了,所以今天想和大家分享的是关于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();
//获取RawContactID
Uri mRawContactUri=mContext.getContentResolver().insert(RawContacts.CONTENT_URI, mValues);
long mRawContactID=ContentUris.parseId(mRawContactUri);
mValues.clear();
//设置RawContactID
mValues.put(StructuredName.RAW_CONTACT_ID, mRawContactID);
//设置MIMETYPE
mValues.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
//设置联系人姓名
mValues.put(StructuredName.DISPLAY_NAME, Name);
//插入联系人姓名信息
mContext.getContentResolver().insert(Data.CONTENT_URI, mValues);
mValues.clear();
//设置RawContactID
mValues.put(Phone.RAW_CONTACT_ID, mRawContactID);
//设置MIMETYPE
mValues.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"/>