使用 MonoDroid 接收短信
Posted
技术标签:
【中文标题】使用 MonoDroid 接收短信【英文标题】:Receiving SMS with MonoDroid 【发布时间】:2012-12-21 10:14:32 【问题描述】:编辑:现在已解决 - 在此处发布解决方案,以防将来有人需要它,或者任何人都可以提出更好的方法。我从清单中删除了意图内容,并在我的 SmsReceiver 类中设置了 BroadcastReceiver。现在可以了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Android.Telephony;
namespace dummyAndroid
[BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
[IntentFilter(new string[] "android.provider.Telephony.SMS_RECEIVED" )]
public class SmsReceiver : Android.Content.BroadcastReceiver
public static readonly string INTENT_ACTION = "android.provider.Telephony.SMS_RECEIVED";
public override void OnReceive(Context context, Intent intent)
if (intent.Action == INTENT_ACTION)
StringBuilder buffer = new StringBuilder();
Bundle bundle = intent.Extras;
if (bundle != null)
Java.Lang.Object[] pdus = (Java.Lang.Object[])bundle.Get("pdus");
SmsMessage[] msgs;
msgs = new SmsMessage[pdus.Length];
for (int i = 0; i < msgs.Length; i++)
msgs[i] = SmsMessage.CreateFromPdu((byte[])pdus[i]);
Log.Info("SmsReceiver", "SMS Received from: " + msgs[i].OriginatingAddress);
Log.Info("SmsReceiver", "SMS Data: " + msgs[i].MessageBody.ToString());
Log.Info("SmsReceiver", "SMS Received");
我正在编写一个发送/接收 SMS 消息并通过 SMS Mananger 进行发送的应用程序。
我现在正在尝试在 Mono for Android 中接收 SMS,并且是 Android 开发的新手,所以可能做错了什么!
我已将以下内容添加到我的清单中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" package="com.me.dummyAndroid" android:versionCode="1" android:versionName="1">
<uses-sdk android:targetSdkVersion="8" />
<application
android:label="meAndroidSMS"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<receiver android:name=".SmsReceiver">
<intent-filter>
<action android:name=
"android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
</manifest>
然后我创建了一个名为 SmsReceiver.cs 的新类,我已将函数 onReceive 添加到其中,但意图中似乎没有 getExtras 函数,根据我阅读的在线教程,我需要 (http://www.techques.com/question/1-3542320/IPhone-Android-SMS-intercept-and-redirection-to-an-application .).
namespace dummyAndroid
class SmsReceiver
public void onReceive(Context context, Intent intent)
Bundle bundle = intent.getExtras();
我很感激我肯定对 Android 和 MonoDroid 有点不知所措,但也许有人可以为我指明正确的方向!
【问题讨论】:
【参考方案1】:我这里有一些工作代码(我不记得来源,但我认为是与 Xamarin 相关的人编写了此示例),当收到 SMS 时显示 Toast。
using System.Text;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Util;
using Android.Widget;
using Android.Telephony;
using Environment = System.Environment;
namespace MonoDroid.SMSFun
[BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
[IntentFilter(new[] "android.provider.Telephony.SMS_RECEIVED" )]
public class SMSBroadcastReceiver : BroadcastReceiver
private const string Tag = "SMSBroadcastReceiver";
private const string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
public override void OnReceive(Context context, Intent intent)
Log.Info(Tag, "Intent received: " + intent.Action);
if (intent.Action != IntentAction) return;
var bundle = intent.Extras;
if (bundle == null) return;
var pdus = bundle.Get("pdus");
var castedPdus = JNIEnv.GetArray<Java.Lang.Object>(pdus.Handle);
var msgs = new SmsMessage[castedPdus.Length];
var sb = new StringBuilder();
for (var i = 0; i < msgs.Length; i++)
var bytes = new byte[JNIEnv.GetArrayLength(castedPdus[i].Handle)];
JNIEnv.CopyArray(castedPdus[i].Handle, bytes);
msgs[i] = SmsMessage.CreateFromPdu(bytes);
sb.Append(string.Format("SMS From: 01Body: 21", msgs[i].OriginatingAddress,
Environment.NewLine, msgs[i].MessageBody));
Toast.MakeText(context, sb.ToString(), ToastLength.Long).Show();
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="monodroid.smsfun" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:targetSdkVersion="8" />
<application android:label="SMSFun">
</application>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
</manifest>
【讨论】:
谢谢,这比我最终拼凑出来的方式要整洁得多!我将继续基于此重构我的代码。 @Cheesebaron 你能在这里看看我的问题吗,我正在使用你的代码,但是有一个我无法解决的错误***.com/questions/27864321/… @Cheesebaron 我有一个类似的应用程序使用 'android.provider.Telephony.SMS_RECEIVED' 来获取交付状态,但在线var pdus = bundle.Get("pdus");
我得到了 null_Reference 异常,实际上没有 pdus
在捆绑包,我尝试使用pdu
,但这也不起作用,它在下一行遇到强制转换异常。请告诉我我错在哪里,在获取交货状态时,有收件人号码和消息对我来说至关重要。
不确定出了什么问题。距离我上次看这个已经 4 年了。最好的办法是创建一个新的 Stack Overflow 问题,描述您的问题。以上是关于使用 MonoDroid 接收短信的主要内容,如果未能解决你的问题,请参考以下文章