【问题标题】:Catch sent SMS (Android 2.2)捕获发送的短信 (Android 2.2)
【发布时间】:2012-02-11 11:06:30
【问题描述】:

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

我在 Stackoverflow 上搜索了很多内容,并意识到我需要 ContentObserver 来满足我的要求。我使用的是 Service 而不是 Activity,所以我在 Service 类中注册了 ContentObserver,它看起来像这样:

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"/>

我错过了什么?

【问题讨论】:

    标签: android sms contentobserver


    【解决方案1】:

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

    我没有使用 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 和其他一些......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多