Получение Sms с использованием широковещательного приемника -xamarin

#mono

#моно

Вопрос:

Мой последний вопрос не был отличным вопросом. итак, вот мой новый.

Я хочу написать приложение, которое имеет и activity, которое получает некоторую информацию (например, номер телефона) от пользователя, а затем оно уничтожается, а значок приложения также скрыт от пользователя. но я хочу постоянно получать sms с этого номера телефона и делать кое-что. до сих пор я узнал, что если я зарегистрирую свой широковещательный приемник в манифесте, он все равно может получать, даже если мое приложение не запущено или скрыто. итак, вот мое приложение, которое я использую xamarin (mono android): мое простое действие (оно еще не завершено):

мой основной XML:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:p1="http://schemas.android.com/apk/res/android"
p1:orientation="vertical"
p1:minWidth="25px"
p1:minHeight="25px"
p1:layout_width="match_parent"
p1:layout_height="match_parent"
p1:id="@ id/linearLayout1">
<EditText
    p1:layout_width="match_parent"
    p1:layout_height="wrap_content"
    p1:id="@ id/txt_phone" />
<Button
    p1:text="OK"
    p1:layout_width="match_parent"
    p1:layout_height="wrap_content"
    p1:id="@ id/btn_ok" />
</LinearLayout>
  

и класс activity:

 namespace SmsBroadcastReceiver
{
[Activity (Label = "SmsBroadcastReceiver", MainLauncher = true)]
public class MainActivity : Activity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        SetContentView (Resource.Layout.Main);

        EditText txt_number = FindViewById<EditText> (Resource.Id.txt_phone);
        Button btn_ok = FindViewById<Button> (Resource.Id.btn_ok);
        btn_ok.Click  = delegate {
            //save the number in the sharedpreference and then...
            Toast.MakeText (Context, "Your App Will be Closed now", ToastLength.Short).Show ();
        };
    }
}
}
  

теперь мой широковещательный приемник:

 namespace SmsBroadcastReceiver
{
[BroadcastReceiver]
public class SmsReceiver : BroadcastReceiver
{
    public override void OnReceive (Context context, Intent intent)
    {
        Toast.MakeText (context, "sms rec", ToastLength.Long).Show ();
        //get the sharedpreference and then do stuff
    }
}
}
  

и мой манифест:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"         android:versionCode="1" android:versionName="1.0" package="SmsBroadcastReceiver.SmsBroadcastReceiver">
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="18" />
<application android:label="SmsBroadcastReceiver">

</application>
  <receiver android:name=".SmsReceiver">  
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
 </manifest>
  

Я знаю, что использование toast в BR не идеально, но я просто хочу видеть, что он работает, а это не так, каждый раз, когда я отправляю и отправляю sms на свой телефон, он ничего не показывает.
в чем моя проблема?

Ответ №1:

Я думаю, вы неправильно создали BroadcastReceiver. Вы должны создать его полностью с атрибутами xamarin. Mono для Android преобразует каждое IntentFilterAttribute из них в <intent-filter/> элемент.

 [BroadcastReceiver]
[IntentFilter(new string[] { "android.provider.Telephony.SMS_RECEIVED" })]
public class SmsReceiver : BroadcastReceiver
{
...
}
  

поэтому нет необходимости вручную записывать теги получателя в ваш файл AndroidManifest.

Вы также можете использовать именованные параметры атрибута для приоритета, категорий и т. Д.

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

Комментарии:

1. в конце концов, кто-то. большое вам спасибо, я не знал that.it но как я могу таким образом установить приоритет моего получателя?

2. Спасибо. итак, вы уверены, что при использовании этого способа мой широковещательный rec все еще реагирует и получает sms после того, как я закрыл приложение?

3. что делать, если мне нужно включить широковещательный приемник только тогда, когда ОС установлена на kitkat или новее?