安卓开发之简单的短信操作模块

10月10日 收藏 0 评论 0 产品经理

安卓开发之简单的短信操作模块

转载声明:文章来源:https://blog.csdn.net/sinat_23092639/article/details/47679673

最近做了一个简单的短信操作模块,比较实用小巧。主要功能是可以发送短信(包括短信发送状态的提示),储存短信(可以用于短信列表显示等等),短信的储存可以用SQLite,不过觉得也就几十条上百条短信,用SQLite未免大材小用,还麻烦,于是决定用SharePreference结合对象序列化来做这个模块。

首先是短信实体类,为了复用,做成抽象类,再具体项目中使用只要继承该抽象类即可:

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
public abstract class Message implements Serializable{
    private String number;
    //private int playTime;
    private int id;
    private String userName;
    private String messageText;
    private String time;
     
     
     
    public Message(String number, int playTime, int id, String userName,
            String messageText, String time) {
        super();
        this.number = number;
    //  this.playTime = playTime;
        this.id = id;
        this.userName = userName;
        this.messageText = messageText;
        this.time = time;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
     
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getMessageText() {
        return messageText;
    }
    public void setMessageText(String messageText) {
        this.messageText = messageText;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "号码:"+this.number+",用户:"+this.userName+",编号:"
                +this.id+",短信内容:"+this.messageText;
    }
     
     
}

拥有几个短信必须的数据作为成员变量,然后重新toString方法。

核心操作类,MessageUtils,拥有发送短信方法,包括发送完后对短信的保存,短信发送成功与否、接收成功与否状态的反馈功能,对单条短信和全部短信获取都有提供对外接口,使用的时候非常方便:

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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
public class MessageUtils {
  
    //private Message message;
    private Context context;
     
    private String SENT_SMS_ACTION = "SENT_SMS_ACTION"
    private String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";
     
    //携带发送是否成功状态的Intent
    private Intent sentIntent; 
    private PendingIntent sentPI; 
    //携带接收是否成功状态的Intent
    private Intent deliverIntent; 
    private PendingIntent deliverPI; 
     
    public MessageUtils(Context context) {
        super();
         
        this.context = context;
        sentIntent = new Intent(SENT_SMS_ACTION); 
         
        deliverIntent = new Intent(DELIVERED_SMS_ACTION);
         
    }
  
