如何在短信接收的文本视图上输出短信?

问题描述

我已经制作了这个简单的应用程序来接收短信,当我收到一条消息时,我想将其输出到我的 TextView 上,直到现在我才进行测试 在一个按钮内。你收到一条消息,点击按钮,你会在 textview 上收到短信。如果我尝试在没有按钮的情况下执行此操作,则在编译开始时 我得到了一个空引用异常。有人可以帮我解决这个问题吗?

     //----------MainActivity.cs---------------
        
  using Android.App;
 using Android.OS;
 using Android.Support.V7.App;
 using Android.Runtime;
 using Android.Widget;
 using Android.Content;
 using Android.Telephony;
 using Android.Provider;
 using Android.Util;
 using java.lang;
 using System.Text.RegularExpressions;
 using Xamarin.Essentials;
 using System;
 using Android;
 using Android.Support.V4.Content;
 using Android.Content.PM;
 namespace Sms_Receiver2
 {
 [Activity(Label = "@string/app_name",Theme = "@style/AppTheme",MainLauncher = true)]
 public class MainActivity : AppCompatActivity
 {
     public Receiver1 _receiver;            // Receiver class 
     protected override void OnCreate(Bundle savedInstanceState)
     {
         base.OnCreate(savedInstanceState);
         Xamarin.Essentials.Platform.Init(this,savedInstanceState);
         // Set our view from the "main" layout resource
         SetContentView(Resource.Layout.activity_main);
         TextView translatedPhoneWord = FindViewById<TextView>(Resource.Id.TranslatedPhoneword);
         Button translateButton = FindViewById<Button>(Resource.Id.TranslateButton);
         if (ContextCompat.CheckSelfPermission(this,Manifest.Permission.ReadSms) != (int)Permission.Granted)
         {
             RequestPermissions(new string[] { Manifest.Permission.ReadSms,Manifest.Permission.SendSms,Manifest.Permission.ReceiveSms },0);
         }
         translateButton.Click += (s,e) =>
         {};

        translatedPhoneWord.Text = _receiver.message;// null reference   exception
     }
     public override void OnRequestPermissionsResult(int requestCode,string[] permissions,[GeneratedEnum] Android.Content.PM.Permission[] grantResults)
     {
         Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode,permissions,grantResults);
         base.OnRequestPermissionsResult(requestCode,grantResults);
     }
     protected override void OnResume()
     {
         base.OnResume();
         _receiver = new Receiver1();
         IntentFilter filter = new IntentFilter();
         filter.AddAction("android.provider.Telephony.SMS_RECEIVED");
         filter.AddAction("android.provider.Telephony.SMS_DELIVER");
         RegisterReceiver(_receiver,filter);
     }
     protected override void OnPause()
     {
         base.OnPause();
         UnregisterReceiver(_receiver);
     }
     }
     }         
       //---------Reciever.cs -------------


 using Android.App;
 using Android.Content;
 using Android.OS;
 using Android.Runtime;
 using Android.Views;
 using Android.Widget;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using Android.Telephony;
 using Android.Provider;
 namespace Sms_Receiver2
 {
 [broadcastReceiver(Enabled = true,Exported = true,Permission = "android.permission.broADCAST_SMS")]
 [IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED","android.provider.Telephony.SMS_DELIVER" },Priority = (int)IntentFilterPriority.HighPriority)]
 public class Receiver1 : broadcastReceiver
 {
     public string message,address = "";
     public static readonly string INTENT_ACTION = "android.provider.Telephony.SMS_RECEIVED";
     public override void OnReceive(Context context,Intent intent)
     {
         if (intent.HasExtra("pdus"))
         {
             var smsArray = (java.lang.Object[])intent.Extras.Get("pdus");
             foreach (var item in smsArray)
             {
                 var sms = SmsMessage.CreateFromPdu((byte[])item);
                 address = sms.OriginatingAddress;
                 message = sms.MessageBody;
                 Toast.MakeText(context,"Number :" + address + "Message : " + message,ToastLength.Short).Show();
             }
         }
           
         }
     }
     }

解决方法

对代码稍作修改即可

 [Activity(Label = "@string/app_name",Theme = "@style/AppTheme.NoActionBar",MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        private SMSBroadcastReceiver _receiver;
        private TextView _smsTextView; //Textview where list of received sms will show

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.activity_main);

            _smsTextView = FindViewById<TextView>(Resource.Id.smstextview);

            _receiver = new SMSBroadcastReceiver();
            _receiver.SmsActionDelegate = InokeOnNewSMS;
            IntentFilter filter = new IntentFilter();
            filter.AddAction("android.provider.Telephony.SMS_RECEIVED");
            filter.AddAction("android.provider.Telephony.SMS_DELIVER");
            RegisterReceiver(_receiver,filter);
        }

        //this method will be invoked when new sms is received in the broadcast received
        public void InokeOnNewSMS(string address,string message)
        {
            _smsTextView.Text += $"{address} : {message}\n\n";
        }
    }


    [BroadcastReceiver(Enabled = true,Exported = true,Permission = "android.permission.BROADCAST_SMS")]
    [IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED","android.provider.Telephony.SMS_DELIVER" },Priority = (int)IntentFilterPriority.HighPriority)]
    public class SMSBroadcastReceiver : BroadcastReceiver
    {
        public string message = "",address = "";
        public static readonly string INTENT_ACTION = "android.provider.Telephony.SMS_RECEIVED";
        public Action<string,string> SmsActionDelegate;

        public override void OnReceive(Context context,Intent intent)
        {
            if (intent.HasExtra("pdus"))
            {
                var smsArray = (Java.Lang.Object[])intent.Extras.Get("pdus");
                foreach (var item in smsArray)
                {
                    var sms = SmsMessage.CreateFromPdu((byte[])item);
                    address = sms.OriginatingAddress;
                    message = sms.MessageBody;
                    SmsActionDelegate?.Invoke(address,message);
                    Toast.MakeText(context,"Number :" + address + "Message : " + message,ToastLength.Short).Show();
                }
            }

        }
    }