Android 如何使用contentObserver和contentResolver从消息中读取已发送短信的内容?
我想从手机短信中读取发送的短信内容。我不是在开发发送短信阅读应用程序,而是想从手机内置短信应用程序中阅读最近发送的短信内容。 我想从已发送的邮件中读取已发送的短信,并根据邮件中的关键字发送一些通知 我知道我们必须扩展ContentObserver类并使用ContentResolver 任何想法都值得赞赏。谢谢大家! 这是我的观察者类SMSObserver.java 公共类SMSObserver扩展ContentObserver{Android 如何使用contentObserver和contentResolver从消息中读取已发送短信的内容?,android,android-studio,sms,android-contentresolver,Android,Android Studio,Sms,Android Contentresolver,我想从手机短信中读取发送的短信内容。我不是在开发发送短信阅读应用程序,而是想从手机内置短信应用程序中阅读最近发送的短信内容。 我想从已发送的邮件中读取已发送的短信,并根据邮件中的关键字发送一些通知 我知道我们必须扩展ContentObserver类并使用ContentResolver 任何想法都值得赞赏。谢谢大家! 这是我的观察者类SMSObserver.java 公共类SMSObserver扩展ContentObserver{ private String lastSmsId; private
private String lastSmsId;
private Context c;
private String phoneNumber;
int type;
String lastID;
public SMSObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange,Uri uri) {
super.onChange(selfChange);
Uri uriSMSURI = Uri.parse("content://sms/out");
Cursor cur = c.getContentResolver().query(uriSMSURI, null, null, null, "date DESC LIMIT 1");
cur.moveToNext();
//String id = cur.getString(cur.getColumnIndex("_id"));
if( (type == 2 || type == 1) && (!lastID.contentEquals(cur.getString(cur.getColumnIndex("_id")))) ) {
String protocol = cur.getString(cur.getColumnIndex("protocol"));
lastID = cur.getString(cur.getColumnIndex("_id"));
// Message sent
if (protocol == null) {
Log.i("SMSStatus", "SMS Sent");
}
// Message receive
else {
Log.i("SMSStatus", "SMS received");
}
if (smsChecker(lastID)) {
String address = cur.getString(cur.getColumnIndex("address"));
// Optional: Check for a specific sender
if (address.equals(phoneNumber)) {
String message = cur.getString(cur.getColumnIndex("body"));
// Use message content for desired functionality
if(message.contains("Dinner")){
Toast.makeText(c,"Dinner offer for 2!!",Toast.LENGTH_LONG).show();
}
}
}
}
}
// Prevent duplicate results without overlooking legitimate duplicates
public boolean smsChecker(String smsId) {
boolean flagSMS = true;
if (smsId.equals(lastSmsId)) {
flagSMS = false;
}
else {
lastSmsId = smsId;
}
Log.d(lastSmsId ,"LastSmsId");
return flagSMS;
}
}
我正在类SentSMSTrackerService.java中注册contentObserver
公共类SentSMSTrackerService扩展服务{
@Override
public int onStartCommand(Intent intent, int flag, int startId) {
SMSObserver smsObserver = new SMSObserver(new Handler());
ContentResolver contentResolver = getApplicationContext().getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/out"), true, smsObserver);
return START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
我还在AndroidManifest.xml中授予权限
但是,我还是看不清发送的短信。你有什么问题?您描述了您的想法以及如何尝试解决它,现在编写代码。所以社区不会为你这样做;)使用广播实现这一点我不确定其余的设置,但首先,没有
content://sms/out
URI。有一个content://sms/outbox
,但这是挂起的消息。您可能需要content://sms/sent
。其次,您不能在content://sms/sent
。它必须是content://sms
。别问我他们为什么那样做,但事实就是这样。您仍然可以查询content://sms/sent
很好,但这会让跟踪最近发送的消息变得更加复杂,因为您的观察者基本上会对sms
表进行任何更改,无论它是发送的消息还是其他信息。我尝试了“content://sms/sent“同样,即使这样也不起作用:(当我调试并查看日志时,我看不到任何日志。我认为我为从邮件中读取已发送项目而编写的代码不起作用。请你们中的任何人解释一下流程是如何进行的?是否将registerContentObserver()
中的URI更改为content://sms
?