Передать значения переменных из Xamarin. Android в Xamarin.Forms - PullRequest
0 голосов
/ 30 марта 2020

Я получаю сообщения в Xamarin. Android и мне нужно передать его в приложение Xamarin.Forms. На данный момент я придумал инъекцию зависимостей. Я определил интерфейс:

public interface IReceived
{
    event OnReceived Received;
}

И его реализация внутри класса IncomingSms, унаследованного от BroadcastReceiver для прослушивания сообщений

[assembly: Dependency(typeof(XxmsApp.Api.IncomingSms))]
namespace XxmsApp.Api
{


    // [BroadcastReceiver(Enabled = true, Exported = true)]

    [BroadcastReceiver(Enabled = true, Label = "SMS Receiver")]
    [IntentFilter(new string [] { Telephony.Sms.Intents.SmsReceivedAction })]           // "android.provider.Telephony.SMS_RECEIVED"
    public class IncomingSms : BroadcastReceiver, IReceived
    {

        public event OnReceived Received;

        public override void OnReceive(Context context, Intent intent)
        {

            if (intent.Action != Telephony.Sms.Intents.SmsReceivedAction) return;

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

            OnMessagesReiceved(messages);

        }

        private void OnMessagesReiceved(SmsMessage[] messages)
        {

            var smsMesages = new List<(string Address, string Message)>();
            var XMessages = new List<XxmsApp.Model.Message>();

            for (var i = 0; i < messages.Length; i++)
            {
                smsMesages.Add((messages[i].OriginatingAddress, messages[i].MessageBody));


                XMessages.Add(new XxmsApp.Model.Message
                {
                    Address = messages[i].OriginatingAddress,
                    Value = messages[i].MessageBody
                });

            }

            Received?.Invoke(XMessages);

        }
    }
}

И я подписался на событие Received

    public App()
    {

        DBUpdates();

        MainPage = (new MasterDetailPage()
        {
            Master = new MenuPage { Title = "Title" },
            Detail = new NavigationPage(new XxmsApp.MainPage()) { BarBackgroundColor = Color.Black }
        });

        xMessages = DependencyService.Get<XxmsApp.Api.IReceived>();
        xMessages.Received += XMessages_Received;//*/

    }

    private void XMessages_Received(IEnumerable<Model.Message> message)
    {
          // ...
    }

Работает без ошибок. Но когда подняли линию Received?.Invoke(XMessages); Получено всегда null. И я не могу поймать событие (момент прихода сообщения) в моем основном приложении Xamarin.Forms

Как это сделать?

1 Ответ

1 голос
/ 31 марта 2020

Согласитесь с Джейсоном, вы можете использовать MessagingCenter для его достижения. Вот код в SmsBroadcastRceiver

    [BroadcastReceiver(Enabled = true, Exported = true)]
    [IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
    public class SmsBroadcastRceiver : BroadcastReceiver
    {

        public SmsBroadcastRceiver()
        {

        }



        public override void OnReceive(Context context, Intent intent)
        {
            var msgs = Telephony.Sms.Intents.GetMessagesFromIntent(intent);

            List<string> msgList = new List<string>();
            foreach (var msg in msgs)
            {
                msgList.Add(msg.DisplayMessageBody);

            }

            MessagingCenter.Send<List<string>>(msgList, "MyMessage");
        }
    }

Вы можете получить сообщение в фоновом коде PCL.

    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            MessagingCenter.Subscribe<List<string>>(this, "MyMessage", (expense) =>
            {
                List<string> mylist= expense as List<string>;
                string allText= "";
                foreach (string item in mylist)
                {
                    allText += item+"  ";
                }
                editorSms.Text = allText;
            });



        }



        private void Button_Clicked(object sender, EventArgs e)
        {
            Xamarin.Forms.DependencyService.Get<ISmsReader>().GetSmsInbox();
        }
    }

Вот мой рабочий гиф.

enter image description here

Вот демонстрационный код кода (Примечание: я не получаю разрешение во время выполнения, вы должны добавить разрешение вручную).

https://github.com/851265601/BroadcastReceSMS

...