收听传出的短信不起作用android

Posted

技术标签:

【中文标题】收听传出的短信不起作用android【英文标题】:Listening to outgoing sms not working android 【发布时间】:2016-12-22 03:29:36 【问题描述】:

我正在尝试收听传出的短信。我正在关注接受的答案here,但它不起作用。我不确定我哪里出错了。我对内容观察者一点也不熟悉,所以请原谅我的无知。

我想在服务中创建它,这样它就可以一直运行。这是我在该服务中的代码:

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);
        
    

我做错了什么?

【问题讨论】:

【参考方案1】:

除了@CommonsWare 指出的我的愚蠢错误之外,我还错过了

@Override
public void onCreate() 
    super.onCreate();

    ContentResolver contentResolver = this.getContentResolver();
    contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, new SmsObserver(new Handler()));

另一个问题实际上在这两行

contentResolver.registerContentObserver(Uri.parse("content:&‌​#47;/sms/out‌​"),true, new SmsObserver(new Handler()));

Uri uriSMSURI = Uri.parse("content://sms/out");

我将content://sms/out 更改为content://sms,然后继续检查类型以确保我得到的更改实际上是传出消息。我还必须确保检查多个调用,如下所示:

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");
        
     ;

并简单地将private int id = 0; 定义为全局变量

【讨论】:

【参考方案2】:

您的SmsOutgoingObserver 除了将消息记录到 LogCat 之外什么都不做。如果要使用SmsObserver,需要添加一些代码,比如调用registerContentObserver()。这在您链接到的问题上显示在 the accepted answer 中。

【讨论】:

我已经把它放在那里了,我一定是不小心把它擦掉了,没想到我会试一试 @SantiGallego:在onCreate() 中包含该代码应该可以工作。请注意,不必将 SMS 写入该ContentProvider,并且许多用户可能对您尝试让服务连续运行感到非常恼火。谷歌还暗示这种服务将来可能会被淘汰。在 Android 7.0+ 上,您可以使用 JobScheduler 来监控 ContentProvider,而不必让服务连续运行——请参阅监控 ContactsContract 的 this sample app。

以上是关于收听传出的短信不起作用android的主要内容,如果未能解决你的问题,请参考以下文章

发送短信权限不起作用

自动读取 SMS Pin 在数字 android 中不起作用

传出电子邮件在 SharePoint 2019 中不起作用

关于语音识别的 Android 附加功能不起作用

Twilio 传入的短信在 Zoho CRM 中不起作用

Oreo BroadcastReceiver短信收到不起作用