问题
I am trying to listen to outgoing sms messages. I was following the accepted answer here but it is not working. I'm not sure where I am going wrong. I am no familiar at all with Content Observers so forgive my ignorance.
I wanted to create it in a service so it would be running all the time. here is my code in that service:
import android.app.Service;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
public class SmsOutgoingObserver extends Service {
public SmsOutgoingObserver() {
}
/* this method handles a single incoming request */
@Override
public int onStartCommand(Intent intent, int flags, int id) {
Log.d("OUTGOING", "RUNNING SERVICE");
return START_STICKY; // stay running
}
@Override
public IBinder onBind(Intent intent) {
return null; // disable binding
}
public class SmsObserver extends ContentObserver {
public SmsObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uriSMSURI = Uri.parse("content://sms/out");
Cursor cr = SmsOutgoingObserver.this.getContentResolver().query(uriSMSURI, null, null, null, null);
cr.moveToNext();
String address = cur.getString(cr.getColumnIndex("body"));
Log.d("OUTGOING", address);
cr.close();
//Database.messageReceived(SmsOutgoingObserver.this, address);
}
}
}
What am I doing wrong?
回答1:
In addition to the silly mistake on my part that @CommonsWare pointed out, me missing
@Override
public void onCreate() {
super.onCreate();
ContentResolver contentResolver = this.getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, new SmsObserver(new Handler()));
}
the other issue was actually in these two lines
contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, new SmsObserver(new Handler()));
and
Uri uriSMSURI = Uri.parse("content://sms/out");
where I changed the content://sms/out to content://sms and then proceeded to check for the type to make sure the change I was getting was actually an outgoing message. I also had to make sure to check for multiple calls like so:
if (cr.getInt(cr.getColumnIndex("type")) == 2) {
if(id != cr.getInt(cr.getColumnIndex(cr.getColumnName(0)))) {
id = cr.getInt(cr.getColumnIndex(cr.getColumnName(0)));
String address = cr.getString(cr.getColumnIndex("address"));
Database.messageSent(SmsOutgoingObserver.this, address);
Log.d("OUTGOING", address);
} else {
Log.d("OUTGOING", "MESSAGE ALREADY LOGGED");
}
};
}
and simply defined private int id = 0; as a global variable
回答2:
Your SmsOutgoingObserver does nothing other than log a message to LogCat. If you want to use SmsObserver, you need to add some code, such as call registerContentObserver(). This is shown in the accepted answer on the question that you linked to.
来源:https://stackoverflow.com/questions/38963327/listening-to-outgoing-sms-not-working-android