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

         近期做了一个简单的短信操作模块。比較有用小巧。主要功能是能够发送短信(包含短信发送状态的提示)。储存短信(能够用于短信列表显示等等),短信的储存能够用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方法既能方便操作短信,符合面向对象高聚合低耦合,可复用的设计原则。

posted on 2017-05-05 16:57  blfbuaa  阅读(245)  评论(0编辑  收藏  举报