【问题标题】:How to output sms on textview on sms Recieve?如何在短信接收的文本视图上输入短信?
【发布时间】:2021-03-20 04:58:05
【问题描述】:

我已经制作了这个简单的应用程序来接收短信,当我收到一条消息时,我想在我的 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, permissions, 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();
             }
         }
           
         }
     }
     }

【问题讨论】:

  • 谁能帮我解决这个问题???
  • 您正在 OnResume 生命周期方法中创建 Receiver1 _receiver 的实例。这将在 OnCreate 方法之后调用。因此,没有创建 Receiver1 的实例。您正在尝试在创建之前访问 Receiver1 实例。由于你得到空异常。
  • 我已经在我的回答中发布了另一种方法来做到这一点

标签: c# android xamarin


【解决方案1】:

对您的代码稍作修改即可工作

 [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();
                }
            }

        }
    }

【讨论】:

  • 谢谢,效果很好,但无论如何我可以避免将上一条消息与新消息相加?
  • 是的,从这里删除 +(加号)_smsTextView.Text += $"{address} : {message}\n\n";
  • 您也可以使用事件来代替委托。如果那不适合你。然后您可以检查发布者订阅者模式。对于前codewithshadman.com/publish-subscribe-design-pattern-in-csharp
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多