Xamarin Forms - SMS BroadcastReceiver в Android не работает

0 Andre Alwy de Souza [2018-09-21 18:15:00]

Кажется, это простая задача, но я не могу этого сделать. Видел кучу учебников и прочее. Может, кто-то может мне помочь. Я начинаю с приложения Xamarin Forms, у которого будет определенная задача для Android (Targeting 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" />

Но я не попадаю в приемник, когда получаю SMS. Просто чтобы проверить, будет ли это вообще работать, я изменил IntentAction на "MY_TEST" и отправил трансляцию из другого приложения, и он смог Toast.

Есть идеи?

sms xamarin.android xamarin.forms broadcastreceiver


1 ответ


0 Решение York Shen - MSFT [2018-09-24 09:08:00]

Xamarin Forms - SMS BroadcastReceiver в Android не работает

Вам не хватает всего в вашем коде.

Запрос разрешений времени выполнения в Android Marshmallow +

Начиная с Android 6.0 (уровень API 23), пользователи предоставляют разрешения для приложений во время работы приложения, а не при установке приложения. Вы должны запрашивать разрешения во время выполнения.

Системные разрешения делятся на две категории: нормальные и опасные:

  • Обычные разрешения напрямую не угрожают конфиденциальности пользователей. Если ваше приложение отображает нормальное разрешение в своем манифесте, система автоматически предоставляет разрешение.
  • Опасные разрешения могут предоставить приложению доступ к конфиденциальным данным пользователя. Если вы укажете опасное разрешение, пользователь должен явно дать разрешение на ваше приложение во время работы приложения.

READ_SMS классифицируется как опасные разрешения, поэтому вы должны проверить эти разрешения вручную для уровня API 23 и выше.

Украсить BroadcastReceiver с BroadcastReceiverAttribute

Более подробную информацию см. В официальном документе: широковещательные приемники в 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();
    }
}