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

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

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

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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "号码:"+this.number+",用户:"+this.userName+",编号:"+this.id+",短信内容:"+this.messageText;}}

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

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

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";//携带发送是否成功状态的Intentprivate Intent sentIntent; private PendingIntent sentPI; //携带接收是否成功状态的Intentprivate 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 blocke.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 blocke.printStackTrace();return null;} catch (IOException e) {// TODO Auto-generated catch blocke.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() {@Overridepublic 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() {@Overridepublic 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方法既能方便操作短信,符合面向对象高聚合低耦合,可复用的设计原则。

版权声明:本文为博主原创文章,未经博主允许不得转载。

如果你曾歌颂黎明,那么也请你拥抱黑夜

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

相关文章:

你感兴趣的文章:

标签云: