Как получить информацию при отправке SMS? - PullRequest
0 голосов
/ 23 апреля 2019

Я хотел бы получить информацию, когда пользователь получает / отправляет SMS. Для этого я создал класс SmsWatcher.

using AeroMobile.Utility.Helper;
using Android.App;
using Android.Content;
using Android.Provider;

[BroadcastReceiver]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED", "android.intent.action.SENDTO", "android.provider.Telephony.SMS_DELIVER" }, Priority = (int)IntentFilterPriority.HighPriority)]
public class SmsWatcher : BroadcastReceiver
{

public override async void OnReceive(Context context, Intent intent)
{
    if (intent.Action != null)
    {
        if (intent.Action.Equals(Telephony.Sms.Intents.SmsReceivedAction))
        {
            var msgs = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
            foreach (var msg in msgs)
            {
                //incoming message
            }
        }
        if (intent.Action.Equals(Telephony.Sms.Intents.SmsDeliverAction))
        {
            var msgs = Telephony.Sms.Intents.GetMessagesFromIntent(intent);
            foreach (var msg in msgs)
            {
                //outgoing message
            }
        }
    }
}

}

и я регистрирую эту широковещательную службу в MainActivity, как показано ниже:

    //starting SMS watcher service
    var smsWatcherIntent = new Intent(ApplicationContext, typeof(SmsWatcher));
    SendBroadcast(smsWatcherIntent);

Вышеуказанный код отлично работает для входящих сообщений, но не для исходящих сообщений. Не могли бы вы помочь мне получить информацию, когда пользователь отправляет SMS, например информацию, которую я получаю для входящих сообщений?

1 Ответ

1 голос
/ 23 апреля 2019

По вдохновению от этот ответ

Кажется, что не так просто читать исходящие сообщения с BroadcastReceiver. Следовательно, лучший способ читать SMS-сообщения из базы данных Android через курсор.

Ниже приведен фрагмент кода для Xamarin.Android:

    private async Task CheckAndUpdateSms(Context context)
    {
        string lastReadTimeMilliseconds = Application.Current.Properties["LastSmsReadMilliseconds"].ToString();
        ICursor cursor = context.ContentResolver.Query(Telephony.Sms.ContentUri, null, "date > ?", new string[] { lastReadTimeMilliseconds }, null);

        if (cursor != null)
        {
            int totalSMS = cursor.Count;
            if (cursor.MoveToFirst())
            {
                double maxReceivedTimeMilliseconds = 0;

                for (int j = 0; j < totalSMS; j++)
                {
                    double smsReceivedTimeMilliseconds = cursor.GetString(cursor.GetColumnIndexOrThrow(Telephony.TextBasedSmsColumns.Date)).ToProperDouble();
                    string smsReceivedNumber = cursor.GetString(cursor.GetColumnIndexOrThrow(Telephony.TextBasedSmsColumns.Address));
                    int smsType = cursor.GetString(cursor.GetColumnIndexOrThrow(Telephony.TextBasedSmsColumns.Type)).ToProperInt();

                    //you can process this SMS here

                    if (maxReceivedTimeMilliseconds < smsReceivedTimeMilliseconds) maxReceivedTimeMilliseconds = smsReceivedTimeMilliseconds;
                    cursor.MoveToNext();
                }

                //store the last message read date/time stamp to the application property so that the next time, we can read SMS processed after this date and time stamp. 
                if (totalSMS > 0)
                {
                    Application.Current.Properties["LastSmsReadMilliseconds"] = maxReceivedTimeMilliseconds.ToProperString();
                }
            }
            cursor.Close();
        }
    }
...