Android中读取短信信息,短信监听的各种问题,实现监听短信的功能

Android中读取的短信文件有

[java]  view plain copy print ?
  1. /** 
  2.  * 所有的短信 
  3.  */  
  4. public static final String SMS_URI_ALL = "content://sms/";  
  5. /** 
  6.  * 收件箱短信 
  7.  */  
  8. public static final String SMS_URI_INBOX = "content://sms/inbox";  
  9. /** 
  10.  * 发件箱短信 
  11.  */  
  12. public static final String SMS_URI_SEND = "content://sms/sent";  
  13. /** 
  14.  * 草稿箱短信 
  15.  */  
  16. public static final String SMS_URI_DRAFT = "content://sms/draft";  

读取的短信信息有:

    _id:短信序号,如100   
*   thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的   
*   address:发件人地址,即手机号,如+8613811810000   
*   person:发件人,如果发件人在通讯录中则为具体姓名,陌生人为null   
*   date:日期,long型,如1256539465022,可以对日期显示格式进行设置   
*   protocol:协议0SMS_RPOTO短信,1MMS_PROTO彩信      read:是否阅读0未读,1已读   
*   status:短信状态-1接收,0complete,64pending,128failed   
*   type:短信类型1是接收到的,2是已发出      body:短信具体内容   
*   service_center:短信服务中心号码编号,如+8613800755500

下面我们可以先建立一个SmsInfo来提取各种信息如下:

[java]  view plain copy print ?
  1. package com.pei.info;  
  2.   
  3. /** 
  4.  * class name:SmsInfo
     
  5.  * class description:获取短信各种信息的类
     
  6.  * PS: 
     
  7.  * Date:2012-3-19
     
  8.  *  
  9.  * @version 1.00 
  10.  * @author CODYY)peijiangping 
  11.  */  
  12. public class SmsInfo {  
  13.     /** 
  14.      * 短信内容 
  15.      */  
  16.     private String smsbody;  
  17.     /** 
  18.      * 发送短信的电话号码 
  19.      */  
  20.     private String phoneNumber;  
  21.     /** 
  22.      * 发送短信的日期和时间 
  23.      */  
  24.     private String date;  
  25.     /** 
  26.      * 发送短信人的姓名 
  27.      */  
  28.     private String name;  
  29.     /** 
  30.      * 短信类型1是接收到的,2是已发出 
  31.      */  
  32.     private String type;  
  33.   
  34.     public String getSmsbody() {  
  35.         return smsbody;  
  36.     }  
  37.   
  38.     public void setSmsbody(String smsbody) {  
  39.         this.smsbody = smsbody;  
  40.     }  
  41.   
  42.     public String getPhoneNumber() {  
  43.         return phoneNumber;  
  44.     }  
  45.   
  46.     public void setPhoneNumber(String phoneNumber) {  
  47.         this.phoneNumber = phoneNumber;  
  48.     }  
  49.   
  50.     public String getDate() {  
  51.         return date;  
  52.     }  
  53.   
  54.     public void setDate(String date) {  
  55.         this.date = date;  
  56.     }  
  57.   
  58.     public String getName() {  
  59.         return name;  
  60.     }  
  61.   
  62.     public void setName(String name) {  
  63.         this.name = name;  
  64.     }  
  65.   
  66.     public String getType() {  
  67.         return type;  
  68.     }  
  69.   
  70.     public void setType(String type) {  
  71.         this.type = type;  
  72.     }  
  73. }  

然后就是封装类,读取信息内容SmsContent.java

