在 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);
}
}
}
}
问题:
- 如何在Xamarin中访问ContenetResolver,当我将此代码转换为C#时,出现有关ContentResolver的错误。
- 同样的问题出现在 Cursor class.
- 在此代码中(在 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");
我在 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);
}
}
}
}
问题:
- 如何在Xamarin中访问ContenetResolver,当我将此代码转换为C#时,出现有关ContentResolver的错误。
- 同样的问题出现在 Cursor class.
- 在此代码中(在 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");