我想在我的应用中收到短信,但我不希望我的Android显示有关该事件的通知。算法:
收到短信(没关系)
如果这是带有特殊内容格式的短信(对于我的应用) - 使用我的应用处理它并且不显示通知。
如果这是一条简单的消息 - 我不想处理它,所以必须显示通知。
我尝试使用有序广播,但它没有帮助。在某处我读到SMS_RECEIVE的广播没有订购,但我看到了一些应用程序,可以在没有通知的情况下接收短信。
是否有人可以帮助我或向我展示解决此问题的正确方法?
在广播中呼叫abortBroadcast()
无效
答案 0 :(得分:7)
在intent-filter中设置优先级 //在清单
中<intent-filter android:priority="100"> /*your receiver get high priority*/
//在广播接收器中
if (keyword_match)
{
// Stop it being passed to the main Messaging inbox
abortBroadcast();
}
答案 1 :(得分:5)
这应该可以通过注册您的应用程序来接收SMS消息,然后在检测到您的消息到达时使用abortBroadcast()。你说abortBroadcast()不起作用 - 你的短信收发器肯定会处理短信吗?
对于其他想要这样做的人,请继续阅读......
首先,在AndroidManifest.xml中声明SMS接收器,并确保该应用程序有权接收SMS消息。
<receiver android:name="mypackage.SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.RECEIVE_SMS" />
以下是处理SMS消息的一些示例代码:
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle extras = intent.getExtras();
Object[] pdus = (Object[])extras.get("pdus");
for (Object pdu: pdus)
{
SmsMessage msg = SmsMessage.createFromPdu((byte[])pdu);
String origin = msg.getOriginatingAddress();
String body = msg.getMessageBody();
// Parse the SMS body
if (isMySpecialSMS)
{
// Stop it being passed to the main Messaging inbox
abortBroadcast();
}
}
}
}
答案 2 :(得分:1)
你不应该这样做。其他应用可能需要或需要接收SMS_RECEIVED广播。中止它会破坏第三方应用程序的正常运行。这是一种糟糕的编程方式。你应该只中止你创建的广播,而不是系统广播。我不知道为什么Android操作系统允许你这样做。
答案 3 :(得分:0)
不确定我是否确切地知道你想要做什么,但据我所知,你只想知道如何不发送通知?
为什么你不能这样做:
If(instance 2){
//do your processing
}else{
//send notification
}
如果你的意思是想要阻止操作系统播放,那么你可能会因为我不相信你能做到这一点而失去运气
答案 4 :(得分:0)
你需要android:优先级属性才能工作
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
答案 5 :(得分:0)
你犯了一个错误, 因为你解雇了abortBroadcast();如果您的特殊消息所以消息广播中止,因此短信通知不显示,并且短信未保存在收件箱中, 如果收到您的特殊信息,您必须在“onRecive”中制作自己的通知。 例如:
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle extras = intent.getExtras();
Object[] pdus = (Object[])extras.get("pdus");
for (Object pdu: pdus)
{
SmsMessage msg = SmsMessage.createFromPdu((byte[])pdu);
String origin = msg.getOriginatingAddress();
String body = msg.getMessageBody();
// Parse the SMS body
if (isMySpecialSMS)
{ // Stop it being passed to the main Messaging inbox
abortBroadcast();
NotificationManager notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.ic_launcher, "New Message (My Messaging app)", System.currentTimeMillis());
// Uses the default lighting scheme
notification.defaults |= Notification.DEFAULT_LIGHTS;
// Will show lights and make the notification disappear when the presses it
notification.flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_SHOW_LIGHTS;
Intent notificationIntent = new Intent(context, SplashActivity.class);
PendingIntent pendingIntent =PendingIntent.getActivity(context, 0,
new Intent(context, SplashActivity.class), 0);
Log.i("Wakeup", "Display Wakeup");
PowerManager pm = (PowerManager)context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
WakeLock wakeLock = pm.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Phone WakeUp");
wakeLock.acquire();
notification.setLatestEventInfo(context, "My Messaging App(New Message)",msg, pendingIntent);
//notification.sound.
notification.defaults |= Notification.DEFAULT_SOUND;
notificationManager.notify(9999, notification);
}
else{
//Continue Broadcasting to main android app
}
}
}
}
我希望这能解决你的问题