    /**
     * 序列化对象
     * @param message
     * @return
     * @throws IOException
     */
    private String serialize(Message message) throws IOException { 
        
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
        ObjectOutputStream objectOutputStream = new ObjectOutputStream( 
                byteArrayOutputStream); 
        objectOutputStream.writeObject(message); 
        String serStr = byteArrayOutputStream.toString("ISO-8859-1"); 
        serStr = java.net.URLEncoder.encode(serStr, "UTF-8"); 
        objectOutputStream.close(); 
        byteArrayOutputStream.close(); 
        
        return serStr; 
    
   
    /**
     * 反序列化对象
     
     * @param str 将要转化为对象的字符串
     * @return
     * @throws IOException
     * @throws ClassNotFoundException
     */ 
    private  Message deSerialization(String str) throws IOException, 
            ClassNotFoundException { 
        if(str == null || str == ""){
            return null;
        }
        String redStr = java.net.URLDecoder.decode(str, "UTF-8"); 
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( 
                redStr.getBytes("ISO-8859-1")); 
        ObjectInputStream objectInputStream = new ObjectInputStream( 
                byteArrayInputStream); 
        Message message = (Message) objectInputStream.readObject(); 
        objectInputStream.close(); 
        byteArrayInputStream.close(); 
         
        return message; 
    
    /**
     * 保存短信
     * @param strObject 序列化后转化为String的短信对象
     * @param num  短信存储的序号
     */
    private  void  saveMessage(Message message,int num) {
        String strObject;
        try {
            String i = String.valueOf(num);
            strObject = serialize(message);
            SharedPreferences sp = context.getSharedPreferences("Message", 0); 
            Editor edit = sp.edit(); 
            edit.putString(i, strObject); 
            edit.commit();
            //重置短信总条数
            setSmsCount(num);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    
     
    /**
     * 删除某条短信
     * @param num  被删除短信的存储序号
     */
    public void deleteMessage(int num) {
         
        int sum = getSmsCount();
        if(sum == num){
            setSmsCount(--sum);
            return;
        }
        for(int i = num;i < sum;i++ ){
            Message message = getMessage(i+1);
            saveMessage(message, i);
        }
             
//          int count = getSmsCount();
//              setSmsCount(--count);
    }
   
    /**
     * 获得某条短信
     * @param num 短信存储的序号
     * @return
     */
    public Message getMessage(int num) { 
        SharedPreferences sp = context.getSharedPreferences("Message", 0);
        Message message;
        String i = String.valueOf(num);
        try {
            message = deSerialization(sp.getString(i, null));
            return message;
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
  
        }
         
         
    
     
    /**
     * 获得全部存储的短信
     * @return
     */
    public List<Message> getAllMessage() {
        List<Message> messages = new ArrayList<Message>();
        for(int i = 1;i <= getSmsCount();i++){
            Message message = getMessage(i);
            messages.add(message);
        }
        return messages;
  
    }
     
    /**
     * 发送短信,注册发送状态广播和接收状态广播,每发送一条短信就将其储存起来
     * @param messageText 短信内容
     * @param num 对方号码
     */
    public void sendMessage(Message message){
        SmsManager smsManager = SmsManager.getDefault(); 
        sentPI = PendingIntent.getBroadcast(context, 0, sentIntent, 0);
        deliverPI = PendingIntent.getBroadcast(context, 0, deliverIntent, 0);
        regSendBroadcast();
        regRecBroadcast();
        List<String> divideContents = smsManager.divideMessage(message.getMessageText());   
        for (String text : divideContents) {   
            smsManager.sendTextMessage(message.getNumber(), null, text, sentPI, deliverPI);   
        }
        int count = getSmsCount();
        //每发送一条短信就将其储存
        saveMessage(message, ++count);
    }
     
     
    /**
     * 注册发送状态广播,等待运营商返回结果码,根据结果码作出相应的反应
     */
    private void regSendBroadcast(){
         context.registerReceiver(new BroadcastReceiver() { 
                @Override 
                public void onReceive(Context _context, Intent _intent) { 
                    switch (getResultCode()) { 
                          case Activity.RESULT_OK: 
                               Toast.makeText(context, 
                            "短信发送成功", Toast.LENGTH_SHORT) 
                            .show(); 
                    break
                      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
                          Toast.makeText(context, 
                                    "短信发送失败", Toast.LENGTH_SHORT) 
                                    .show();
                    break
                      case SmsManager.RESULT_ERROR_RADIO_OFF: 
                          Toast.makeText(context, 
                                "短信发送失败", Toast.LENGTH_SHORT) 
                                .show();
                    break
                      case SmsManager.RESULT_ERROR_NULL_PDU:
                          Toast.makeText(context, 
                                "短信发送失败", Toast.LENGTH_SHORT) 
                                .show();
                    break
                    
                
            }, new IntentFilter(SENT_SMS_ACTION)); 
    }
     
    /**
     * 注册短信接收状态广播,一旦接收方成功收到短信则收到广播
     */
    private void regRecBroadcast(){
         
        context.registerReceiver(new BroadcastReceiver() { 
           @Override 
           public void onReceive(Context _context, Intent _intent) { 
               Toast.makeText(context, 
          "收信人已经成功接收", Toast.LENGTH_SHORT) 
          .show(); 
           
        }, new IntentFilter(DELIVERED_SMS_ACTION)); 
    }
     
    /**
     * 设置短信条数记录
     * @param count
     */
    private void setSmsCount(int count) {
        SharedPreferences sp = context.getSharedPreferences("Message", 0); 
        Editor edit = sp.edit(); 
        edit.putInt("smsCount", count);
        edit.commit(); 
  
    }
     
    /**
     * 获得存储短信总条数
     * @return
     */
   public int getSmsCount() {
       SharedPreferences sp = context.getSharedPreferences("Message", 0);
       int count = sp.getInt("smsCount", 0);
       return count;
    }
    
    
    
}

使用对象的序列化和反序列化,将一个Message对象转化为String对象,将其存储在SharePreference中,键值为短信的序号。通过该序号就可以查询或删除指定短信。
这样单项目需要短信操作并需要存储短信时,可以使用这个小模块,只需要一个MessageUtils对象,调用它的public方法既能方便操作短信,符合面向对象高聚合低耦合,可复用的设计原则。

C 0条回复 评论

帖子还没人回复快来抢沙发