Android开发学习之电话、短信、联系人

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

1、通话记录的获取

?
1
2
3
4
5
6
7
8
9
10
11
12
13
         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></telephonerecord>

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

?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
  * 通话记录描述类
  */
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、读取联系人

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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></contact>
同样给出Contact的定义:

?
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
35
36
37
38
39
40
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、增加联系人

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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、短信读取

?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
  * 短信读取工具类
  * @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></shortmessage></shortmessage></shortmessage></shortmessage></shortmessage></shortmessage></shortmessage></shortmessage></shortmessage></shortmessage></shortmessage>
ShortMessage定义如下:

?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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、短信发送

?
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
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();
       }</shortmessage>

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

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

?
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
35
36
37
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();
      
   }</shortmessage>

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

?
1
2
3
4
5
<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" ></uses-permission></uses-permission></uses-permission></uses-permission></uses-permission>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值