Broadcast Receiver для приема SMS не работает - PullRequest
0 голосов
/ 19 октября 2018

Я хотел бы сделать мобильное приложение, чтобы сделать что-то после того, как SMS получат.Я сделал интерфейс «SMS-класса», который определяет все методы.Затем я создал класс в проекте Main Xamarin Forms, который наследуется от интерфейса (таким образом, я не могу пропустить создание любого метода).Затем я создал класс в части Android проекта, который должен читать (и даже больше) SMS при получении.

Я вызвал метод части android с DependencyService из класса в основном проекте.

Для управления поступающими SMS-сообщениями в Android я сделал следующее: я создал метод (в проекте Android - «CheckForIncommingSMS»), чтобы зарегистрировать ведьму BroadcastReceiver, которая должна являться самим вызывающим классом.Упомянутый метод вызывается из MainPage в основном проекте.MainPage => SMSHelper.CheckForIncommingSMS () => Проект Android => регистрация BroadcastReceiver для получения входящего SMS-сообщения с экрана при получении SMS-сообщения.

Кажется, что сам Broadcast Receiver работает.Я проверил это с другими намерениями, и это сработало.

Я обнаружил, что метод OnReceive не вызывается.

Что я сделал не так?

Спасибо!

using System.Collections.Generic;
using App.Models;

namespace App.Services
{
    public interface ISMSHelper
    {
        void CheckForIncommingSMS();
        void Create(string sender, string receiver, string message);
        void Send();
        List<SMS> ReadAll();
        SMS Get();
    }
}


using System.Collections.Generic;
using App.Models;
using Xamarin.Forms;

// Class in Main Xamarin Forms Project

[assembly: Xamarin.Forms.Dependency(typeof(App.Services.SMSHelper))]
namespace App.Services
{
    class SMSHelper : ISMSHelper
    {
        public void CheckForIncommingSMS()
        {
            DependencyService.Get<ISMSHelper>().CheckForIncommingSMS();
        }

        public void Create(string sender, string receiver, string message)
        {
            DependencyService.Get<ISMSHelper>().Create(sender, receiver, message);

        }

        public SMS Get()
        {
            return DependencyService.Get<ISMSHelper>().Get();
        }

        public List<SMS> ReadAll()
        {
            return DependencyService.Get<ISMSHelper>().ReadAll();
        }

        public void Send()
        {
            DependencyService.Get<ISMSHelper>().Send();
        }
    }
}


//Class in Xamarin Forms Project (Android)

using Android.App;
using Android.Content;
using Android.Provider;
using Android.Telephony;
using Android.Util;
using Android.Widget;
using Plugin.Messaging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using App.Models;
using App.Services;
using Xamarin.Forms;

[assembly: Xamarin.Forms.Dependency(typeof(App.Droid.SMSHelper))]
namespace App.Droid
{
    [BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
    [IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
    public class SMSHelper : BroadcastReceiver, ISMSHelper
    {
        private const string Tag = "SMSBroadcastReceiver";
        private const string IntentAction = "android.provider.Telephony.SMS_RECEIVED";

        SMS sms = new SMS();

        public SMSHelper() {
            /* https://blog.xamarin.com/cross-platform-messaging-for-ios-android-and-windows https://forums.xamarin.com/discussion/13682/broadcastreceiver-for-sms*/}

        public void Create(string sender, string receiver, string message)
        {
            sms.Sender = sender;
            sms.Receiver = receiver;
            sms.Message = message;
        }

        public void Send()
        {
            if ((!sms.Receiver.Equals("")) && (!sms.Message.Equals("")))
            {
                var smsMessenger = CrossMessaging.Current.SmsMessenger;

                if (smsMessenger.CanSendSmsInBackground)
                {
                    smsMessenger.SendSmsInBackground(sms.Receiver, sms.Message);
                }
            }
        }

        public SMS Get()
        {
            return sms;
        }

        public List<SMS> ReadAll()
        {
            throw new System.NotImplementedException();
        }

        public override void OnReceive(Context context, Intent intent)
        {
            Log.Info(Tag, "Intent received: " + intent.Action);


            if (intent.Action != IntentAction) return;

            SmsMessage[] messages = Telephony.Sms.Intents.GetMessagesFromIntent(intent);

            for (var i = 0; i < messages.Length; i++)
            {
                sms.Sender = messages[i].OriginatingAddress;
                sms.Message = messages[i].MessageBody;
                sms.Timestamp = DateTime.Now;

                Toast.MakeText(context, sms.Message, ToastLength.Long).Show();
                Debug.WriteLine("SMS ER");
            }

            Toast.MakeText(context, "sdfghhj", ToastLength.Long).Show();
        }

        public void CheckForIncommingSMS()
        {
            Debug.WriteLine("HALLO");
            Forms.Context.RegisterReceiver(this, new IntentFilter(IntentAction));
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...