Xamarin Forms - Android 中的 SMS BroadcastReceiver 无法工作

Xamarin Forms - SMS BroadcastReceiver in Android failing to work

这似乎是一项简单的任务,但我做不到。看到了一堆教程和东西。也许有人可以帮助我。 我从 Xamarin Forms 应用程序开始,它将有一个特定于 Android 的任务(目标 Android 8.0 - Oreo)。 所以为了测试我做了如下(XF 3.2.0.839982)。告诉这个主要是因为它没有 OnResume、OnPause、On....方法...(或者我不知道它们)。

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, Application.IActivityLifecycleCallbacks
    {
        SMSBroadcastReceiver myreceiver;
        IntentFilter intentFilter;

        protected override async void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            var buttonbtnsendmessage = (Button)FindViewById(Resource.Id.sendBroadcast);
            myreceiver = new SMSBroadcastReceiver();
            intentFilter = new IntentFilter(SMSBroadcastReceiver.IntentAction);
            intentFilter.Priority = 1000;
            RegisterReceiver(myreceiver, intentFilter);
    }
}

public class SMSBroadcastReceiver : BroadcastReceiver
    {
        public static string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
        public override void OnReceive(Context context, Intent i)
        {

            if (i.Action != IntentAction)
            {
                return;
            }

            Toast.MakeText(context, "Received broadcast in MyBroadcastReceiver, " +
                                      " value received: " + i.GetStringExtra("key"),
                                      ToastLength.Long).Show();
        }
    }

和清单

<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26" />
<uses-permission android:name="android.permission.SEND_SMS" />
  <uses-permission android:name="android.permission.RECEIVE_SMS" />
  <uses-permission android:name="android.permission.READ_SMS" />
  <uses-permission android:name="android.permission.BROADCAST_SMS" />

但是当我收到短信时,它不会落在我的接收器中。 只是为了检查它是否能正常工作,我将 IntentAction 更改为 "MY_TEST",并从另一个应用程序发送广播,它能够 Toast。

有什么想法吗?

Xamarin Forms - SMS BroadcastReceiver in Android failing to work

您的代码中遗漏了很多内容。

Requesting Runtime Permissions in Android Marshmallow +

从 Android 6.0(API 级别 23)开始,用户在应用 运行 时向应用授予权限,而不是在安装应用时。你应该 request permissions 在运行时。

系统权限分为正常和危险两类:

  • 普通权限不会直接危及用户隐私。如果您的应用在其清单中列出了普通权限,系统会自动授予该权限。
  • 危险权限可以让应用程序访问用户的机密数据。如果您列出危险权限,则用户必须在应用运行期间明确批准您的应用。

READ_SMS 被归类为 Dangerous permissions,因此您应该手动检查 API 23 级及以上的权限。

Adorn BroadcastReceiver with the BroadcastReceiverAttribute

更多详细信息请参考官方文档:Broadcast Receivers in Xamarin.Android

这是一个例子:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
class SMSBroadcastReceiver: BroadcastReceiver
{
    public static string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
    public override void OnReceive(Context context, Intent i)
    {

        if (i.Action != IntentAction)
        {
            return;
        }

        Toast.MakeText(context, "Received broadcast in MyBroadcastReceiver, " +
                                  " value received: " + i.GetStringExtra("key"),
                                  ToastLength.Long).Show();
    }
}