1

我知道这里有一些与此相关的问题,但没有一个问题能帮助我完成这项工作 - 捕获正在发送的 SMS。我在三星手机上使用 Android 2.2 (FROYO)(如果这很重要的话)。

我在 Stackoverflow 上搜索了很多,并意识到我需要ContentObserver我的请求。我使用的是服务而不是活动,所以我已经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"/>

我错过了什么?

4

1 回答 1

3

幸运的是,我设法解决了这个问题,但使用了完全不同的方法。也许这会在将来帮助某人..

我没有使用 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 更好,考虑到很多人都遇到过问题,像这样和其他一些......

于 2012-01-19T21:25:24.420 回答