Xamarin Forms Service проверка входящих смс - PullRequest
0 голосов
/ 26 декабря 2018

Я хотел бы создать службу для «запуска» приемника SMS-сообщений Broadcast?Как я могу сделать это в Xamarin Forms (особенно в Android)?

Я изменил следующий код, чтобы решить мой вопрос.Это нативный код Android.
Я называю этот класс с DependendyServices в "Основной активности" основного проекта.

Broadcastreceiver, созданный методом "CheckForIncommingSMS" из "SMSHelper", работает нормально (такжевызывается, когда приложение работает).

using Android.App;
using Android.Content;
using Android.OS;
using Android.Util;
using System;

[assembly: Xamarin.Forms.Dependency(typeof(NAMESPACE.BackgroundServiceHelper))]
namespace NAMESPACE
{
    [Service(Name = "APPNAME.BackgroundService")]
    class BackgroundServiceHelper : Service, IBackgroundServiceHelper
    {

        static readonly string TAG = typeof(BackgroundServiceHelper).FullName;
        static readonly int DELAY_BETWEEN_LOG_MESSAGES = 5000; // milliseconds

        DateTime timestamper;
        bool isStarted;
        Handler handler;
        Action runnable;

        public override void OnCreate()
        {
            base.OnCreate();
            Log.Info(TAG, "OnCreate: the service is initializing.");

            timestamper = new DateTime();
            handler = new Handler();

            runnable = new Action(() =>
            {
                if (timestamper != null)
                {
                    Log.Debug(TAG, DateTime.UtcNow.ToLongDateString());


                    SMSHelper smsh = new SMSHelper();

                    // Method wich registers the SMSReceived BrodcastReceiver
                    smsh.CheckForIncommingSMS();

                    handler.PostDelayed(runnable, DELAY_BETWEEN_LOG_MESSAGES);
                }
            });
        }

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            if (isStarted)
            {
                Log.Info(TAG, "OnStartCommand: This service has already been started.");
            }
            else
            {
                Log.Info(TAG, "OnStartCommand: The service is starting.");
                DispatchNotificationThatServiceIsRunning();
                handler.PostDelayed(runnable, DELAY_BETWEEN_LOG_MESSAGES);
                isStarted = true;
            }

            // This tells Android not to restart the service if it is killed to reclaim resources.
            return StartCommandResult.NotSticky;
        }


        public override IBinder OnBind(Intent intent)
        {
            // Return null because this is a pure started service. A hybrid service would return a binder that would
            return null;
        }


        public override void OnDestroy()
        {
            // We need to shut things down.
            Log.Info(TAG, "OnDestroy: The started service is shutting down.");

            // Stop the handler.
            handler.RemoveCallbacks(runnable);

            //timestamper = null;
            isStarted = false;
            base.OnDestroy();
        }

        void DispatchNotificationThatServiceIsRunning()
        {
        }
    }
}

1 Ответ

0 голосов
/ 27 декабря 2018

создайте этот класс на родном андроиде

 namespace MAMN.Droid.Native
{
[BroadcastReceiver]
[IntentFilter(new string[] { "android.provider.Telephony.SMS_RECEIVED" }, Priority = 
Int32.MaxValue)]


public class MessageBoard : BroadcastReceiver
{
    SmsMessage[] messages;
    public static readonly string INTENT_ACTION = "android.provider.Telephony.SMS_RECEIVED";
    public override void OnReceive(Context context, Intent intent)
    {
        try
        {
            if (intent.Action != INTENT_ACTION) return;
            messages = Telephony.Sms.Intents.GetMessagesFromIntent(intent);          
            ManageSMS();
        }
        catch (Exception) { }
    }


    public void ManageSMS()
    {
        var dd = messages[0].DisplayMessageBody.ToString();

       string msg = new String(dd.Where(Char.IsDigit).ToArray());

        //this is the message center i have subscribe to get the message text in my pc
        MessagingCenter.Send<object, string>(this, "OTP", msg);
    }


   }
 }

, затем в основной деятельности

       MessageBoard SMSReceiver = new MessageBoard();


        var smsFilter = new
        IntentFilter("android.provider.Telephony.SMS_RECEIVED")
        {
            Priority =
        (int)IntentFilterPriority.HighPriority
        };
        RegisterReceiver(SMSReceiver, smsFilter);

также дайте разрешение в явной надежде, что оно поможет вам

...