Android短信监听(二)——利用ContentObserver实现短信监听
2016-01-13 19:53
495 查看
MainActivity例如以下:
SMSContentObserver例如以下:
SmsInfo例如以下:
main.xml例如以下:
package cc.testsmslistener; import cc.testsmslistener.SMSContentObserver.MessageListener; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.TextView; import android.app.Activity; /** * Demo描写叙述: * 利用ContentObserver实现短信监听 * * 注意权限: * <uses-permission android:name="android.permission.READ_SMS" /> * * 參考资料: * http://blog.csdn.net/peijiangping1989/article/details/7368178 * Thank you very much * */ public class MainActivity extends Activity { private TextView mTextView; //全部短信 public static final String URI = "content://sms/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init() { mTextView=(TextView) findViewById(R.id.textView); //注冊内容观察者 SMSContentObserver smsContentObserver = new SMSContentObserver(new Handler(),this); this.getContentResolver().registerContentObserver (Uri.parse(URI), true, smsContentObserver); //回调 smsContentObserver.setOnReceivedMessageListener(new MessageListener() { @Override public void OnReceived(String message) { mTextView.setText(message); } }); } }
SMSContentObserver例如以下:
package cc.testsmslistener; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; public class SMSContentObserver extends ContentObserver { //全部短信 public static final String SMS_URI_ALL = "content://sms/"; //收件箱短信 public static final String SMS_URI_INBOX = "content://sms/inbox"; //发件箱短信 public static final String SMS_URI_SEND = "content://sms/sent"; //草稿箱短信 public static final String SMS_URI_DRAFT = "content://sms/draft"; private Activity mActivity; private List<SmsInfo> mSmsInfoList; private MessageListener mMessageListener; public SMSContentObserver(Handler handler, Activity activity) { super(handler); this.mActivity = activity; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uri = Uri.parse(SMS_URI_INBOX); mSmsInfoList = this.getSmsInfo(uri,mActivity); mMessageListener.OnReceived(mSmsInfoList.get(0).getSmsbody()); System.out.println("Message content is:"+mSmsInfoList.get(0).getSmsbody()); System.out.println("Message info is:"+mSmsInfoList.get(0)); } /** * 注意: * 该处仅仅用依照时间降序取出第一条就可以 * 这条当然是最新收到的消息 */ private List<SmsInfo> getSmsInfo(Uri uri,Activity activity){ List<SmsInfo> smsInfoList=new ArrayList<SmsInfo>(); String[] projection = new String[] { "_id", "address", "person","body", "date", "type" }; Cursor cusor = activity.managedQuery(uri, projection, null, null,"date desc limit 1"); int nameColumn = cusor.getColumnIndex("person"); int phoneNumberColumn = cusor.getColumnIndex("address"); int smsbodyColumn = cusor.getColumnIndex("body"); int dateColumn = cusor.getColumnIndex("date"); int typeColumn = cusor.getColumnIndex("type"); if (cusor != null) { while (cusor.moveToNext()) { SmsInfo smsinfo = new SmsInfo(); smsinfo.setName(cusor.getString(nameColumn)); smsinfo.setDate(cusor.getString(dateColumn)); smsinfo.setPhoneNumber(cusor.getString(phoneNumberColumn)); smsinfo.setSmsbody(cusor.getString(smsbodyColumn)); smsinfo.setType(cusor.getString(typeColumn)); smsInfoList.add(smsinfo); } cusor.close(); } System.out.println("smsInfoList.size()="+smsInfoList.size()); return smsInfoList; } // 回调接口 public interface MessageListener { public void OnReceived(String message); } public void setOnReceivedMessageListener( MessageListener messageListener) { this.mMessageListener=messageListener; } }
SmsInfo例如以下:
package cc.testsmslistener; public class SmsInfo { //短信内容 private String smsbody; //发送短信的电话号码 private String phoneNumber; //发送短信时间 private String date; //发送短信人的姓名 private String name; //短信类型1是接收到的,2是已发出 private String type; public String getSmsbody() { return smsbody; } public void setSmsbody(String smsbody) { this.smsbody = smsbody; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String toString() { return "SmsInfo [smsbody=" + smsbody + ", phoneNumber=" + phoneNumber + ", date=" + date + ", name=" + name + ", type=" + type + "]"; } }
main.xml例如以下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" android:layout_centerInParent="true" /> </RelativeLayout>
相关文章推荐
- Android 打开文件对话框与保存文件对话框
- Android6.0之运行时权限
- android 实现自定义键盘的实例
- Android 4.4 Graphic系统详解(2) VSYNC的生成
- android异步加载图片并缓存到本地实现方法
- Android 关于SVG矢量图支持
- Android 自定义EditText 实现获得焦点并且有内容显示右侧图片并点击清空内容
- Android之史上最全最简单最有用的第三方开源库收集整理
- Android TextView加载Html语句
- Android Volley二次封装
- Android PopupWindow的使用
- android基础学习004_Android listview与adapter用法
- 使用Vitamio打造自己的Android万能播放器—— 手势控制亮度、音量、缩放
- android四大组件---service
- Android PopupWindow的使用技巧
- (转)android头像设置:从本地照片库或拍照获取并剪裁
- android studio gradle 打包
- Android 中的 packages 间共享数据的一种方法
- Android LRU算法 图片缓存性能改善 <9>
- android布局 Android fill_parent wrap_content 和match_parent的区别