Xamarin Forms - SMS BroadcastReceiver в Android не работает - PullRequest
0 голосов
/ 21 сентября 2018

Это кажется простой задачей, но я не могу это сделать.Видел кучу уроков и прочее.Может быть, кто-то может мне помочь.Я начинаю с приложения 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();
        }
    }

и Manifest

<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» и отправил трансляцию из другого приложения, и она смогла выполнить тост.

Любые идеи?

1 Ответ

0 голосов
/ 24 сентября 2018

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();
    }
}
...