在 xamarin 中获取外发短信

Get outgoing sms in xamarin

我在 Whosebug 中找到了一段用于监控传入和传出短信的代码,但这段代码是在 Java 中编写的。我想在 Xamarin 中将其用作 Android 服务。这是代码:

public class SMSMonitor
{
    private ServiceController mainActivity;
    private ContentResolver contentResolver = null;
    private Handler smshandler = null;
    private ContentObserver smsObserver = null;
    public string smsNumber;
    public static bool thCountStatus = false;
    public static int thIncreCount = 0;
    public bool monitorStatus = false;
    internal string code;
    public static string activationCode;
    internal int smsCount = 0;

    public SMSMonitor(in ServiceController mainActivity, in Context mainContext)
    {
        this.mainActivity = mainActivity;
        contentResolver = mainActivity.ContentResolver();
        smshandler = new SMSHandler(this);
        smsObserver = new SMSObserver(this, smshandler);
    }

    public virtual void startSMSMonitoring()
    {
        try
        {
            monitorStatus = false;
            if (!monitorStatus)
            {
                contentResolver.RegisterContentObserver(Android.Net.Uri.Parse("content://sms"), true, smsObserver);
            }
        }
        catch (Exception e)
        {
            Log.WriteLine(LogPriority.Error,"test", "SMSMonitor :: startSMSMonitoring Exception == " + e.Message);
        }
    }

    public void stopSMSMonitoring()
    {
        try
        {
            monitorStatus = false;
            if (!monitorStatus)
            {
                contentResolver.UnregisterContentObserver(smsObserver);
            }
        }
        catch (Exception e)
        {
            Log.WriteLine(LogPriority.Error,"test", "SMSMonitor :: stopSMSMonitoring Exception == " + e.Message);
        }
    }

    internal class SMSHandler : Handler
    {
        private readonly SMSMonitor outerInstance;

        public SMSHandler(SMSMonitor outerInstance)
        {
            this.outerInstance = outerInstance;
        }
    }

    internal class SMSObserver : ContentObserver
    {
        private readonly SMSMonitor outerInstance;

        internal Handler sms_handle = null;
        public SMSObserver(SMSMonitor outerInstance, in Handler smshandle) : base(smshandle)
        {
            this.outerInstance = outerInstance;
            sms_handle = smshandle;
        }

        public virtual void onChange(in bool bSelfChange)
        {
            base.OnChange(bSelfChange);
            Thread thread = new Thread(() =>
            {
                try
                {
                    outerInstance.monitorStatus = true;
                    Message msg = new Message();
                    sms_handle.sendMessage(msg);
                    Uri uriSMSURI = new Uri("content://sms");
                    Cursor cur = outerInstance.mainActivity.ContentResolver.query(uriSMSURI, null, null, null, "_id");

                    if (cur.Count != outerInstance.smsCount)
                    {
                        outerInstance.smsCount = cur.Count;

                        if (cur != null && cur.Count > 0)
                        {
                            cur.moveToLast();
                            outerInstance.smsNumber = cur.getString(cur.getColumnIndex("address"));
                            if (string.ReferenceEquals(outerInstance.smsNumber, null) || outerInstance.smsNumber.Length <= 0)
                            {
                                outerInstance.smsNumber = "Unknown";
                            }
                            int type = int.Parse(cur.getString(cur.getColumnIndex("type")));
                            string message = cur.getString(cur.getColumnIndex("body"));
                            Log.WriteLine(LogPriority.Error, "test", "SMSMonitor :: SMS type == " + type);
                            Log.WriteLine(LogPriority.Error, "test", "SMSMonitor :: Message Txt == " + message);
                            Log.WriteLine(LogPriority.Error, "test", "SMSMonitor :: Phone Number == " + outerInstance.smsNumber);
                            cur.close();
                            if (type == 1)
                            {
                                onSMSReceive(message, outerInstance.smsNumber);
                            }
                            else
                            {
                                onSMSSend(message, outerInstance.smsNumber);
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    //                  Log("KidSafe","SMSMonitor :: onChange Exception == "+ e.getMessage());
                }
            });
            thread.Start();
        }

        internal virtual void onSMSReceive(in string message, in string number)
        {
            lock (this)
            {
                Log.WriteLine(LogPriority.Error, "test", "In OnSmsReceive");
                Log.WriteLine(LogPriority.Error, "test", "Message" + message);
                Log.WriteLine(LogPriority.Error, "Sample", "Number" + number);
            }
        }

        internal virtual void onSMSSend(in string message, in string number)
        {
            lock (this)
            {
                Log.WriteLine(LogPriority.Error, "test", "In OnSmsSend");
                Log.WriteLine(LogPriority.Error, "test", "Message" + message);
                Log.WriteLine(LogPriority.Error, "Sample", "Number" + number);
            }
        }
    }
}

问题:

  1. 如何在Xamarin中访问ContenetResolver,当我将此代码转换为C#时,出现有关ContentResolver的错误。
  2. 同样的问题出现在 Cursor class.
  3. 在此代码中(在 SMSMonitor class 中)ContentResolver 不是 mainActivity 的一部分!!!

您可以为 MainActivity 定义全局静态变量或将其作为参数传递给 SMSMonitor 构造函数。

全局静态变量:

public class MainActivity : AppCompatActivity
{
    public static MainActivity Instance;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    
         ...
        Instance = this;
       
        
    }

 }

然后在您的 SMSMonitor 中使用:

ContentResolver contentResolver = MainActivity.Instance.ContentResolver;

对于光标:

var cursor =  contentResolver.Query(uriSMSURI, null, null, null, "_id");