实用方法:如何判断短信是否已发送?

9
我可以协助翻译。以下是翻译的内容:

我想知道如何判断设备是否已发送SMS。

为了在接收到SMS时得到通知,我们使用广播器:

android.provider.Telephony.SMS_RECEIVED

重要的是要提到,我不会从我的应用程序发送短信,我只需要在设备发送短信时进行监听。
也许我应该监听一些内容提供者(与短信相关),并对该更改做出反应。有什么想法如何实现这一点?
2个回答

16

是的,使用 ContentObserver 可以监听短信 ContentProvider。

以下是我为发送短信所做的示例:

首先,在 content://sms/ 注册 ContetObserver。

   public class Smssendservice extends Service{

       @Override  
       public void onCreate() {
            SmsContent content = new SmsContent(new Handler());  
            // REGISTER ContetObserver 
            this.getContentResolver().
                registerContentObserver(Uri.parse("content://sms/"), true, SMSObserver);  
       } 

       @Override
       public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub

            return null;
       }

SMSObserver.class

       public class SMSObserver extends ContentObserver {
            private Handler m_handler = null;

            public SMSObserver(SMSLogger handler){
                 super(handler);
                 m_handler = handler;
            }

            @Override
            public void onChange(boolean selfChange) {
            super.onChange(bSelfChange);
            Uri uriSMSURI = Uri.parse("content://sms");

            Cursor cur = this.getContentResolver().query(uriSMSURI, null, null,
                 null, null);
            cur.moveToNext();

            String protocol = cur.getString(cur.getColumnIndex("protocol"));

            if(protocol == null) {
         //the message is sent out just now     
            }               
            else {
                 //the message is received just now   
            }
      }
  }

}

2
在SMSObserver.class类中有一行代码Cursor cur = this.getContentResolver().....。这里的getContentResolver()是与什么相关的?因为Eclipse显示它为错误。 - Jviaches
虽然这个程序运行得很完美,但我想问一下,如果用户发送了一个多部分的消息,它会被计算为1还是有办法检查这种情况? - midhunhk
1
midhunhk,我记得是来自LG的一些东西。现在我无法更具体地描述了,因为几个月已经过去了。但是我可以找到类似以下代码行:cur = context.getContentResolver().query(uri, cursorProjection, null, null, CallLog.Calls.DEFAULT_SORT_ORDER); 我记得其中一个 DEFAULT_SORT_ORDER 修复了一个错误,并被复制到其他 query() 调用中以防万一。 - 18446744073709551615
3
在Android API 16上,我测试了这段代码,观察者没有收到有关content://sms更改的通知,因此该代码根本没有被调用。我检查了logcat控制台,并写下当我发送短信时content://sms和content://sms/queued确实被更新了.. 有什么想法吗? - Alex
1
SmsContent是什么?它不应该是SMSObserver(紧接着定义的类)吗? - Yoav Feuerstein
显示剩余9条评论

0

有一件事情让我想到了使用logcat日志。每次发送/接收短信时,都会有一个特定的条目。只需将您的手机连接到调试模式并进行测试,您就可以观察到特定的条目。

我应该提到这种方法是从您的应用程序中完成的,因此您可以将其整合到您的代码中。

尝试使用this。可能还有其他方法,但这似乎相当容易和可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接