Я хотел бы сделать мобильное приложение, чтобы сделать что-то после того, как 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));
}
}
}