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


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

  • 相关阅读:
    Delphi下Treeview控件基于节点编号的访问
    oracle的conn / as sysdba是以sys还是system用户登录呢?
    delphi 字母加数字如何自增??比如0A--0Z,1A--1Z一直到9A--9Z 请赐教
    ORACLE_HOME要怎么配置?
    sqlplus / as sysdba 详解
    oracle 11G数据库实例增加内存
    SQL在字符串中取出最长数字子序列
    delphi 全局变量的定义与初始化赋值
    Delphi公用函数单元
    Dapper的正确使用姿势
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6813869.html
Copyright © 2020-2023  润新知