[java]  view plain copy print ?
  1. package com.pei.util;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.pei.info.SmsInfo;  
  7.   
  8. import android.app.Activity;  
  9. import android.database.Cursor;  
  10. import android.net.Uri;  
  11.   
  12. /** 
  13.  * class name:SmsChoose
     
  14.  * class description:获取手机中的各种短信信息
     
  15.  * PS: 需要权限 
     
  16.  * Date:2012-3-19
     
  17.  *  
  18.  * @version 1.00 
  19.  * @author CODYY)peijiangping 
  20.  */  
  21. public class SmsContent {  
  22.     private Activity activity;//这里有个activity对象,不知道为啥以前好像不要,现在就要了。自己试试吧。  
  23.     private Uri uri;  
  24.     List infos;  
  25.   
  26.     public SmsContent(Activity activity, Uri uri) {  
  27.         infos = new ArrayList();  
  28.         this.activity = activity;  
  29.         this.uri = uri;  
  30.     }  
  31.   
  32.     /** 
  33.      * Role:获取短信的各种信息 
     
  34.      * Date:2012-3-19 
     
  35.      *  
  36.      * @author CODYY)peijiangping 
  37.      */  
  38.     public List getSmsInfo() {  
  39.         String[] projection = new String[] { "_id""address""person",  
  40.                 "body""date""type" };  
  41.         Cursor cusor = activity.managedQuery(uri, projection, nullnull,  
  42.                 "date desc");  
  43.         int nameColumn = cusor.getColumnIndex("person");  
  44.         int phoneNumberColumn = cusor.getColumnIndex("address");  
  45.         int smsbodyColumn = cusor.getColumnIndex("body");  
  46.         int dateColumn = cusor.getColumnIndex("date");  
  47.         int typeColumn = cusor.getColumnIndex("type");  
  48.         if (cusor != null) {  
  49.             while (cusor.moveToNext()) {  
  50.                 SmsInfo smsinfo = new SmsInfo();  
  51.                 smsinfo.setName(cusor.getString(nameColumn));  
  52.                 smsinfo.setDate(cusor.getString(dateColumn));  
  53.                 smsinfo.setPhoneNumber(cusor.getString(phoneNumberColumn));  
  54.                 smsinfo.setSmsbody(cusor.getString(smsbodyColumn));  
  55.                 smsinfo.setType(cusor.getString(typeColumn));  
  56.                 infos.add(smsinfo);  
  57.             }  
  58.             cusor.close();  
  59.         }  
  60.         return infos;  
  61.     }  
  62. }  

在提供一个listview来显示短信内容:

[java]  view plain copy print ?
  1. package com.pei.activity;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.pei.fixed.AllFinalInfo;  
  6. import com.pei.info.SmsInfo;  
  7. import com.pei.util.SmsContent;  
  8. import android.app.Activity;  
  9. import android.content.Context;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.view.LayoutInflater;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. import android.widget.BaseAdapter;  
  16. import android.widget.ListView;  
  17. import android.widget.TextView;  
  18.   
  19. /** 
  20.  * class name:SmsListActivity
     
  21.  * class description:显示短信的列表
     
  22.  * PS: 
     
  23.  * Date:2012-3-19
     
  24.  *  
  25.  * @version 1.00 
  26.  * @author CODYY)peijiangping 
  27.  */  
  28. public class SmsListActivity extends Activity {  
  29.     private ListView listview;  
  30.     private List infos;  
  31.   
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.sms);  
  36.         Uri uri = Uri.parse(AllFinalInfo.SMS_URI_INBOX);  
  37.         SmsContent sc = new SmsContent(this, uri);  
  38.         infos = sc.getSmsInfo();  
  39.         listview = (ListView) this.findViewById(R.id.ListView_Sms);  
  40.         listview.setAdapter(new SmsListAdapter(this));  
  41.     }  
  42.   
  43.     class SmsListAdapter extends BaseAdapter {  
  44.         private LayoutInflater layoutinflater;  
  45.         private View myview;  
  46.   
  47.         public SmsListAdapter(Context c) {  
  48.             layoutinflater = LayoutInflater.from(c);  
  49.         }  
  50.   
  51.         @Override  
  52.         public int getCount() {  
  53.             // TODO Auto-generated method stub  
  54.             return infos.size();  
  55.         }  
  56.   
  57.         @Override  
  58.         public Object getItem(int position) {  
  59.             // TODO Auto-generated method stub  
  60.             return null;  
  61.         }  
  62.   
  63.         @Override  
  64.         public long getItemId(int position) {  
  65.             // TODO Auto-generated method stub  
  66.             return 0;  
  67.         }  
  68.   
  69.         @Override  
  70.         public View getView(int position, View convertView, ViewGroup parent) {  
  71.             if (convertView == null) {  
  72.                 myview = layoutinflater.inflate(R.layout.smsitem, null);  
  73.             }  
  74.             TextView body = (TextView) myview  
  75.                     .findViewById(R.id.TextView_SmsBody);  
  76.             TextView name = (TextView) myview  
  77.                     .findViewById(R.id.TextView_SmsName);  
  78.             body.setText(infos.get(position).getSmsbody());  
  79.             name.setText(infos.get(position).getName());  
  80.             return myview;  
  81.         }  
  82.   
  83.     }  
  84. }  

