我知道这里有一些与此相关的问题,但是没有一个问题帮助我实现这一点 - 捕获正在发送的短信。 我在三星手机上使用Android 2.2(FROYO)(如果这在某种程度上重要)。
我在Stackoverflow上搜索了很多,并意识到我的请求需要ContentObserver
。我使用Service而不是Activity,所以我在ContentObserver
类中注册了Service
,它看起来像这样:
public class SMSSending extends Service {
private class MyContentObserver extends ContentObserver {
public MyContentObserver() {
super(null);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uriSMSURI = Uri.parse("content://sms/sent");
Cursor cur = getBaseContext().getContentResolver().query(uriSMSURI, null, null, null, null);
cur.moveToNext();
String content = cur.getString(cur.getColumnIndex("body"));
Toast.makeText(getApplicationContext(), "SOME TEXT", Toast.LENGTH_LONG).show();
}
@Override
public boolean deliverSelfNotifications() {
return false;
}
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
MyContentObserver contentObserver = new MyContentObserver();
ContentResolver contentResolver = getBaseContext().getContentResolver();
contentResolver.registerContentObserver(Uri.parse("content://sms/sent"),true, contentObserver);
Toast.makeText(getApplicationContext(), "SERVICE CREATED", Toast.LENGTH_LONG).show();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(getApplicationContext(), "SERVICE STARTED", Toast.LENGTH_LONG).show();
}
}
正如您所看到的,我已将Toast
放在少数几个位置,以便我可以看到它是否正常工作 - 很遗憾,这些通知都没有出现。此外,我尝试为LogCat添加一些代码,但没有任何反应。
我还尝试将Uri uriSMSURI = Uri.parse("content://sms");
代替content://sms/sent
但应用程序根本不做任何事情。
当然,我有Manifest的权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
我缺少什么?
答案 0 :(得分:2)
幸运的是,我已经设法解决了这个问题,但采用了完全不同的方法。也许这会在将来帮助某人..
我没有使用ContentObserver(我仍然不知道为什么不起作用),我创建了新的Thread并在创建和启动服务后启动它。所以它看起来像这样:
...
final Uri CONTENT_URI = Uri.parse("content://sms/sent");
...
public void onStart(Intent intent, int startid) {
Go();
}
private void Go(){
new Thread(new Runnable() {
public void run() {
try {
while(true){
Cursor cursor = getContentResolver().query(CONTENT_URI, null, null, null, null);
if(cursor.moveToFirst()){
text = cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();
if(!text.equalsIgnoreCase(actual)){
previous = text;
//do what you need..
}
}
Thread.sleep(60000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
它的工作绝对稳定,甚至比使用ContentObserver更好,考虑到很多人都遇到过问题,比如this和其他一些......