我正在开发一个应用程序,它将所有传入和传出的短信存储在SD卡的文本文件中.
我能够使用广播接收器收听传入的消息.我发现收听外发短信非常困难.
我知道在某种程度上需要设置发送的盒子或发件箱上的内容观察者,但我不知道该怎么做.
如何才能做到这一点?
Cri*_*ian 47
基本上,你必须注册一个内容观察者......这样的事情:
ContentResolver contentResolver = context.getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, yourObserver);
Run Code Online (Sandbox Code Playgroud)
yourObserver是一个object(new YourObserver(new Handler())),看起来像这样:
class YourObserver extends ContentObserver {
public YourObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// save the message to the SD card here
}
}
Run Code Online (Sandbox Code Playgroud)
那么,你究竟如何获得短信的内容?你必须使用Cursor:
// save the message to the SD card here
Uri uriSMSURI = Uri.parse("content://sms/out");
Cursor cur = this.getContentResolver().query(uriSMSURI, null, null, null, null);
// this will make it point to the first record, which is the last SMS sent
cur.moveToNext();
String content = cur.getString(cur.getColumnIndex("body"));
// use cur.getColumnNames() to get a list of all available columns...
// each field that compounds a SMS is represented by a column (phone number, status, etc.)
// then just save all data you want to the SDcard :)
Run Code Online (Sandbox Code Playgroud)
小智 5
这是我解决这个问题的方法
在其中创建内容观察者
@Override
public int onStartCommand(Intent intent, int flag, int startId) {
MyObserver myObserver = new MyObserver(new Handler());
ContentResolver contentResolver = this.getApplicationContext().getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, myObserver);
return START_STICKY;
}
Run Code Online (Sandbox Code Playgroud)创建观察者类
class MyObserver extends ContentObserver {
public MyObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uriSMSURI = Uri.parse("content://sms/sent");
Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null);
cur.moveToNext();
String content = cur.getString(cur.getColumnIndex("body"));
String smsNumber = cur.getString(cur.getColumnIndex("address"));
if (smsNumber == null || smsNumber.length() <= 0) {
smsNumber = "Unknown";
}
cur.close();
if(smsChecker( "OutgoingSMS to " + smsNumber + ": " + content)) {
//save data into database/sd card here
}
}
}
Run Code Online (Sandbox Code Playgroud)我添加了一个方法smsChecker()来检查新消息是否与上一条消息相同
public boolean smsChecker(String sms) {
boolean flagSMS = true;
if (sms.equals(lastSMS)) {
flagSMS = false;
}
else {
lastSMS = sms;
}
//if flagSMS = true, those 2 messages are different
return flagSMS;
}
Run Code Online (Sandbox Code Playgroud)如果我没有弄错的话,我们使用"content:// sms/sent"如果我们只想检查所有发送的消息,"content:// sms/out"如果我们只想检查发件箱内的所有消息,并且"内容:// sms"如果我们想检查所有消息.
| 归档时间: |
|
| 查看次数: |
28302 次 |
| 最近记录: |