写一个短信监听程序,大家很容易想到的就是注册一个广播接收器,来接收系统收到短信时候的广播。可是这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。网上有很多这样的例子,什么提高广播接收器的优先级又是1000又是10000的。。

大家可以看看这个广播的基本介绍:http://wenku.baidu.com/view/226f9dd5b14e852458fb57ba.html

这里提到了把intent-filter中的android:priority的值设置为1000,但是在实时中你设置1000一样是接受不到广播的,除非你把手机中的其他接受了这个广播的短信卸载,比如360 GO短信,飞信神马的。他们的优先级总是要比你的高。你可以继续BAIDU,有的人会设置它为10000 9999等等,你会发现设置为10000的时候偶尔可以接收到,仅仅是偶尔。那肿么办呢。

我下面用的方法不是去接收系统广播,而是去监听短信数据库的变化,当收到短信数据库变化了的时候,去取得最新的那条短信即可。或者你想别的什么操作也可以。

监听类SmsReceiver.java

[java]  view plain copy print ?
  1. package com.pei.broadcastReceiver;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.pei.fixed.AllFinalInfo;  
  6. import com.pei.info.SmsInfo;  
  7. import com.pei.util.SmsContent;  
  8.   
  9. import android.app.Activity;  
  10. import android.database.ContentObserver;  
  11. import android.net.Uri;  
  12. import android.os.Handler;  
  13.   
  14. /** 
  15.  * class name:SmsReceiver
     
  16.  * class description:数据库改变监听类
     
  17.  * PS:当数据改变的时候,执行里面才change方法
     
  18.  * Date:2012-3-16
     
  19.  *  
  20.  * @version 1.00 
  21.  * @author CODYY)peijiangping 
  22.  */  
  23. public class SmsReceiver extends ContentObserver {  
  24.     /** 
  25.      * Activity对象 
  26.      */  
  27.     private Activity activity;  
  28.     private List infos;  
  29.   
  30.     public SmsReceiver(Handler handler, Activity activity) {  
  31.         super(handler);  
  32.         this.activity = activity;  
  33.     }  
  34.   
  35.     @Override  
  36.     public void onChange(boolean selfChange) {  
  37.         Uri uri = Uri.parse(AllFinalInfo.SMS_URI_INBOX);// 设置一个uri来查看各种类别短信内容  
  38.         SmsContent smscontent = new SmsContent(activity, uri);  
  39.         infos = smscontent.getSmsInfo();  
  40.         System.out.println(infos.get(1).getSmsbody());  
  41.         super.onChange(selfChange);  
  42.     }  
  43. }  

怎么注册这个监听呢,只需:

[java]  view plain copy print ?
  1. ContentObserver co = new SmsReceiver(new Handler(),  
  2.                 AndroidUtilActivity.this);  
  3.         this.getContentResolver().registerContentObserver(  
  4.                 Uri.parse("content://sms/"), true, co);  

这样你就可以随意的读取各种短信的各种内容了,显示也十分方便。方法还可以继续封装。有待改进。

你可能感兴趣的:(dylan)