当前位置: 代码迷 >> Android >> 安卓开发之容易的短信操作模块
  详细解决方案

安卓开发之容易的短信操作模块

热度:45   发布时间:2016-04-27 23:28:17.0
安卓开发之简单的短信操作模块

         最近做了一个简单的短信操作模块,比较实用小巧。主要功能是可以发送短信(包括短信发送状态的提示),储存短信(可以用于短信列表显示等等),短信的储存可以用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;	}	@Override	public String toString() {		// TODO Auto-generated method stub		return "号码:"+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"; 		//携带发送是否成功状态的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方法既能方便操作短信,符合面向对象高聚合低耦合,可复用的设计原则。

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

  相关解决方案