Xamarin Forms - Android 中的 SMS BroadcastReceiver 无法工作
Xamarin Forms - SMS BroadcastReceiver in Android failing to work
这似乎是一项简单的任务,但我做不到。看到了一堆教程和东西。也许有人可以帮助我。
我从 Xamarin Forms 应用程序开始,它将有一个特定于 Android 的任务(目标 Android 8.0 - Oreo)。
所以为了测试我做了如下(XF 3.2.0.839982)。告诉这个主要是因为它没有 OnResume、OnPause、On....方法...(或者我不知道它们)。
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, Application.IActivityLifecycleCallbacks
{
SMSBroadcastReceiver myreceiver;
IntentFilter intentFilter;
protected override async void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
var buttonbtnsendmessage = (Button)FindViewById(Resource.Id.sendBroadcast);
myreceiver = new SMSBroadcastReceiver();
intentFilter = new IntentFilter(SMSBroadcastReceiver.IntentAction);
intentFilter.Priority = 1000;
RegisterReceiver(myreceiver, intentFilter);
}
}
public class SMSBroadcastReceiver : BroadcastReceiver
{
public static string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
public override void OnReceive(Context context, Intent i)
{
if (i.Action != IntentAction)
{
return;
}
Toast.MakeText(context, "Received broadcast in MyBroadcastReceiver, " +
" value received: " + i.GetStringExtra("key"),
ToastLength.Long).Show();
}
}
和清单
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.BROADCAST_SMS" />
但是当我收到短信时,它不会落在我的接收器中。
只是为了检查它是否能正常工作,我将 IntentAction 更改为 "MY_TEST",并从另一个应用程序发送广播,它能够 Toast。
有什么想法吗?
Xamarin Forms - SMS BroadcastReceiver in Android failing to work
您的代码中遗漏了很多内容。
从 Android 6.0(API 级别 23)开始,用户在应用 运行 时向应用授予权限,而不是在安装应用时。你应该 request permissions 在运行时。
系统权限分为正常和危险两类:
- 普通权限不会直接危及用户隐私。如果您的应用在其清单中列出了普通权限,系统会自动授予该权限。
- 危险权限可以让应用程序访问用户的机密数据。如果您列出危险权限,则用户必须在应用运行期间明确批准您的应用。
READ_SMS
被归类为 Dangerous permissions,因此您应该手动检查 API 23 级及以上的权限。
Adorn BroadcastReceiver
with the BroadcastReceiverAttribute
更多详细信息请参考官方文档:Broadcast Receivers in Xamarin.Android
这是一个例子:
[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
class SMSBroadcastReceiver: BroadcastReceiver
{
public static string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
public override void OnReceive(Context context, Intent i)
{
if (i.Action != IntentAction)
{
return;
}
Toast.MakeText(context, "Received broadcast in MyBroadcastReceiver, " +
" value received: " + i.GetStringExtra("key"),
ToastLength.Long).Show();
}
}
这似乎是一项简单的任务,但我做不到。看到了一堆教程和东西。也许有人可以帮助我。 我从 Xamarin Forms 应用程序开始,它将有一个特定于 Android 的任务(目标 Android 8.0 - Oreo)。 所以为了测试我做了如下(XF 3.2.0.839982)。告诉这个主要是因为它没有 OnResume、OnPause、On....方法...(或者我不知道它们)。
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, Application.IActivityLifecycleCallbacks
{
SMSBroadcastReceiver myreceiver;
IntentFilter intentFilter;
protected override async void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
var buttonbtnsendmessage = (Button)FindViewById(Resource.Id.sendBroadcast);
myreceiver = new SMSBroadcastReceiver();
intentFilter = new IntentFilter(SMSBroadcastReceiver.IntentAction);
intentFilter.Priority = 1000;
RegisterReceiver(myreceiver, intentFilter);
}
}
public class SMSBroadcastReceiver : BroadcastReceiver
{
public static string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
public override void OnReceive(Context context, Intent i)
{
if (i.Action != IntentAction)
{
return;
}
Toast.MakeText(context, "Received broadcast in MyBroadcastReceiver, " +
" value received: " + i.GetStringExtra("key"),
ToastLength.Long).Show();
}
}
和清单
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.BROADCAST_SMS" />
但是当我收到短信时,它不会落在我的接收器中。 只是为了检查它是否能正常工作,我将 IntentAction 更改为 "MY_TEST",并从另一个应用程序发送广播,它能够 Toast。
有什么想法吗?
Xamarin Forms - SMS BroadcastReceiver in Android failing to work
您的代码中遗漏了很多内容。
从 Android 6.0(API 级别 23)开始,用户在应用 运行 时向应用授予权限,而不是在安装应用时。你应该 request permissions 在运行时。
系统权限分为正常和危险两类:
- 普通权限不会直接危及用户隐私。如果您的应用在其清单中列出了普通权限,系统会自动授予该权限。
- 危险权限可以让应用程序访问用户的机密数据。如果您列出危险权限,则用户必须在应用运行期间明确批准您的应用。
READ_SMS
被归类为 Dangerous permissions,因此您应该手动检查 API 23 级及以上的权限。
Adorn
BroadcastReceiver
with the BroadcastReceiverAttribute
更多详细信息请参考官方文档:Broadcast Receivers in Xamarin.Android
这是一个例子:
[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { "android.provider.Telephony.SMS_RECEIVED" })]
class SMSBroadcastReceiver: BroadcastReceiver
{
public static string IntentAction = "android.provider.Telephony.SMS_RECEIVED";
public override void OnReceive(Context context, Intent i)
{
if (i.Action != IntentAction)
{
return;
}
Toast.MakeText(context, "Received broadcast in MyBroadcastReceiver, " +
" value received: " + i.GetStringExtra("key"),
ToastLength.Long).Show();
}
}